αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž ActiveDirectory αž‘αŸ… Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ Keycloak

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„αž‚αŸ„αž›αž”αŸ†αžŽαž„αž–αž„αŸ’αžšαžΈαž€αžœαž·αžŸαžΆαž›αž—αžΆαž–αžšαž½αž…αž αžΎαž™ αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž–αž·αžŸαŸαžŸαž‡αžΆαž˜αž½αž™ Microsoft ActiveDirectory αž αžΎαž™αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž”αŸ†αž–αŸαž‰αž”αž“αŸ’αžαŸ‚αž˜αžœαžΆαž•αž„αžŠαŸ‚αžšαŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž–αžΈαžšαž”αŸ€αž”αžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ–

  • αžŸαŸ„αžš αž‚αžΊαž‡αžΆαž‚αž˜αŸ’αžšαŸ„αž„αž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αŸ” αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž…αŸ†αžŽαž»αž…αž…αžΌαž›αžαŸ‚αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž–αž·αž’αžΈαž€αžΆαžšαž‡αžΆαž…αŸ’αžšαžΎαž“ αžšαž½αž˜αž‘αžΆαŸ†αž„ LDAP αž“αž·αž„ OpenID αžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž…αŸ†αž–αŸ„αŸ‡αž™αžΎαž„αŸ”
  • αž’αŸ’αž“αž€αž™αžΆαž˜αž‘αŸ’αžœαžΆαžšαžŸαŸ„ - αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αŸ’αžšαžΌαž€αžŸαŸŠαžΈαž”αž‰αŸ’αž…αŸ’αžšαžΆαžŸαžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž›αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαžαžΆαž˜αžšαž™αŸˆ 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 αž“αŸαŸ‡αž‚αžΊαž‡αžΆ root (αž’αžΆαž‡αŸ’αž‰αžΆαž’αžšαžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αŸαžαŸ’αžš) αž“αž·αž„αž’αž€αŸ’αžŸαžšαž‡αŸ†αž“αž½αžŸαžšαž”αžŸαŸ‹αž’αžαž·αžαž·αž‡αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ‚αž“ *.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

αž”αž„αŸ’αž αžΆαž‰αžˆαŸ’αž˜αŸ„αŸ‡
Kubernetes

αž”αž·αž‘αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž’αŸŠαžΈαž˜αŸ‚αž›αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαŸ–
αžœαž·αžŸαžΆαž›αž—αžΆαž–αžšαž”αžŸαŸ‹αž’αžαž·αžαž·αž‡αž“ β€”> αž’αŸŠαžΈαž˜αŸ‚αž› β€”> αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž•αŸ‚αž“αž‘αžΈ β€”> αž’αŸŠαžΈαž˜αŸ‚αž›αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ (αž›αž»αž”)

αž™αžΎαž„αž€αŸ†αž–αž»αž„αž”αž„αŸ’αž€αžΎαžαžŸαž αž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαž“αžΆαŸ†αž…αžΌαž›αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž–αžΈ ActiveDirectory αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž‘αž»αž€αžšαžΌαž”αžαžαž’αŸαž€αŸ’αžšαž„αŸ‹αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αžαŸ’αž‰αž»αŸ†αž‚αž·αžαžαžΆαžœαžΆαž“αžΉαž„αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αŸ”

αžŸαž αž–αŸαž“αŸ’αž’αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ β€”> αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆβ€¦ β€”> ldap

αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αžŸαž αž–αŸαž“αŸ’αž’αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž ActiveDirectory αž‘αŸ… Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ Keycloak
αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž ActiveDirectory αž‘αŸ… Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ Keycloak

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž›αŸ’αž’αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αž»αž…αž”αŸŠαžΌαžαž»αž„ αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰αžŸαžΆαžšαžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž€αžΆαžšαž“αžΆαŸ†αž…αžΌαž›αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž™αžΎαž„αžαŸ’αžšαžΌαžœαž‚αžΌαžŸαž•αŸ‚αž“αž‘αžΈαž€αŸ’αžšαž»αž˜αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αžŸαž αž–αŸαž“αŸ’αž’αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ -> ldap_localhost -> Mappers -> αž”αž„αŸ’αž€αžΎαž

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž•αŸ‚αž“αž‘αžΈαž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž ActiveDirectory αž‘αŸ… Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ Keycloak

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž’αžαž·αžαž·αž‡αž“

αž’αŸ’αž“αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“β€‹αž—αŸ’αž‰αŸ€αžœβ€‹αž€αŸ’αž“αž»αž„β€‹αž›αž€αŸ’αžαžαžŽαŸ’αžŒβ€‹αž“αŸƒ Keycloak αž“αŸαŸ‡β€‹αž‚αžΊβ€‹αž‡αžΆβ€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αžŠαŸ‚αž›β€‹αž“αžΉαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž’αž“αž»αž‰αŸ’αž‰αžΆαžβ€‹αžŠαŸ„αž™β€‹αžœαžΆβ€‹αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž‚αžΌαžŸαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž…αŸ†αžŽαž»αž…αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž‡αžΆαž–αžŽαŸŒαž€αŸ’αžšαž αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αžαžαž’αŸαž€αŸ’αžšαž„αŸ‹αŸ”

αž’αžαž·αžαž·αž‡αž“ -> αž”αž„αŸ’αž€αžΎαž

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž’αžαž·αžαž·αž‡αž“αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž ActiveDirectory αž‘αŸ… Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ Keycloak

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαž scupe αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αŸ–

αžœαž·αžŸαžΆαž›αž—αžΆαž–αž’αžαž·αžαž·αž‡αž“ -> αž”αž„αŸ’αž€αžΎαž

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžœαž·αžŸαžΆαž›αž—αžΆαž–αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž ActiveDirectory αž‘αŸ… Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ Keycloak

αž αžΎαž™αžšαŸ€αž”αž…αŸ†αž•αŸ‚αž“αž‘αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αž‚αŸαŸ–

αžœαž·αžŸαžΆαž›αž—αžΆαž–αž’αžαž·αžαž·αž‡αž“ -> αž€αŸ’αžšαž»αž˜ -> αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž•αŸ‚αž“αž‘αžΈ -> αž”αž„αŸ’αž€αžΎαž

αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž•αŸ‚αž“αž‘αžΈαž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž ActiveDirectory αž‘αŸ… Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ Keycloak

αž™αžΎαž„αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž‚αžΌαžŸαž•αŸ‚αž“αž‘αžΈαž€αŸ’αžšαž»αž˜αžšαž”αžŸαŸ‹αž™αžΎαž„αž‘αŸ…αžœαž·αžŸαžΆαž›αž—αžΆαž–αž’αžαž·αžαž·αž‡αž“αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ–

αž’αžαž·αžαž·αž‡αž“ -> kubernetes -> αžœαž·αžŸαžΆαž›αž—αžΆαž–αž’αžαž·αžαž·αž‡αž“ -> αžœαž·αžŸαžΆαž›αž—αžΆαž–αž’αžαž·αžαž·αž‡αž“αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜
αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ αž€αŸ’αžšαž»αž˜ Π² αžœαž·αžŸαžΆαž›αž—αžΆαž–αž’αžαž·αžαž·αž‡αž“αžŠαŸ‚αž›αž˜αžΆαž“αž…αž»αž… αž”αž“αŸ’αžαŸ‚αž˜αžŠαŸ‚αž›αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ

αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž’αžΆαžαŸŒαž€αŸ†αž”αžΆαŸ†αž„ (αž αžΎαž™αžŸαžšαžŸαŸαžšαžœαžΆαž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆαž˜αž½αž™) αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž“αŸ…αž€αŸ’αž“αž»αž„ KeycloakαŸ–

αž’αžαž·αžαž·αž‡αž“ -> kubernetes -> Credentials -> Secret
αžœαžΆαž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž€αŸ†αž αž»αžŸαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‘αž‘αž½αž›αž€αŸ†αž αž»αžŸ 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

αž™αžΎαž„αžαŸ’αžšαžΌαžœαž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž«αžŸαž‚αž›αŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αž–αžΈαž‚αŸαž αž‘αŸ†αž–αŸαžšαžŸαŸ’αžαž·αžαž“αŸ… αž“αž·αž„αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆ ODC αžŸαŸ’αžαž·αžαž“αŸ…αŸ”
αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž―αž€αžŸαžΆαžš /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

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

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ 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'

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαŸ–

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαž 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

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžŸαŸ„αž‘αŸ’αžœαžΆαžšαž‘αŸ’αžœαžΆαžšαŸ–


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

αžœαžΆαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ” αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž‘αžΆαž‰αž™αž€αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž—αŸ’αž›αžΆαž˜αŸ— αž αžΎαž™αž”αž„αŸ’αž€αžΎαžαžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž ActiveDirectory αž‘αŸ… Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ Keycloak

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹