เช…เชฎเซ‡ เช•เซ€เช•เซเชฒเซ‹เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‡ ActiveDirectory เช…เชงเชฟเช•เซƒเชคเชคเชพ เชœเซ‹เชกเซ€เช เช›เซ€เช

เช† เชฒเซ‡เช– เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡, เชชเชฐเช‚เชคเซ Microsoft ActiveDirectory เชธเชพเชฅเซ‡ เชฌเช‚เชกเชฒเชจเซ€ เชตเชฟเชถเซ‡เชทเชคเชพเช“ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชชเซ‚เชฐเช• เชชเชฃ เชฌเชจเชพเชตเซ‡ เช›เซ‡.

เช† เชฒเซ‡เช–เชฎเชพเช‚ เชนเซเช‚ เชคเชฎเชจเซ‡ เช•เชนเซ€เชถ เช•เซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เช—เซ‹เช เชตเชตเซเช‚:

  • เช•เซ€เช•เซเชฒเซ‹เช• เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช›เซ‡. เชœเซ‡ เช…เชฐเชœเซ€เช“ เชฎเชพเชŸเซ‡ เชธเชฟเช‚เช—เชฒ เชชเซ‹เชˆเชจเซเชŸ เช“เชซ เชเชจเซเชŸเซเชฐเซ€ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. LDAP เช…เชจเซ‡ OpenID เชธเชนเชฟเชค เช˜เชฃเชพ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เช…เชฎเชจเซ‡ เชฐเชธ เช›เซ‡.
  • เช•เซ€เช•เซเชฒเซ‹เช• เช—เซ‡เชŸเช•เซ€เชชเชฐ - เชฐเชฟเชตเชฐเซเชธ เชชเซเชฐเซ‹เช•เซเชธเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชœเซ‡ เชคเชฎเชจเซ‡ เช•เซ€เช•เซเชฒเซ‹เช• เชฆเซเชตเชพเชฐเชพ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชธเช‚เช•เชฒเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.
  • เช—เซ‡เช‚เช—เชตเซ‡ - เชเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช•เซ‡ เชœเซ‡ kubectl เชฎเชพเชŸเซ‡ เชเช• เชฐเซ‚เชชเชฐเซ‡เช–เชพ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชคเชฎเซ‡ เชฒเซ‹เช— เช‡เชจ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ OpenID เชฆเซเชตเชพเชฐเชพ Kubernetes API เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เชชเชฐเชตเชพเชจเช—เซ€เช“ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡.

เช…เชฎเซ‡ RBAC เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ / เชœเซ‚เชฅ เช…เชงเชฟเช•เชพเชฐเซ‹เชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช, เช† เชตเชฟเชถเซ‡ เชฒเซ‡เช–เซ‹เชจเซ‹ เชธเชฎเซ‚เชน เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡, เชนเซเช‚ เช†เชจเชพ เชชเชฐ เชตเชฟเช—เชคเชตเชพเชฐ เชงเซเชฏเชพเชจ เช†เชชเซ€เชถ เชจเชนเซ€เช‚. เชธเชฎเชธเซเชฏเชพ เช เช›เซ‡ เช•เซ‡ เชคเชฎเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช…เชงเชฟเช•เชพเชฐเซ‹เชจเซ‡ เชชเซเชฐเชคเชฟเชฌเช‚เชงเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ RBAC เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชชเชฐเช‚เชคเซ Kubernetes เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชตเชฟเชถเซ‡ เช•เช‚เชˆเชชเชฃ เชœเชพเชฃเชคเชพ เชจเชฅเซ€. เชคเซ‡ เชคเชพเชฐเชฃ เช†เชชเซ‡ เช›เซ‡ เช•เซ‡ เช…เชฎเชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ Kuberntes OpenID เชฎเชพเช‚ เชเช• เชชเซเชฐเชฆเชพเชคเชพ เช‰เชฎเซ‡เชฐเซ€เชถเซเช‚, เชœเซ‡ เช•เชนเซ‡เชถเซ‡ เช•เซ‡ เช†เชตเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช–เชฐเซ‡เช–เชฐ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡, เช…เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเซ‹เชคเซ‡ เชœ เชคเซ‡เชจเซ‡ เช…เชงเชฟเช•เชพเชฐเซ‹ เช†เชชเชถเซ‡.

เชคเชพเชฒเซ€เชฎ

  • เชคเชฎเชพเชฐเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐ เช…เชฅเชตเชพ เชฎเชฟเชจเซ€เช•เซเชฏเซเชฌเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡
  • เชธเช•เซเชฐเชฟเชฏ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชจ
  • เชกเซ‹เชฎเซ‡เชจเซเชธ:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • เชกเซ‹เชฎเซ‡เชจเซเชธ เชฎเชพเชŸเซ‡เชจเซเช‚ เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐ เช…เชฅเชตเชพ เชธเซเชต-เชนเชธเซเชคเชพเช•เซเชทเชฐเชฟเชค เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐ

เชนเซเช‚ เชธเซเชต-เชนเชธเซเชคเชพเช•เซเชทเชฐเชฟเชค เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซเช‚ เชคเซ‡เชจเชพ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเซ€เชถ เชจเชนเซ€เช‚, เชคเชฎเชพเชฐเซ‡ 2 เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐเซ‹ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช† *.example.org เชกเซ‹เชฎเซ‡เชจ เชฎเชพเชŸเซ‡ เชฐเซเชŸ (เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐ เช…เชงเชฟเช•เชพเชฐเซ€) เช…เชจเซ‡ เชตเชพเช‡เชฒเซเชกเช•เชพเชฐเซเชก เช•เซเชฒเชพเชฏเช‚เชŸ เช›เซ‡

เชคเชฎเซ‡ เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐเซ‹ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€ / เชœเชพเชฐเซ€ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช•เซเชฒเชพเชฏเช‚เชŸเชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡, เช† เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชเช• เชฐเชนเชธเซเชฏ เชฌเชจเชพเชตเซ€เช เช›เซ€เช:

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

เช†เช—เชณ, เช…เชฎเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช…เชฎเชพเชฐเชพ เชชเซเชฐเชตเซ‡เชถ เชจเชฟเชฏเช‚เชคเซเชฐเช• เชฎเชพเชŸเซ‡ เช•เชฐเซ€เชถเซเช‚.

เช•เซ€เช•เซเชฒเซ‹เช• เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ

เชฎเซ‡เช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช•เซ‡ เช† เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ‹ เชธเซŒเชฅเซ€ เชธเชนเซ‡เชฒเซ‹ เชฐเชธเซเชคเซ‹ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡ เชธเซเช•เชพเชจ เชšเชพเชฐเซเชŸ.

เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ‹:

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

เชกเชพเชฌเชพ เช–เซ‚เชฃเชพเชฎเชพเช‚ เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เช•เซเชทเซ‡เชคเซเชฐ เช‰เชฎเซ‡เชฐเซ‹

เช•เซ€
เชญเชพเชต

เชจเชพเชฎ
เช•เซเชฌเซ‡เชฐเชจเซ‡เชŸเซเชธ

เชกเชฟเชธเซเชชเซเชฒเซ‡ เชจเชพเชฎ
เช•เซเชฏเซเชฌเชฐเซเชจเซ‡เชŸเชฟเชธ

เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช‡เชฎเซ‡เช‡เชฒ เชšเช•เชพเชธเชฃเซ€ เช…เช•เซเชทเชฎ เช•เชฐเซ‹:
เช•เซเชฒเชพเชˆเชจเซเชŸ เชธเซเช•เซ‹เชชเซเชธ โ€”> เชˆเชฎเซ‡เชฒ โ€”> เชฎเซ‡เชชเชฐเซเชธ โ€”> เชˆเชฎเซ‡เชˆเชฒ เชตเซ‡เชฐเชฟเชซเชพเชˆเชก (เช•เชพเชขเซ€ เชจเชพเช–เซ‹)

เช…เชฎเซ‡ ActiveDirectory เชฎเชพเช‚เชฅเซ€ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ‡ เช†เชฏเชพเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชซเซ‡เชกเชฐเซ‡เชถเชจ เชธเซ‡เชŸ เช•เชฐเซเชฏเซเช‚ เช›เซ‡, เชนเซเช‚ เชจเซ€เชšเซ‡ เชธเซเช•เซเชฐเซ€เชจเชถเซ‰เชŸเซเชธ เชฎเซ‚เช•เซ€เชถ, เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เชตเชงเซ เชธเซเชชเชทเซเชŸ เชฅเชถเซ‡.

เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเช‚เช˜ โ€”> เชชเซเชฐเชฆเชพเชคเชพ เช‰เชฎเซ‡เชฐเซ‹โ€ฆ โ€”> ldap

เชซเซ‡เชกเชฐเซ‡เชถเชจ เชธเซ‡เชŸเช…เชชเช…เชฎเซ‡ เช•เซ€เช•เซเชฒเซ‹เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‡ ActiveDirectory เช…เชงเชฟเช•เซƒเชคเชคเชพ เชœเซ‹เชกเซ€เช เช›เซ€เช
เช…เชฎเซ‡ เช•เซ€เช•เซเชฒเซ‹เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‡ ActiveDirectory เช…เชงเชฟเช•เซƒเชคเชคเชพ เชœเซ‹เชกเซ€เช เช›เซ€เช

เชœเซ‹ เชฌเชงเซเช‚ เชฌเชฐเชพเชฌเชฐ เช›เซ‡, เชคเซ‹ เชชเช›เซ€ เชฌเชŸเชจ เชฆเชฌเชพเชตเซเชฏเชพ เชชเช›เซ€ เชฌเชงเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ‡ เชธเชฟเช‚เช•เซเชฐเชจเชพเช‡เช เช•เชฐเซ‹ เชคเชฎเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ€ เชธเชซเชณ เช†เชฏเชพเชค เชตเชฟเชถเซ‡ เชธเช‚เชฆเซ‡เชถ เชœเซ‹เชถเซ‹.

เช†เช—เชณ เช†เชชเชฃเซ‡ เช†เชชเชฃเชพ เชœเซ‚เชฅเซ‹เชจเซ‡ เชฎเซ‡เชช เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡

เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชซเซ‡เชกเชฐเซ‡เชถเชจ --> ldap_localhost --> เชฎเซ‡เชชเชฐเซเชธ --> เชฌเชจเชพเชตเซ‹

เชฎเซ‡เชชเชฐ เชฌเชจเชพเชตเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เชเช…เชฎเซ‡ เช•เซ€เช•เซเชฒเซ‹เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‡ ActiveDirectory เช…เชงเชฟเช•เซƒเชคเชคเชพ เชœเซ‹เชกเซ€เช เช›เซ€เช

เช•เซเชฒเชพเชฏเช‚เชŸ เชธเซ‡เชŸเช…เชช

เช•เซเชฒเชพเชฏเช‚เชŸ เชฌเชจเชพเชตเชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡, เช•เซ€เช•เซเชฒเซ‹เช•เชจเซ€ เชฆเซเชฐเชทเซเชŸเชฟเช, เช† เชเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช›เซ‡ เชœเซ‡ เชคเซ‡เชจเซ€ เชชเชพเชธเซ‡เชฅเซ€ เช…เชงเชฟเช•เซƒเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชนเซเช‚ เชธเซเช•เซเชฐเซ€เชจเชถเซ‹เชŸเชฎเชพเช‚ เชฎเชนเชคเซเชตเชจเชพ เชฎเซเชฆเซเชฆเชพเช“เชจเซ‡ เชฒเชพเชฒ เชฐเช‚เช—เชฎเชพเช‚ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€เชถ.

เช—เซเชฐเชพเชนเช•เซ‹ -> เชฌเชจเชพเชตเซ‹

เช•เซเชฒเชพเชฏเช‚เชŸ เชธเซ‡เชŸเช…เชชเช…เชฎเซ‡ เช•เซ€เช•เซเชฒเซ‹เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‡ ActiveDirectory เช…เชงเชฟเช•เซƒเชคเชคเชพ เชœเซ‹เชกเซ€เช เช›เซ€เช

เชšเชพเชฒเซ‹ เชœเซ‚เชฅเซ‹ เชฎเชพเชŸเซ‡ เชธเซเช•เซ‚เชช เชฌเชจเชพเชตเซ€เช:

เช•เซเชฒเชพเชฏเชจเซเชŸ เชธเซเช•เซ‹เชชเซเชธ โ€”> เชฌเชจเชพเชตเซ‹

เช…เชตเช•เชพเชถ เชฌเชจเชพเชตเซ‹เช…เชฎเซ‡ เช•เซ€เช•เซเชฒเซ‹เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‡ ActiveDirectory เช…เชงเชฟเช•เซƒเชคเชคเชพ เชœเซ‹เชกเซ€เช เช›เซ€เช

เช…เชจเซ‡ เชคเซ‡เชฎเชจเชพ เชฎเชพเชŸเซ‡ เชฎเซ‡เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ‹:

เช•เซเชฒเชพเชˆเชจเซเชŸ เชธเซเช•เซ‹เชชเซเชธ โ€”> เชœเซ‚เชฅเซ‹ โ€”> เชฎเซ‡เชชเชฐเซเชธ โ€”> เชฌเชจเชพเชตเซ‹

เชฎเซ‡เชชเชฐเช…เชฎเซ‡ เช•เซ€เช•เซเชฒเซ‹เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‡ ActiveDirectory เช…เชงเชฟเช•เซƒเชคเชคเชพ เชœเซ‹เชกเซ€เช เช›เซ€เช

เชกเชฟเชซเซ‹เชฒเซเชŸ เช•เซเชฒเชพเชฏเชจเซเชŸ เชธเซเช•เซ‹เชชเซเชธเชฎเชพเช‚ เช…เชฎเชพเชฐเชพ เชœเซ‚เชฅเซ‹เชจเชพ เชฎเซ‡เชชเชฟเช‚เช— เช‰เชฎเซ‡เชฐเซ‹:

เช•เซเชฒเชพเชˆเชจเซเชŸเซเชธ โ€”> เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ โ€”> เช•เซเชฒเชพเชˆเชจเซเชŸ เชธเซเช•เซ‹เชชเซเชธ โ€”> เชกเชฟเชซเซ‹เชฒเซเชŸ เช•เซเชฒเชพเชˆเชจเซเชŸ เชธเซเช•เซ‹เชชเซเชธ
เชชเชธเช‚เชฆ เช•เชฐเซ‹ เชœเซ‚เชฅเซ‹ ะฒ เช‰เชชเชฒเชฌเซเชง เช•เซเชฒเชพเชฏเชจเซเชŸ เชธเซเช•เซ‹เชชเซเชธเช•เซเชฒเชฟเช• เช•เชฐเซ‹ เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒ เช‰เชฎเซ‡เชฐเซ‹

เช…เชฎเซ‡ เชฐเชนเชธเซเชฏ เชฎเซ‡เชณเชตเซ€เช เช›เซ€เช (เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฅเซเชฐเซ‡เชก เชชเชฐ เชฒเช–เซ€เช เช›เซ€เช) เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช…เชฎเซ‡ เช•เซ€เช•เซเชฒเซ‹เช•เชฎเชพเช‚ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซ€เชถเซเช‚:

เช•เซเชฒเชพเชˆเชจเซเชŸเซเชธ โ€”> kubernetes โ€”> เช“เชณเช–เชชเชคเซเชฐ โ€”> เช—เซเชชเซเชค
เช† เชธเซ‡เชŸเช…เชช เชชเซ‚เชฐเซเชฃ เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชœเซเชฏเชพเชฐเซ‡ เชธเชซเชณ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชชเช›เซ€, เชฎเชจเซ‡ เชญเซ‚เชฒ 403 เชชเซเชฐเชพเชชเซเชค เชฅเชˆ เชคเซเชฏเชพเชฐเซ‡ เชฎเชจเซ‡ เชเช• เชญเซ‚เชฒ เช†เชตเซ€. เช•เซเชทเชคเชฟ เช…เชนเซ‡เชตเชพเชฒ.

เช เซ€เช• เช•เชฐเซ‹:

เช•เซเชฒเชพเชฏเชจเซเชŸ เชธเซเช•เซ‹เชชเซเชธ โ€”> เชญเซ‚เชฎเชฟเช•เชพเช“ โ€”> เชฎเซ‡เชชเชฐเซเชธ โ€”> เชฌเชจเชพเชตเซ‹

เชฎเซ‡เชชเชฐเช…เชฎเซ‡ เช•เซ€เช•เซเชฒเซ‹เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‡ ActiveDirectory เช…เชงเชฟเช•เซƒเชคเชคเชพ เชœเซ‹เชกเซ€เช เช›เซ€เช

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช•เซ‹เชก

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

เช“เชฅ-เชชเซเชฐเซ‹เช•เซเชธเซ€ เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชคเชฎเซ‡ เชคเชฎเชพเชฐเซ€ เชตเซ‡เชฌ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเชพเช–เชตเชพ เชฎเชพเชŸเซ‡ เช•เซ€เช•เซเชฒเซ‹เช• เช—เซ‡เชŸเช•เซ€เชชเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชนเช•เซ€เช•เชค เช เช›เซ‡ เช•เซ‡ เช† เชฐเชฟเชตเชฐเซเชธ เชชเซเชฐเซ‹เช•เซเชธเซ€ เชชเซƒเชทเซเช เชจเซ‡ เชฌเชคเชพเชตเชคเชพ เชชเชนเซ‡เชฒเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เช…เชงเชฟเช•เซƒเชค เช•เชฐเชถเซ‡ เชคเซ‡ เช‰เชชเชฐเชพเช‚เชค, เชคเซ‡ เชคเชฎเชพเชฐเชพ เชตเชฟเชถเซ‡เชจเซ€ เชฎเชพเชนเชฟเชคเซ€เชจเซ‡ เชนเซ‡เชกเชฐเชฎเชพเช‚ เช…เช‚เชคเชฟเชฎ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชธเซเชงเซ€ เชชเชฃ เชฎเซ‹เช•เชฒเชถเซ‡. เช†เชฎ, เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ OpenID เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡, เชคเซ‹ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชคเชฐเชค เชœ เช…เชงเชฟเช•เซƒเชค เช›เซ‡. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชกเซ‡เชถเชฌเซ‹เชฐเซเชกเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‹

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡


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 เชฌเชจเชพเชตเซ€เช เชœเซ‡ 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, เช…เชฎเชจเซ‡ เช•เซ€เช•เซเชฒเซ‹เช• เชชเชฐ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช…เชจเซ‡ เชธเชซเชณ เช…เชงเชฟเช•เซƒเชคเชคเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช…เชฎเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชฒเซ‰เช— เช‡เชจ เช•เชฐเซ‡เชฒเชพ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชชเชฐ เชชเชนเซ‹เช‚เชšเซ€เชถเซเช‚.

เช—เซ‡เช‚เช—เชตเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ

เชธเช—เชตเชก เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ เชเช• เช—เซ‡เช‚เช—เชตเซ‡ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡ kubectl เชฎเชพเชŸเซ‡ เชเช• เชฐเซ‚เชชเชฐเซ‡เช–เชพ เชซเชพเช‡เชฒ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชถเซ‡, เชœเซ‡เชจเซ€ เชฎเชฆเชฆเชฅเซ€ เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชนเซ‡เช เชณ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เชœเชˆเชถเซเช‚.


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 เช…เชงเชฟเช•เซƒเชคเชคเชพ เชœเซ‹เชกเซ€เช เช›เซ€เช

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹