Keycloak istifadə edərək ActiveDirectory icazəsini Kubernetes-ə bağlayırıq

Bu məqalə artıq genişlənmək üçün yazılmışdır mövcud, lakin Microsoft ActiveDirectory ilə paketin xüsusiyyətləri haqqında danışır, həm də onu tamamlayır.

Bu yazıda sizə necə quraşdıracağınızı və konfiqurasiya edəcəyinizi söyləyəcəyəm:

  • açar paltarı açıq mənbəli layihədir. Hansı ki, tətbiqlər üçün tək giriş nöqtəsi təmin edir. Bizi maraqlandıran LDAP və OpenID daxil olmaqla bir çox protokollarla işləyir.
  • açar örtüyü qapıçısı - Keycloak vasitəsilə avtorizasiyanı birləşdirməyə imkan verən əks proxy proqramı.
  • Keçid yolu - OpenID vasitəsilə daxil ola və Kubernetes API-yə qoşula biləcəyiniz kubectl üçün konfiqurasiya yaradan proqram.

İcazələr Kubernetesdə necə işləyir.

RBAC-dan istifadə edərək istifadəçi / qrup hüquqlarını idarə edə bilərik, bu barədə artıq bir dəstə məqalə yaradılıb, mən bu barədə ətraflı danışmayacağam. Problem ondadır ki, siz RBAC-dan istifadəçi hüquqlarını məhdudlaşdırmaq üçün istifadə edə bilərsiniz, lakin Kubernetes istifadəçilər haqqında heç nə bilmir. Belə çıxır ki, bizə Kubernetes-də istifadəçi çatdırma mexanizmi lazımdır. Bunun üçün biz Kuberntes OpenID-ə provayder əlavə edəcəyik ki, bu da belə bir istifadəçinin həqiqətən mövcud olduğunu söyləyəcək və Kubernetes özü ona hüquq verəcək.

Təlim

  • Sizə Kubernetes klasteri və ya minikube lazımdır
  • Active Directory
  • Domenlər:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Domenlər üçün sertifikat və ya özünü imzalayan sertifikat

Öz-özünə imzalanmış sertifikatın necə yaradılması üzərində dayanmayacağam, siz 2 sertifikat yaratmalısınız, bu, *.example.org domeni üçün kök (Sertifikat Təşkilatı) və joker müştəridir.

Sertifikatları aldıqdan / verdikdən sonra müştəri Kubernetes-ə əlavə edilməlidir, bunun üçün biz bunun üçün bir sirr yaradırıq:

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

Sonra, onu Giriş nəzarətçimiz üçün istifadə edəcəyik.

Klaviaturanın quraşdırılması

Qərara gəldim ki, ən asan yol bunun üçün hazır həllərdən, yəni dəbilqə qrafiklərindən istifadə etməkdir.

Anbarı quraşdırın və yeniləyin:

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

Aşağıdakı məzmunlu keycloak.yml faylı yaradın:

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

Federasiyanın qurulması

Sonra, veb interfeysinə keçin keycloak.example.org

Sol küncdə klikləyin Aləm əlavə edin

Aparıcı
Dəyər

ad
kubernetlər

Görünen Ad
Kubernetes

İstifadəçi e-poçtu doğrulamasını deaktiv edin:
Müştəri əhatə dairəsi —> E-poçt —> Xəritəçəkməçilər —> E-poçt təsdiqləndi (Sil)

ActiveDirectory-dən istifadəçiləri idxal etmək üçün federasiya qurduq, ekran görüntülərini aşağıda buraxacağam, məncə daha aydın olacaq.

İstifadəçi federasiyası —> Provayder əlavə et... —> ldap

Federasiyanın qurulmasıKeycloak istifadə edərək ActiveDirectory icazəsini Kubernetes-ə bağlayırıq
Keycloak istifadə edərək ActiveDirectory icazəsini Kubernetes-ə bağlayırıq

Hər şey yaxşıdırsa, düyməni basdıqdan sonra Bütün istifadəçiləri sinxronlaşdırın istifadəçilərin uğurlu idxalı haqqında bir mesaj görəcəksiniz.

Sonra qruplarımızın xəritəsini çəkməliyik

İstifadəçi federasiyası --> ldap_localhost --> Xəritəçəkənlər --> Yaradın

Xəritəçəkənin yaradılmasıKeycloak istifadə edərək ActiveDirectory icazəsini Kubernetes-ə bağlayırıq

Müştəri quraşdırması

Müştəri yaratmaq lazımdır, Keycloak baxımından, bu ondan icazə veriləcək bir tətbiqdir. Ekran görüntüsündə vacib məqamları qırmızı rənglə vurğulayacağam.

Müştərilər -> Yarat

Müştəri quraşdırmasıKeycloak istifadə edərək ActiveDirectory icazəsini Kubernetes-ə bağlayırıq

Gəlin qruplar üçün skupe yaradaq:

Müştəri Əhatələri —> Yarat

Əhatə dairəsi yaradınKeycloak istifadə edərək ActiveDirectory icazəsini Kubernetes-ə bağlayırıq

Və onlar üçün xəritəçi qurun:

Müştəri Əhatələri —> qruplar —> Xəritəçəkənlər —> Yaradın

XəritəçiKeycloak istifadə edərək ActiveDirectory icazəsini Kubernetes-ə bağlayırıq

Qruplarımızın xəritəsini Defolt Müştəri Əhatələrinə əlavə edin:

Müştərilər -> kubernetes -> Müştəri Əhatələri -> Defolt Müştəri Əhatələri
seçmək qrupları в Mövcud Müştəri Əhatələri, basın Seçilmiş əlavə et

Keycloak-da avtorizasiya üçün istifadə edəcəyimiz sirri alırıq (və onu mövzuya yazırıq):

Müştərilər -> kubernetes -> Etibarnamələr -> Gizli
Bununla quraşdırma tamamlanır, lakin uğurlu avtorizasiyadan sonra 403 xətası aldığım zaman xəta baş verdi. Baq hesabatı.

Düzəlt:

Müştəri Əhatələri —> rollar —> Xəritəçəkənlər —> Yaradın

XəritəçiKeycloak istifadə edərək ActiveDirectory icazəsini Kubernetes-ə bağlayırıq

Skript Kodu

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

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

Kubernetes konfiqurasiyası

Saytdan əldə etdiyimiz kök sertifikatın harada olduğunu və OIDC provayderinin harada yerləşdiyini müəyyən etməliyik.
Bunun üçün /etc/kubernetes/manifests/kube-apiserver.yaml faylını redaktə edin.

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
...

Klasterdə kubeadm konfiqurasiyasını yeniləyin:

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 qurulması

Veb tətbiqinizi qorumaq üçün açar örtüyü qapıçısından istifadə edə bilərsiniz. Bu əks proxy-nin səhifəni göstərməzdən əvvəl istifadəçiyə icazə verəcəyinə əlavə olaraq, o, həmçinin başlıqlardakı son tətbiqə sizin haqqınızda məlumat ötürəcək. Beləliklə, əgər tətbiqiniz OpenID-i dəstəkləyirsə, o zaman istifadəçiyə dərhal icazə verilir. Kubernetes Dashboard nümunəsini nəzərdən keçirək

Kubernetes İdarə Panelinin quraşdırılması


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

dəyərlər_dashboard.yaml

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

Giriş hüquqlarını təyin etmək:

Gəlin DataOPS qrupundakı istifadəçilər üçün klaster admin hüquqları (standart ClusterRole cluster-admin) verəcək ClusterRoleBinding yaradaq.


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 quraşdırın:


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

dəyərlər_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"

Bundan sonra getməyə çalışdığınız zaman kubernetes-dashboard.example.org, biz Keycloak-a yönləndiriləcəyik və uğurlu avtorizasiya halında artıq daxil olmuş İdarə Panelinə keçəcəyik.

keçidin quraşdırılması

Rahatlıq üçün kubectl üçün konfiqurasiya faylı yaradacaq bir keçid əlavə edə bilərsiniz, onun köməyi ilə istifadəçimiz altında Kubernetes-ə daxil olacağıq.


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-----

Bu kimi görünür. Konfiqurasiya faylını dərhal yükləməyə və bir sıra əmrlərdən istifadə edərək yaratmağa imkan verir:

Keycloak istifadə edərək ActiveDirectory icazəsini Kubernetes-ə bağlayırıq

Mənbə: www.habr.com

Добавить комментарий