เบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” ActiveDirectory เบเบฑเบš Kubernetes เป‚เบ”เบเปƒเบŠเป‰ Keycloak

เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบตเป‰โ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบฅเบฒเบโ€‹เบฅเบฑเบโ€‹เบญเบฑเบโ€‹เบชเบญเบ™โ€‹เป‚เบ”เบโ€‹เบกเบตโ€‹เบˆเบธเบ”โ€‹เบ›เบฐโ€‹เบชเบปเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ‚เบฐโ€‹เบซเบเบฒเบโ€‹เบ•เบปเบงโ€‹เปเบฅเป‰เบงโ€‹ เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง, เปเบ•เปˆเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบเบฑเบš Microsoft ActiveDirectory, เปเบฅเบฐเบเบฑเบ‡เบ›เบฐเบเบญเบšเบกเบฑเบ™.

เปƒเบ™โ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบตเป‰โ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเบฐโ€‹เบšเบญเบโ€‹เบ—เปˆเบฒเบ™โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ•เบดเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹:

  • เบเบฐเปเบˆ เป€เบ›เบฑเบ™เป‚เบ„เบ‡เบเบฒเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”. เป€เบŠเบดเปˆเบ‡เบชเบฐเบซเบ™เบญเบ‡เบˆเบธเบ”เป€เบ‚เบปเป‰เบฒเบ”เบฝเบงเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบซเบผเบฒเบเป‚เบ›เป‚เบ•เบ„เบญเบ™, เบฅเบงเบกเบ—เบฑเบ‡ LDAP เปเบฅเบฐ OpenID, เป€เบŠเบดเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบปเบ™เปƒเบˆ.
  • เบœเบนเป‰เบฎเบฑเบเบชเบฒเบ›เบฐเบ•เบนเบ„เบต โ€” เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ•เบปเบงเปเบ—เบ™ reverse เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบœเปˆเบฒเบ™ Keycloak.
  • Gangway โ€” เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡ config เบชเปเบฒเบฅเบฑเบš 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 เปƒเบšโ€‹เบขเบฑเป‰เบ‡โ€‹เบขเบทเบ™, เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบฎเบฒเบ (Certification Authority) เปเบฅเบฐโ€‹เบ•เบปเบงโ€‹เปเบ—เบ™โ€‹เบ‚เบญเบ‡โ€‹เบฅเบนเบโ€‹เบ„เป‰เบฒโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เป‚เบ”โ€‹เป€เบกเบ™ *.example.org.

เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบš / เบ‚เบฝเบ™โ€‹เปƒเบšโ€‹เบขเบฑเป‰เบ‡โ€‹เบขเบทเบ™โ€‹เบเบฒเบ™โ€‹, เบ—เปˆเบฒเบ™โ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เป€เบžเบตเปˆเบกโ€‹เปƒเบšโ€‹เบขเบฑเป‰เบ‡โ€‹เบขเบทเบ™โ€‹เบเบฒเบ™โ€‹เบฅเบนเบโ€‹เบ„เป‰เบฒโ€‹เบเบฑเบš Kubernetesโ€‹; เป€เบžเบทเปˆเบญโ€‹เป€เบฎเบฑเบ”โ€‹เบชเบดเปˆเบ‡โ€‹เบ™เบตเป‰โ€‹, เบชเป‰เบฒเบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบฅเบฑเบšโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบกเบฑเบ™โ€‹:

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

เบ•เปเปˆเป„เบ›เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบ„เบงเบšเบ„เบธเบก Ingress เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Keycloak

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบงเบดเบ—เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบเบฒเบ™เปƒเบŠเป‰เบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰, เบ„เบทเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบกเบงเบเบเบฑเบ™เบเบฐเบ—เบปเบš.

เบ•เบดเบ”โ€‹เบ•เบฑเป‰เบ‡ repository เปเบฅเบฐโ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เบกเบฑเบ™โ€‹:

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

Display Name
Kubernetes

เบ›เบดเบ”เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™เบญเบตเป€เบกเบฅเปŒเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰:
เบ‚เบญเบšโ€‹เป€เบ‚เบ”โ€‹เบฅเบนเบโ€‹เบ„เป‰เบฒ โ€”โ€‹> เบญเบตโ€‹เป€เบกเบฅโ€‹เปŒ โ€”โ€‹> Mappers โ€”โ€‹> Email เบเบงเบ”โ€‹เบชเบญเบš (เบฅเบถเบšโ€‹)

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบชเบฐเบซเบฐเบžเบฑเบ™เป€เบžเบทเปˆเบญเบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบœเบนเป‰เปƒเบŠเป‰เบˆเบฒเบ ActiveDirectory, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบญเบญเบเบˆเบฒเบ screenshots เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบกเบฑเบ™เบˆเบฐเบŠเบฑเบ”เป€เบˆเบ™เบเบงเปˆเบฒ.

เบชเบฐเบซเบฐเบžเบฑเบ™เบœเบนเป‰เปƒเบŠเป‰ โ€”> เป€เบžเบตเปˆเบกเบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™โ€ฆ โ€”> ldap

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเบฐเบซเบฐเบžเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” ActiveDirectory เบเบฑเบš Kubernetes เป‚เบ”เบเปƒเบŠเป‰ Keycloak
เบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” ActiveDirectory เบเบฑเบš Kubernetes เป‚เบ”เบเปƒเบŠเป‰ Keycloak

เบ–เป‰เบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ”เบต, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบเบปเบ”เบ›เบธเปˆเบก เบŠเบดเป‰เบ‡เบ‚เปเป‰เบกเบนเบ™เบœเบนเป‰เปƒเบŠเป‰เบ—เบฑเบ‡เปเบปเบ” เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบเบฒเบ™เบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰.

เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบเบธเปˆเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ

เบชเบฐเบซเบฐเบžเบฑเบ™เบœเบนเป‰เปƒเบŠเป‰ -> ldap_localhost -> Mappers -> เบชเป‰เบฒเบ‡

เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” ActiveDirectory เบเบฑเบš Kubernetes เป‚เบ”เบเปƒเบŠเป‰ Keycloak

เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบฅเบนเบโ€‹เบ„เป‰เบฒโ€‹

เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบฅเบนเบเบ„เป‰เบฒ, เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡ Keycloak เบ™เบตเป‰เปเบกเปˆเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบˆเบฒเบเบกเบฑเบ™. เบ‚เป‰เบญเบเบˆเบฐเป€เบ™เบฑเป‰เบ™เบˆเบธเบ”เบชเปเบฒเบ„เบฑเบ™เปƒเบ™เบชเบตเปเบ”เบ‡เปƒเบ™เบซเบ™เป‰เบฒเบˆเป.

เบฅเบนเบเบ„เป‰เบฒ -> เบชเป‰เบฒเบ‡

เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบฅเบนเบโ€‹เบ„เป‰เบฒโ€‹เบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” ActiveDirectory เบเบฑเบš Kubernetes เป‚เบ”เบเปƒเบŠเป‰ Keycloak

เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡ scoupe เบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบก:

เบ‚เบญเบšเป€เบ‚เบ”เบฅเบนเบเบ„เป‰เบฒ -> เบชเป‰เบฒเบ‡

เบเบฒเบ™เบชเป‰เบฒเบ‡เบ‚เบญเบšเป€เบ‚เบ”เบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” ActiveDirectory เบเบฑเบš Kubernetes เป‚เบ”เบเปƒเบŠเป‰ Keycloak

เปเบฅเบฐโ€‹เบ•เบฑเป‰เบ‡โ€‹เปเบœเบ™โ€‹เบ—เบตเปˆโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹:

เบ‚เบญเบšเป€เบ‚เบ”เบฅเบนเบเบ„เป‰เบฒ -> เบเบธเปˆเบก -> Mappers -> เบชเป‰เบฒเบ‡

เปเบœเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” ActiveDirectory เบเบฑเบš Kubernetes เป‚เบ”เบเปƒเบŠเป‰ Keycloak

เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบเบธเปˆเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบชเปˆเบ‚เบญเบšเป€เบ‚เบ”เบฅเบนเบเบ„เป‰เบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™:

เบฅเบนเบเบ„เป‰เบฒ -> kubernetes -> เบ‚เบญเบšเป€เบ‚เบ”เบฅเบนเบเบ„เป‰เบฒ -> เบ‚เบญเบšเป€เบ‚เบ”เบฅเบนเบเบ„เป‰เบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™
เป€เบฅเบทเบญเบ เบเบธเปˆเบก ะฒ เบ‚เบญเบšเป€เบ‚เบ”เบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเบกเบตเบขเบนเปˆ, เบเบปเบ” เป€เบžเบตเปˆเบกเบ—เบตเปˆเป€เบฅเบทเบญเบ

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบฅเบฑเบš (เปเบฅเบฐเบ‚เบฝเบ™เบกเบฑเบ™เบฅเบปเบ‡เบšเปˆเบญเบ™เปƒเบ”เบšเปˆเบญเบ™เบซเบ™เบถเปˆเบ‡) เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบ™ Keycloak:

เบฅเบนเบเบ„เป‰เบฒ -> kubernetes -> เบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบˆเปเบฒเบ•เบปเบง -> เบ„เบงเบฒเบกเบฅเบฑเบš
เบ™เบตเป‰เป€เบฎเบฑเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡, เปเบ•เปˆเบ‚เป‰เบญเบเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบกเบทเปˆเบญ, เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบญเบฐเบ™เบธเบกเบฑเบ”เบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”, เบ‚เป‰เบญเบเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” 403. เบฅเบฒเบเบ‡เบฒเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”.

เปเบเป‰เป„เบ‚:

เบ‚เบญเบšเป€เบ‚เบ”เบฅเบนเบเบ„เป‰เบฒ -> เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ” -> Mappers -> เบชเป‰เบฒเบ‡

เบœเบนเป‰เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” ActiveDirectory เบเบฑเบš Kubernetes เป‚เบ”เบเปƒเบŠเป‰ Keycloak

เบฅเบฐเบซเบฑเบ”เบชเบฐเบ„เบฃเบดเบš

// 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 เปƒเบ™เบเบธเปˆเบก:

kubeadm config

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. เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ•เบปเบงเปเบ—เบ™ reverse เบ™เบตเป‰เบˆเบฐเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบชเบฐเปเบ”เบ‡เบซเบ™เป‰เบฒ, เบกเบฑเบ™เบเบฑเบ‡เบˆเบฐเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเป€เบˆเบปเป‰เบฒเบขเบนเปˆเปƒเบ™เบชเปˆเบงเบ™เบซเบปเบงเป„เบ›เบซเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ OpenID, เบœเบนเป‰เปƒเบŠเป‰เป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เบ—เบฑเบ™เบ—เบต. เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ Kubernetes Dashboard

เบเบณเบฅเบฑเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Kubernetes Dashboard


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'

เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบชเบดเบ”โ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป€เบ–เบดเบ‡โ€‹:

เบกเบฒเบชเป‰เบฒเบ‡ ClusterRoleBinding เบ—เบตเปˆเบˆเบฐเปƒเบซเป‰เบชเบดเบ”เบšเปเบฅเบดเบซเบฒเบ™เบเบธเปˆเบก (เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ ClusterRole cluster-admin) เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เปƒเบ™เบเบธเปˆเบก DataOPS.


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 เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปเบฅเบฐเบ–เป‰เบฒเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ–เบทเบเบ™เปเบฒเป„เบ›เบซเบฒ Dashboard เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเปเบฅเป‰เบง.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Gangway

เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบก gangway เบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ config เบชเปเบฒเบฅเบฑเบš 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-----

เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰. เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เบฒเบงเป‚เบซเบฅเบ”เป„เบŸเบฅเปŒ config เบ—เบฑเบ™เบ—เบตเปเบฅเบฐเบชเป‰เบฒเบ‡เบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰เบŠเบธเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡:

เบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” ActiveDirectory เบเบฑเบš Kubernetes เป‚เบ”เบเปƒเบŠเป‰ Keycloak

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™