НиС Π·Π°ΠΊΡ€Π΅ΠΏΠ²Π°ΠΌΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ActiveDirectory към Kubernetes с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Keycloak

Π’Π°Π·ΠΈ статия Π΅ написана, Π·Π° Π΄Π° Ρ€Π°Π·ΡˆΠΈΡ€ΠΈ Π²Π΅Ρ‡Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈ, Π½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈ Π·Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° с Microsoft ActiveDirectory ΠΈ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π³ΠΎ допълва.

Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Π²ΠΈ ΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ Π΄Π° инсталиратС ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅:

  • ΠΊΠ»ΡŽΡ‡ΠΎΠ΄ΡŠΡ€ΠΆΠ°Ρ‚Π΅Π» Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄. ΠšΠΎΠ΅Ρ‚ΠΎ осигурява Π΅Π΄ΠΈΠ½Π½Π° Π²Ρ…ΠΎΠ΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π° прилоТСния. Π Π°Π±ΠΎΡ‚ΠΈ с ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ LDAP ΠΈ OpenID, ΠΊΠΎΠΈΡ‚ΠΎ Π½ΠΈ интСрСсуват.
  • ΠΊΠ»ΡŽΡ‡ΠΎΠ΄ΡŠΡ€ΠΆΠ°Ρ‚Π΅Π» Π²Ρ€Π°Ρ‚Π°Ρ€ - ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ прокси ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΈ позволява Π΄Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Ρ‚Π΅ оторизация Ρ‡Ρ€Π΅Π· Keycloak.
  • Ρ‰Ρ€Π΅ΠΊ - ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° конфигурация Π·Π° kubectl, с която ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²Π»Π΅Π·Π΅Ρ‚Π΅ ΠΈ Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с Kubernetes API Ρ‡Ρ€Π΅Π· OpenID.

Как работят Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ‚Π° Π² Kubernetes.

МоТСм Π΄Π° управлявамС потрСбитСлски / Π³Ρ€ΡƒΠΏΠΎΠ²ΠΈ ΠΏΡ€Π°Π²Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° RBAC, Π²Π΅Ρ‡Π΅ са създадСни ΠΊΡƒΠΏ статии Π·Π° Ρ‚ΠΎΠ²Π°, няма Π΄Π° сС спирам Π½Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅, Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ RBAC, Π·Π° Π΄Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅ потрСбитСлскитС ΠΏΡ€Π°Π²Π°, Π½ΠΎ Kubernetes Π½Π΅ Π·Π½Π°Π΅ Π½ΠΈΡ‰ΠΎ Π·Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅. Оказва сС, Ρ‡Π΅ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° доставка Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π² Kubernetes. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ²Π°, Ρ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ доставчик към Kuberntes OpenID, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΊΠ°ΠΆΠ΅, Ρ‡Π΅ Ρ‚Π°ΠΊΡŠΠ² ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» наистина ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° ΠΈ самият Kubernetes Ρ‰Π΅ ΠΌΡƒ Π΄Π°Π΄Π΅ ΠΏΡ€Π°Π²Π°Ρ‚Π°.

ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅

  • Π©Π΅ Π²ΠΈ трябва Kubernetes ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ ΠΈΠ»ΠΈ minikube
  • Active Directory
  • Π”ΠΎΠΌΠ΅ΠΉΠ½ΠΈ:
    keycloak.example.org
    kubernetes-dashboard.example.org
    ΠΏΡ€ΠΎΡ…ΠΎΠ΄.example.org
  • Π‘Π΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ Π·Π° Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ ΠΈΠ»ΠΈ самоподписан сСртификат

Няма Π΄Π° сС спирам Π½Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ самоподписан сСртификат, трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ 2 сСртификата, Ρ‚ΠΎΠ²Π° Π΅ основният (сСртифициращ ΠΎΡ€Π³Π°Π½) ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ с замСстващи символи Π·Π° Π΄ΠΎΠΌΠ΅ΠΉΠ½Π° *.example.org

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ / ΠΈΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ сСртификати, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ трябва Π΄Π° бъдС Π΄ΠΎΠ±Π°Π²Π΅Π½ към Kubernetes, Π·Π° Ρ‚ΠΎΠ²Π° Π½ΠΈΠ΅ създавамС Ρ‚Π°ΠΉΠ½Π° Π·Π° Π½Π΅Π³ΠΎ:

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

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° нашия Ingress ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅ Π½Π° Keycloak

Π Π΅ΡˆΠΈΡ…, Ρ‡Π΅ Π½Π°ΠΉ-лСсно Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π³ΠΎΡ‚ΠΎΠ²ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π° Ρ‚ΠΎΠ²Π°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ helm charts.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΠΉΡ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ ΠΈ Π³ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅:

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

Настройка Π½Π° фСдСрациятаНиС Π·Π°ΠΊΡ€Π΅ΠΏΠ²Π°ΠΌΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ActiveDirectory към Kubernetes с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Keycloak
НиС Π·Π°ΠΊΡ€Π΅ΠΏΠ²Π°ΠΌΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ActiveDirectory към Kubernetes с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Keycloak

Ако всичко Π΅ Π½Π°Ρ€Π΅Π΄, слСд натисканС Π½Π° Π±ΡƒΡ‚ΠΎΠ½Π° Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅ всички ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π·Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΡ‚ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° трябва Π΄Π° ΠΊΠ°Ρ€Ρ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ€Π°ΠΌΠ΅ Π½Π°ΡˆΠΈΡ‚Π΅ Π³Ρ€ΡƒΠΏΠΈ

ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡΠΊΠ° фСдСрация --> ldap_localhost --> Mappers --> Create

БъздаванС Π½Π° картографНиС Π·Π°ΠΊΡ€Π΅ΠΏΠ²Π°ΠΌΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ActiveDirectory към Kubernetes с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Keycloak

Настройка Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

НСобходимо Π΅ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Keycloak, Ρ‚ΠΎΠ²Π° Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ бъдС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΎΡ‚ Π½Π΅Π³ΠΎ. Π©Π΅ подчСртая Π²Π°ΠΆΠ½ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² Π΅ΠΊΡ€Π°Π½Π½Π°Ρ‚Π° снимка Π² Ρ‡Π΅Ρ€Π²Π΅Π½ΠΎ.

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΠΈ β€”> БъздаванС

Настройка Π½Π° клиСнтаНиС Π·Π°ΠΊΡ€Π΅ΠΏΠ²Π°ΠΌΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ActiveDirectory към Kubernetes с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Keycloak

НСка създадСм ΠΎΠ±Ρ…Π²Π°Ρ‚ Π·Π° Π³Ρ€ΡƒΠΏΠΈ:

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈ ΠΎΠ±Ρ…Π²Π°Ρ‚ΠΈ β€”> БъздаванС

Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ обхватНиС Π·Π°ΠΊΡ€Π΅ΠΏΠ²Π°ΠΌΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ActiveDirectory към Kubernetes с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Keycloak

И настройтС ΠΊΠ°Ρ€Ρ‚ΠΎΠ³Ρ€Π°Ρ„ Π·Π° тях:

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈ ΠΎΠ±Ρ…Π²Π°Ρ‚ β€”> Π³Ρ€ΡƒΠΏΠΈ β€”> ΠšΠ°Ρ€Ρ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈ β€”> БъздаванС

ΠšΠ°Ρ€Ρ‚ΠΎΠ³Ρ€Π°Ρ„ΠΠΈΠ΅ Π·Π°ΠΊΡ€Π΅ΠΏΠ²Π°ΠΌΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ActiveDirectory към Kubernetes с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Keycloak

Π”ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ ΠΊΠ°Ρ€Ρ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½Π°ΡˆΠΈΡ‚Π΅ Π³Ρ€ΡƒΠΏΠΈ към клиСнтскитС ΠΎΠ±Ρ…Π²Π°Ρ‚ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅:

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΠΈ β€”> kubernetes β€”> ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈ ΠΎΠ±Ρ…Π²Π°Ρ‚ΠΈ β€”> ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈ ΠΎΠ±Ρ…Π²Π°Ρ‚ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅
Π˜Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π³Ρ€ΡƒΠΏΠΈ Π² Налични клиСнтски обхватинатиснСтС ДобавянС Π½Π° ΠΈΠ·Π±Ρ€Π°Π½ΠΈ

ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Ρ‚Π°ΠΉΠ½Π°Ρ‚Π° (ΠΈ я записвамС Π² Π½ΠΈΡˆΠΊΠ°Ρ‚Π°), която Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° оторизация Π² Keycloak:

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΠΈ β€”> kubernetes β€”> Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΈ Π΄Π°Π½Π½ΠΈ β€”> Π’Π°ΠΉΠ½ΠΎ
Π’ΠΎΠ²Π° Π·Π°Π²ΡŠΡ€ΡˆΠ²Π° настройката, Π½ΠΎ ΠΈΠΌΠ°Ρ… Π³Ρ€Π΅ΡˆΠΊΠ°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ слСд ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€Π°Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ… Π³Ρ€Π΅ΡˆΠΊΠ° 403. Π”ΠΎΠΊΠ»Π°Π΄ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ°.

ΠŸΠΎΠΏΡ€Π°Π²ΠΊΠ°:

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈ ΠΎΠ±Ρ…Π²Π°Ρ‚ β€”> Ρ€ΠΎΠ»ΠΈ β€”> ΠšΠ°Ρ€Ρ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈ β€”> БъздаванС

ΠšΠ°Ρ€Ρ‚ΠΎΠ³Ρ€Π°Ρ„ΠΠΈΠ΅ Π·Π°ΠΊΡ€Π΅ΠΏΠ²Π°ΠΌΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° 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 Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°:

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

Настройка Π½Π° прокси Π·Π° удостовСряванС

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ keycloak gatekeeper, Π·Π° Π΄Π° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅ Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ допълнСниС към Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π΅Π½ прокси Ρ‰Π΅ ΡƒΠΏΡŠΠ»Π½ΠΎΠΌΠΎΡ‰ΠΈ потрСбитСля, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ страницата, Ρ‚ΠΎΠΉ ΡΡŠΡ‰ΠΎ Ρ‰Π΅ ΠΏΡ€Π΅Π΄Π°Π΄Π΅ информация Π·Π° вас Π½Π° ΠΊΡ€Π°ΠΉΠ½ΠΎΡ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π·Π°Π³Π»Π°Π²ΠΊΠΈΡ‚Π΅. По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½, Π°ΠΊΠΎ Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° 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 ΠΈ Π² случай Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½Π° авторизация Ρ‰Π΅ стигнСм Π΄ΠΎ Ρ‚Π°Π±Π»ΠΎΡ‚ΠΎ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, Π²Π΅Ρ‡Π΅ Π²Π»Π΅Π·Π»ΠΈ Π² систСмата.

ΠΌΠΎΠ½Ρ‚Π°ΠΆ Π½Π° ΠΏΡŠΡ‚Π΅ΠΊΠ°

Π—Π° удобство ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ Ρ„Π°ΠΉΠ» Π·Π° 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-----

ИзглСТда Ρ‚Π°ΠΊΠ°. Позволява Π²ΠΈ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΡ‚Π΅ конфигурационния Ρ„Π°ΠΉΠ» ΠΈ Π΄Π° Π³ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:

НиС Π·Π°ΠΊΡ€Π΅ΠΏΠ²Π°ΠΌΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ActiveDirectory към Kubernetes с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Keycloak

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€