Keycloak көмегімен Kubernetes-ке ActiveDirectory авторизациясын бекітеміз

Бұл мақала қазірдің өзінде кеңейту үшін жазылған бар, бірақ Microsoft ActiveDirectory пакетінің мүмкіндіктері туралы айтады, сонымен қатар оны толықтырады.

Бұл мақалада мен сізге қалай орнату және конфигурациялау керектігін айтамын:

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

Кубернетесте рұқсаттар қалай жұмыс істейді.

Біз RBAC арқылы пайдаланушы/топ құқықтарын басқара аламыз, бұл туралы көптеген мақалалар жасалған, мен бұл туралы егжей-тегжейлі тоқталмаймын. Мәселе мынада, пайдаланушы құқықтарын шектеу үшін RBAC пайдалана аласыз, бірақ Kubernetes пайдаланушылар туралы ештеңе білмейді. Бізге Kubernetes-те пайдаланушыны жеткізу механизмі қажет екені белгілі болды. Мұны істеу үшін біз Kuberntes OpenID-ке провайдерді қосамыз, ол мұндай пайдаланушы шынымен бар екенін айтады және Кубернетес оған құқықтарды береді.

Дайындау

  • Сізге Kubernetes кластері немесе миникубе қажет болады
  • 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 контроллері үшін қолданамыз.

Пернелерді орнату

Мен бұл үшін дайын шешімдерді, атап айтқанда рульдік диаграммаларды пайдаланудың ең оңай жолы деп шештім.

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

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

Пайдаланушының электрондық поштаны растауын өшіру:
Клиент ауқымдары —> Электрондық пошта —> Мапперлер —> Электрондық пошта тексерілді (Жою)

Біз ActiveDirectory-дан пайдаланушыларды импорттау үшін федерацияны орнаттық, мен төменде скриншоттарды қалдырамын, менің ойымша, бұл түсінікті болады.

Пайдаланушы федерациясы —> Провайдерді қосу... —> ldap

Федерацияны құруKeycloak көмегімен Kubernetes-ке ActiveDirectory авторизациясын бекітеміз
Keycloak көмегімен Kubernetes-ке ActiveDirectory авторизациясын бекітеміз

Егер бәрі жақсы болса, түймені басқаннан кейін Барлық пайдаланушыларды синхрондаңыз пайдаланушылардың сәтті импорты туралы хабарламаны көресіз.

Әрі қарай топтарымызды картаға түсіруіміз керек

Пайдаланушы федерациясы --> ldap_localhost --> Маперлер --> Жасау

Карташы құруKeycloak көмегімен Kubernetes-ке ActiveDirectory авторизациясын бекітеміз

Клиентті орнату

Клиентті жасау керек, Keycloak тұрғысынан, бұл одан рұқсат алатын қосымша. Скриншоттағы маңызды жерлерді қызыл түспен бөлектеймін.

Клиенттер —> Жасау

Клиентті орнатуKeycloak көмегімен Kubernetes-ке ActiveDirectory авторизациясын бекітеміз

Топтар үшін скаупа жасайық:

Клиент аумақтары —> Жасау

Ауқымды құруKeycloak көмегімен Kubernetes-ке ActiveDirectory авторизациясын бекітеміз

Және олар үшін карта жасаушыны орнатыңыз:

Клиент ауқымдары —> топтар —> Карташылар —> Жасау

КарташыKeycloak көмегімен Kubernetes-ке ActiveDirectory авторизациясын бекітеміз

Әдепкі клиент аумақтарына топтарымыздың салыстыруын қосыңыз:

Клиенттер —> 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 орнату

Веб-бағдарламаны қорғау үшін пернетақта қақпасын пайдалануға болады. Бұл кері прокси-сервер бетті көрсетпес бұрын пайдаланушыға рұқсат беретініне қоса, ол сіз туралы ақпаратты тақырыптардағы соңғы қолданбаға да жібереді. Осылайша, егер сіздің қолданбаңыз OpenID қолдаса, пайдаланушыға бірден рұқсат беріледі. Kubernetes бақылау тақтасының мысалын қарастырыңыз

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 gatekeeper орнату:


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 авторизациясын бекітеміз

Ақпарат көзі: www.habr.com

пікір қалдыру