Keycloak аркылуу Kubernetesке ActiveDirectory авторизациясын бекитебиз

Бул макала буга чейин эле кеңейтүү үчүн жазылган бар, бирок Microsoft ActiveDirectory менен топтомдун өзгөчөлүктөрү жөнүндө сөз кылат, ошондой эле аны толуктайт.

Бул макалада мен кантип орнотууну жана конфигурациялоону айтып берем:

  • клавиатура ачык булак долбоору болуп саналат. Бул тиркемелер үчүн бирдиктүү кирүү пунктун камсыз кылат. Көптөгөн протоколдор менен иштейт, анын ичинде бизди кызыктырган LDAP жана OpenID.
  • ачкыч дарбазачы - Keycloak аркылуу авторизацияны бириктирүүгө мүмкүндүк берген тескери прокси колдонмосу.
  • өтмөк - kubectl үчүн конфигурацияны түзгөн тиркеме, анын жардамы менен сиз кирип, OpenID аркылуу Kubernetes API'ге туташа аласыз.

Kubernetes'те уруксаттар кантип иштейт.

Биз RBAC аркылуу колдонуучунун/топтун укуктарын башкара алабыз, бул жөнүндө бир топ макалалар түзүлгөн, мен бул жөнүндө майда-чүйдөсүнө чейин токтолбойм. Көйгөй сиз RBACти колдонуучу укуктарын чектөө үчүн колдоно аласыз, бирок Kubernetes колдонуучулар жөнүндө эч нерсе билбейт. Көрсө, бизге Kubernetes'те колдонуучу жеткирүү механизми керек. Бул үчүн биз Kuberntes OpenIDге провайдерди кошобуз, ал мындай колдонуучу чындап бар экенин айтат жана Kubernetes өзү ага укуктарды берет.

үйрөтүү

  • Сизге Kubernetes кластери же minikube керек болот
  • Active Directory
  • Домендер:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Домендер үчүн сертификат же өз алдынча кол коюлган сертификат

Мен өз алдынча кол коюлган сертификатты кантип түзүүгө токтолбойм, сиз 2 сертификат түзүшүңүз керек, бул *.example.org доменинин тамыры (Сертификат органы) жана коймо карта кардары.

Сертификаттарды алгандан/бергенден кийин, кардар Kubernetesке кошулушу керек, бул үчүн биз анын сырын түзөбүз:

kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem

Андан кийин, биз аны Ingress контроллерубуз үчүн колдонобуз.

Keycloak орнотуу

Мен эң оңой жолу бул үчүн даяр чечимдерди, тактап айтканда руль диаграммаларын колдонуу деп чечтим.

Репозиторийди орнотуп, жаңыртыңыз:

helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update

Төмөнкү мазмун менен keycloak.yml файлын түзүңүз:

keycloak.yml

keycloak:
  # Имя администратора
  username: "test_admin"
  # Пароль администратор  
  password: "admin"
  # Эти флаги нужны что бы позволить загружать в Keycloak скрипты прямо через web морду. Это нам 
  понадобиться что бы починить один баг, о котором ниже.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled" 
  # Включаем ingress, указываем имя хоста и сертификат который мы предварительно сохранили в secrets
  ingress:
    enabled: true 
    path: /
    annotations:
      kubernetes.io/ingress.class: nginx
      ingress.kubernetes.io/affinity: cookie
    hosts:
      - keycloak.example.org
    tls:
    - hosts:
        - keycloak.example.org
      secretName: tls-keycloak
  # Keycloak для своей работы требует базу данных, в тестовых целях я разворачиваю Postgresql прямо в Kuberntes, в продакшене так лучше не делать!
  persistence:
    deployPostgres: true
    dbVendor: postgres

postgresql:
  postgresUser: keycloak
  postgresPassword: ""
  postgresDatabase: keycloak
  persistence:
    enabled: true

Федерацияны түзүү

Андан кийин, веб-интерфейске өтүңүз keycloak.example.org

Сол бурчта басыңыз Аймак кошуу

ачкыч
маани

ысым
kubernetes

Дисплей аты
Kubernetes

Колдонуучунун электрондук почтасын текшерүүнү өчүрүү:
Кардар чөйрөлөрү —> Электрондук почта —> Картачылар —> Электрондук почта текшерилди (Жок кылуу)

Биз ActiveDirectoryден колдонуучуларды импорттоо үчүн федерация түздүк, скриншотторду төмөндө калтырам, менимче, бул түшүнүктүүрөөк болот.

Колдонуучу федерациясы —> Провайдер кошуу… —> ldap

Федерацияны түзүүKeycloak аркылуу Kubernetesке ActiveDirectory авторизациясын бекитебиз
Keycloak аркылуу Kubernetesке ActiveDirectory авторизациясын бекитебиз

Эгер баары жакшы болсо, анда баскычты басканда Бардык колдонуучуларды синхрондоштуруу сиз колдонуучулардын ийгиликтүү импорту жөнүндө билдирүүнү көрөсүз.

Андан кийин биздин топтордун картасын түзүшүбүз керек

Колдонуучу федерациясы --> ldap_localhost --> Картачылар --> Түзүү

Картачты түзүүKeycloak аркылуу Kubernetesке ActiveDirectory авторизациясын бекитебиз

Кардар орнотуу

Keycloak жагынан кардар түзүү керек, бул андан уруксат берилген тиркеме. Мен кызыл түс менен скриншотто маанилүү пункттарды бөлүп берем.

Кардарлар —> Түзүү

Кардар орнотууKeycloak аркылуу Kubernetesке ActiveDirectory авторизациясын бекитебиз

Келгиле, топтор үчүн скаупа түзөлү:

Кардар чөйрөлөрү —> Түзүү

Аймакты түзүүKeycloak аркылуу Kubernetesке ActiveDirectory авторизациясын бекитебиз

Жана алар үчүн карта түзүүчүнү орнотуңуз:

Кардар чөйрөлөрү —> топтор —> Картачылар —> Түзүү

КартачыKeycloak аркылуу Kubernetesке ActiveDirectory авторизациясын бекитебиз

Биздин топтордун картасын Демейки Client Scopesко кошуңуз:

Кардарлар —> kubernetes —> Клиенттик чөйрөлөр —> Демейки кардар чөйрөлөрү
тандоо топтор в Жеткиликтүү кардар чөйрөлөрүчыкылдатуу Тандалган кошуу

Биз сырды алабыз (жана аны жипке жазабыз), аны Keycloak'та авторизациялоо үчүн колдонобуз:

Кардарлар —> kubernetes —> Каттоо маалыматтары —> Жашыруун
Бул орнотууну аяктайт, бирок ийгиликтүү авторизациядан кийин 403 катасын алганымда ката кетти. Мүчүлүштүк тууралуу кабар.

Оңдоо:

Кардар чөйрөлөрү —> ролдор —> Картачылар —> Түзүү

КартачыKeycloak аркылуу Kubernetesке ActiveDirectory авторизациясын бекитебиз

Скрипт коду

// add current client-id to token audience
token.addAudience(token.getIssuedFor());

// return token issuer as dummy result assigned to iss again
token.getIssuer();

Kubernetes конфигурацияланууда

Биз сайттан биздин түпкү сертификатыбыз кайда экенин жана OIDC провайдери кайда экенин такташыбыз керек.
Бул үчүн /etc/kubernetes/manifests/kube-apiserver.yaml файлын түзөтүңүз

kube-apiserver.yaml


...
spec:
  containers:
  - command:
    - kube-apiserver
...
    - --oidc-ca-file=/var/lib/minikube/certs/My_Root.crt
    - --oidc-client-id=kubernetes
    - --oidc-groups-claim=groups
    - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
    - --oidc-username-claim=email
...

Кластерде kubeadm конфигурациясын жаңыртыңыз:

kubeadmconfig

kubectl edit -n kube-system configmaps kubeadm-config


...
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        oidc-ca-file: /var/lib/minikube/certs/My_Root.crt
        oidc-client-id: kubernetes
        oidc-groups-claim: groups
        oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
        oidc-username-claim: email
...

Auth-proxy орнотуу

Сиз веб тиркемеңизди коргоо үчүн keycloak gatekeeper колдоно аласыз. Бул тескери прокси баракты көрсөтүүдөн мурун колдонуучуга уруксат бергенинен тышкары, ал сиз жөнүндө маалыматты баштардагы акыркы тиркемеге өткөрүп берет. Ошентип, эгер сиздин тиркемеңиз OpenIDди колдосо, анда колдонуучуга дароо уруксат берилет. Kubernetes Dashboard мисалын карап көрөлү

Kubernetes башкаруу тактасын орнотуу


helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

values_dashboard.yaml

enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'

Кирүү укуктарын орнотуу:

Келгиле, DataOPS тобундагы колдонуучулар үчүн кластердин администратор укуктарын (стандартты ClusterRole кластер-администратору) бере турган ClusterRoleBinding түзөлү.


kubectl apply -f rbac.yaml

rbac.yaml


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dataops_group
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: DataOPS

Keycloak дарбазасын орнотуу:


helm repo add gabibbo97 https://gabibbo97.github.io/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml

values_proxy.yaml



# Включаем ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
  path: /
  hosts:
    - kubernetes-dashboard.example.org
  tls:
   - secretName: tls-keycloak
     hosts:
       - kubernetes-dashboard.example.org

# Говорим где мы будем авторизовываться у OIDC провайдера
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
# Имя клиента которого мы создали в Keycloak
ClientID: "kubernetes"
# Secret который я просил записать
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Куда перенаправить в случае успешной авторизации. Формат <SCHEMA>://<SERVICE_NAME>.><NAMESAPCE>.<CLUSTER_NAME>
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
# Пропускаем проверку сертификата, если у нас самоподписанный
skipOpenidProviderTlsVerify: true
# Настройка прав доступа, пускаем на все path если мы в группе DataOPS
rules:
  - "uri=/*|groups=DataOPS"

Андан кийин, барууга аракет кылганда kubernetes-dashboard.example.org, биз Keycloak'ка багытталабыз жана ийгиликтүү авторизацияланган учурда биз мурунтан эле кирген Башкаруу тактасына келебиз.

өтмөк орнотуу

Ыңгайлуу болуу үчүн, сиз kubectl үчүн конфигурация файлын түзө турган өтмөк кошсоңуз болот, анын жардамы менен биз колдонуучубуздун астындагы Kubernetesке киребиз.


helm install --name gangway stable/gangway -f values_gangway.yaml

values_gangway.yaml


gangway:
  # Произвольное имя кластера
  clusterName: "my-k8s"
  # Где у нас OIDC провайдер
  authorizeURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/auth"
  tokenURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/token"
  audience: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/userinfo"
  # Теоритически сюда можно добавить groups которые мы замапили
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Имя клиента
  clientID: "kubernetes"
  # Секрет
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Если оставить дефолтное значние, то за имя пользователя будет братья <b>Frist name</b> <b>Second name</b>, а при "sub" его логин
  usernameClaim: "sub"
  # Доменное имя или IP адресс API сервера
  apiServerURL: "https://192.168.99.111:8443"

# Включаем Ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
  path: /
  hosts:
  - gangway.example.org
  tls:
  - secretName: tls-keycloak
    hosts:
      - gangway.example.org

# Если используем самоподписанный сертификат, то его(открытый корневой сертификат) надо указать.
trustedCACert: |-
 -----BEGIN CERTIFICATE-----
 MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzAwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
 -----END CERTIFICATE-----

Ушундай окшойт. Конфигурация файлын дароо жүктөп алып, аны буйруктардын топтомун колдонуу менен түзүүгө мүмкүндүк берет:

Keycloak аркылуу Kubernetesке ActiveDirectory авторизациясын бекитебиз

Source: www.habr.com

Комментарий кошуу