Keycloak yordamida Kubernetes-ga ActiveDirectory avtorizatsiyasini mustahkamlaymiz

Ushbu maqola allaqachon ma'lumotni kengaytirish uchun yozilgan mavjud, lekin Microsoft ActiveDirectory bilan to'plamning xususiyatlari haqida gapiradi va uni to'ldiradi.

Ushbu maqolada men sizga qanday o'rnatish va sozlashni aytaman:

  • kalit plash ochiq kodli loyihadir. Bu ilovalar uchun yagona kirish nuqtasini ta'minlaydi. Ko'pgina protokollar, jumladan, bizni qiziqtirgan LDAP va OpenID bilan ishlaydi.
  • kalit plash darvozaboni - Keycloak orqali avtorizatsiyani birlashtirish imkonini beruvchi teskari proksi-ilova.
  • o'tish yo'li - kubectl uchun konfiguratsiyani yaratadigan dastur, uning yordamida siz tizimga kirishingiz va OpenID orqali Kubernetes API-ga ulanishingiz mumkin.

Ruxsatlar Kubernetesda qanday ishlaydi.

Biz RBAC-dan foydalangan holda foydalanuvchi / guruh huquqlarini boshqarishimiz mumkin, bu haqda bir qancha maqolalar allaqachon yaratilgan, men bu haqda batafsil to'xtalmayman. Muammo shundaki, siz RBAC-dan foydalanuvchi huquqlarini cheklash uchun foydalanishingiz mumkin, ammo Kubernetes foydalanuvchilar haqida hech narsa bilmaydi. Ma'lum bo'lishicha, bizga Kubernetes-da foydalanuvchilarni etkazib berish mexanizmi kerak. Buning uchun biz Kuberntes OpenID-ga provayderni qo'shamiz, u bunday foydalanuvchi haqiqatan ham borligini aytadi va Kubernetesning o'zi unga huquqlarni beradi.

o'quv

  • Sizga Kubernetes klasteri yoki minikube kerak bo'ladi
  • Active Directory
  • Domenlar:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Domenlar uchun sertifikat yoki o'z-o'zidan imzolangan sertifikat

O'z-o'zidan imzolangan sertifikatni qanday yaratish haqida to'xtalmayman, siz 2 ta sertifikat yaratishingiz kerak, bu ildiz (sertifikat organi) va *.example.org domeni uchun joker mijoz.

Sertifikatlarni olganingizdan / berganingizdan so'ng, mijoz Kubernetes-ga qo'shilishi kerak, buning uchun biz uning sirini yaratamiz:

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

Keyinchalik, biz uni Ingress boshqaruvchisi uchun ishlatamiz.

Keycloak o'rnatish

Men eng oson yo'li buning uchun tayyor echimlardan, ya'ni rul diagrammalaridan foydalanishga qaror qildim.

Repozitoriyni o'rnating va uni yangilang:

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

Quyidagi tarkibga ega keycloak.yml faylini yarating:

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

Federatsiyani o'rnatish

Keyin veb-interfeysga o'ting keycloak.example.org

Chap burchakda bosing Hudud qo'shing

kalit
qiymati

Ism
kubernetlar

Ko'rsatiladigan ism
Kubernetes

Foydalanuvchi elektron pochta tekshiruvini o'chirish:
Mijoz doiralari -> Elektron pochta -> Xaritachilar -> Elektron pochta tasdiqlangan (O'chirish)

Biz ActiveDirectory'dan foydalanuvchilarni import qilish uchun federatsiyani o'rnatdik, men quyida skrinshotlarni qoldiraman, menimcha, bu aniqroq bo'ladi.

Foydalanuvchi federatsiyasi β€”> Provayder qoβ€˜shish… β€”> ldap

Federatsiyani o'rnatishKeycloak yordamida Kubernetes-ga ActiveDirectory avtorizatsiyasini mustahkamlaymiz
Keycloak yordamida Kubernetes-ga ActiveDirectory avtorizatsiyasini mustahkamlaymiz

Agar hamma narsa yaxshi bo'lsa, tugmani bosgandan keyin Barcha foydalanuvchilarni sinxronlashtiring foydalanuvchilarni muvaffaqiyatli import qilish haqida xabarni ko'rasiz.

Keyin biz guruhlarimizni xaritalashimiz kerak

Foydalanuvchi federatsiyasi --> ldap_localhost --> Xaritachilar --> Yaratish

Mapper yaratishKeycloak yordamida Kubernetes-ga ActiveDirectory avtorizatsiyasini mustahkamlaymiz

Mijozni sozlash

Keycloak nuqtai nazaridan mijozni yaratish kerak, bu undan avtorizatsiya qilinadigan dastur. Skrinshotdagi muhim fikrlarni qizil rang bilan ta'kidlayman.

Mijozlar -> Yaratish

Mijozni sozlashKeycloak yordamida Kubernetes-ga ActiveDirectory avtorizatsiyasini mustahkamlaymiz

Keling, guruhlar uchun skupa yarataylik:

Mijoz doiralari -> Yaratish

Qo'llanish doirasini yaratishKeycloak yordamida Kubernetes-ga ActiveDirectory avtorizatsiyasini mustahkamlaymiz

Va ular uchun xaritachini o'rnating:

Mijoz doiralari -> guruhlar -> Xaritachilar -> Yaratish

XaritachiKeycloak yordamida Kubernetes-ga ActiveDirectory avtorizatsiyasini mustahkamlaymiz

Guruhlarimiz xaritasini standart mijozlar doirasiga qo'shing:

Mijozlar -> kubernetes -> Mijoz doiralari -> Standart mijoz doiralari
Tanlaymiz Guruhlar Π² Mavjud mijozlar doiralaribosing Tanlangan qo'shish

Biz Keycloak-da avtorizatsiya qilish uchun foydalanadigan sirni olamiz (va uni mavzuga yozamiz):

Mijozlar -> kubernetes -> Hisob ma'lumotlari -> Sir
Bu sozlashni yakunlaydi, lekin muvaffaqiyatli avtorizatsiyadan so'ng 403 xatosini olganimda xatolik yuz berdi. Xatolik hisoboti.

Tuzatish:

Mijoz doiralari -> rollar -> Xaritachilar -> Yaratish

XaritachiKeycloak yordamida Kubernetes-ga ActiveDirectory avtorizatsiyasini mustahkamlaymiz

Skript kodi

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

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

Kubernetes sozlanmoqda

Saytdan olingan ildiz sertifikatimiz qayerda va OIDC provayderi qayerda joylashganligini ko'rsatishimiz kerak.
Buning uchun /etc/kubernetes/manifests/kube-apiserver.yaml faylini tahrirlang.

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

Klasterda kubeadm konfiguratsiyasini yangilang:

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

Autx-proksini sozlash

Veb-ilovangizni himoya qilish uchun keycloak gatekeeper-dan foydalanishingiz mumkin. Ushbu teskari proksi-server sahifani ko'rsatishdan oldin foydalanuvchiga ruxsat berishiga qo'shimcha ravishda, u siz haqingizda ma'lumotni sarlavhalardagi oxirgi ilovaga ham uzatadi. Shunday qilib, agar ilovangiz OpenID-ni qo'llab-quvvatlasa, foydalanuvchi darhol avtorizatsiya qilinadi. Kubernetes boshqaruv paneli misolini ko'rib chiqing

Kubernetes boshqaruv panelini o'rnatish


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'

Kirish huquqlarini sozlash:

DataOPS guruhidagi foydalanuvchilar uchun klaster administrator huquqlarini (standart ClusterRole klaster-administratori) beradigan ClusterRoleBinding yarataylik.


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-ni o'rnating:


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"

Shundan so'ng, siz borishga harakat qilganingizda kubernetes-dashboard.example.org, biz Keycloak-ga yo'naltirilamiz va muvaffaqiyatli avtorizatsiya qilingan taqdirda biz allaqachon tizimga kirgan asboblar paneliga o'tamiz.

o'tish yo'lini o'rnatish

Qulaylik uchun siz kubectl uchun konfiguratsiya faylini yaratadigan o'tish joyini qo'shishingiz mumkin, uning yordamida biz foydalanuvchimiz ostida Kubernetesga kiramiz.


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 shunday ko'rinadi. Konfiguratsiya faylini darhol yuklab olish va uni buyruqlar to'plami yordamida yaratish imkonini beradi:

Keycloak yordamida Kubernetes-ga ActiveDirectory avtorizatsiyasini mustahkamlaymiz

Manba: www.habr.com

a Izoh qo'shish