āĻ†āĻŽāĻ°āĻž Keycloak āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Kubernetes-āĻ ActiveDirectory āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĻā§‡āĻ‡

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻžāĻ° āĻ˛āĻ•ā§āĻˇā§āĻ¯ā§‡ āĻ˛ā§‡āĻ–āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯āĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻŦāĻŋāĻļā§‡āĻˇāĻ­āĻžāĻŦā§‡ Microsoft ActiveDirectory-āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛ā§‡ āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ•ā§‡ āĻĒāĻ°āĻŋāĻĒā§‚āĻ°āĻ• āĻ•āĻ°ā§‡āĨ¤

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻ˛āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻāĻŦāĻ‚ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻŦā§‡āĻ¨:

  • āĻšāĻžāĻŦāĻŋāĻ•āĻžāĻ āĻŋ āĻāĻ•āĻŸāĻŋ āĻ“āĻĒā§‡āĻ¨ āĻ¸ā§‹āĻ°ā§āĻ¸ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒāĨ¤ āĻ¯āĻž āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• āĻāĻ¨ā§āĻŸā§āĻ°āĻŋ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤ LDAP āĻāĻŦāĻ‚ OpenID āĻ¸āĻš āĻ…āĻ¨ā§‡āĻ• āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡, āĻ¯āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ†āĻ—ā§āĻ°āĻšā§‡āĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧāĨ¤
  • āĻšāĻžāĻŦāĻŋāĻ•āĻžāĻ āĻŋ āĻĻāĻžāĻ°ā§‹āĻ¯āĻŧāĻžāĻ¨ — āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻĒāĻ°ā§€āĻ¤ āĻĒā§āĻ°āĻ•ā§āĻ¸āĻŋ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ•ā§€āĻ•ā§āĻ˛ā§‹āĻ•ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻ¸āĻ‚āĻšāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤
  • āĻ—ā§āĻ¯āĻžāĻ‚āĻ“āĻ¯āĻŧā§‡ — āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¯āĻž kubectl-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻ¯āĻžāĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ā§‡ āĻ†āĻĒāĻ¨āĻŋ OpenID āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ˛āĻ— āĻ‡āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ Kubernetes API-āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸā§‡ āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤

āĻ†āĻŽāĻ°āĻž āĻ†āĻ°āĻŦāĻŋāĻāĻ¸āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€/āĻ—ā§‹āĻˇā§āĻ ā§€āĻ° āĻ…āĻ§āĻŋāĻ•āĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ, āĻāĻŸāĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻāĻ•āĻ—ā§āĻšā§āĻ› āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ†āĻŽāĻŋ āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻ†āĻ˛ā§‹āĻšāĻ¨āĻž āĻ•āĻ°āĻŦ āĻ¨āĻžāĨ¤ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻšāĻ˛ āĻ†āĻĒāĻ¨āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ…āĻ§āĻŋāĻ•āĻžāĻ° āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§ āĻ•āĻ°āĻ¤ā§‡ 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

āĻŦāĻžāĻŽ āĻ•ā§‹āĻŖāĻžāĻ¯āĻŧ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§āĻ¨ āĻ°āĻžāĻœāĻ¤ā§āĻŦ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨

āĻšāĻžāĻŦāĻŋ
āĻŽā§‚āĻ˛ā§āĻ¯

āĻ¨āĻžāĻŽ
āĻ•ā§āĻŦā§‡āĻ°āĻ¨ā§‡āĻŸāĻ¸

āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ¨āĻžāĻŽ
Kubernetes

āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ‡āĻŽā§‡āĻ˛ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ…āĻ•ā§āĻˇāĻŽ āĻ•āĻ°ā§āĻ¨:
āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§‹āĻĒ -> āĻ‡āĻŽā§‡āĻ˛ -> āĻŽā§āĻ¯āĻžāĻĒāĻžāĻ°āĻ¸ -> āĻ‡āĻŽā§‡āĻ˛ āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°āĻž (āĻŽā§āĻ›ā§āĻ¨)

āĻ†āĻŽāĻ°āĻž ActiveDirectory āĻĨā§‡āĻ•ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ†āĻŽāĻĻāĻžāĻ¨āĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĢā§‡āĻĄāĻžāĻ°ā§‡āĻļāĻ¨ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻ›āĻŋ, āĻ†āĻŽāĻŋ āĻ¨ā§€āĻšā§‡ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻ¨āĻļāĻŸ āĻ°ā§‡āĻ–ā§‡ āĻĻā§‡āĻŦ, āĻ†āĻŽāĻŋ āĻŽāĻ¨ā§‡ āĻ•āĻ°āĻŋ āĻāĻŸāĻŋ āĻ†āĻ°āĻ“ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻšāĻŦā§‡āĨ¤

āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻĢā§‡āĻĄāĻžāĻ°ā§‡āĻļāĻ¨ —> āĻĒā§āĻ°āĻĻāĻžāĻ¨āĻ•āĻžāĻ°ā§€ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨... —> ldap

āĻĢā§‡āĻĄāĻžāĻ°ā§‡āĻļāĻ¨ āĻ¸ā§‡āĻŸāĻ†āĻĒāĻ†āĻŽāĻ°āĻž Keycloak āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Kubernetes-āĻ ActiveDirectory āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĻā§‡āĻ‡
āĻ†āĻŽāĻ°āĻž Keycloak āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Kubernetes-āĻ ActiveDirectory āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĻā§‡āĻ‡

āĻ¯āĻĻāĻŋ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ āĻŋāĻ•āĻ āĻžāĻ• āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻŦā§‹āĻ¤āĻžāĻŽ āĻŸāĻŋāĻĒā§āĻ¨ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ•ā§‡ āĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ‡āĻœ āĻ•āĻ°ā§āĻ¨ āĻ†āĻĒāĻ¨āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ¸āĻĢāĻ˛ āĻ†āĻŽāĻĻāĻžāĻ¨āĻŋ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻŦā§‡āĻ¨āĨ¤

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€āĻ¤ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ—ā§āĻ°ā§āĻĒ āĻŽā§āĻ¯āĻžāĻĒ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡

āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻĢā§‡āĻĄāĻžāĻ°ā§‡āĻļāĻ¨ -> ldap_localhost -> āĻŽā§āĻ¯āĻžāĻĒāĻžāĻ° -> āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨

āĻāĻ•āĻŸāĻŋ āĻŽā§āĻ¯āĻžāĻĒāĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡āĻ†āĻŽāĻ°āĻž Keycloak āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Kubernetes-āĻ ActiveDirectory āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĻā§‡āĻ‡

āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§‡āĻŸāĻ†āĻĒ

āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡, āĻ•ā§€āĻ•ā§āĻ˛ā§‹āĻ•ā§‡āĻ° āĻĒāĻ°āĻŋāĻĒā§āĻ°ā§‡āĻ•ā§āĻˇāĻŋāĻ¤ā§‡ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¯āĻž āĻāĻŸāĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻŋāĻ¤ āĻšāĻŦā§‡āĨ¤ āĻ†āĻŽāĻŋ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻ¨āĻļāĻŸāĻŸāĻŋāĻ¤ā§‡ āĻ˛āĻžāĻ˛ āĻ°āĻ™ā§‡ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻšāĻžāĻ‡āĻ˛āĻžāĻ‡āĻŸ āĻ•āĻ°āĻŦāĨ¤

āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ -> āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨

āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§‡āĻŸāĻ†āĻĒāĻ†āĻŽāĻ°āĻž Keycloak āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Kubernetes-āĻ ActiveDirectory āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĻā§‡āĻ‡

āĻ—ā§‹āĻˇā§āĻ ā§€āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ•ā§‚āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•:

āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§‹āĻĒ -> āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨

āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ¯ā§‹āĻ— āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ†āĻŽāĻ°āĻž Keycloak āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Kubernetes-āĻ ActiveDirectory āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĻā§‡āĻ‡

āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŽā§āĻ¯āĻžāĻĒāĻžāĻ° āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°ā§āĻ¨:

āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§‹āĻĒ -> āĻ—ā§āĻ°ā§āĻĒ -> āĻŽā§āĻ¯āĻžāĻĒāĻžāĻ° -> āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨

āĻŽā§āĻ¯āĻžāĻĒāĻžāĻ°āĻ†āĻŽāĻ°āĻž Keycloak āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Kubernetes-āĻ ActiveDirectory āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĻā§‡āĻ‡

āĻ†āĻŽāĻ°āĻž āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§‹āĻĒā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ—ā§āĻ°ā§āĻĒā§‡āĻ° āĻŽā§āĻ¯āĻžāĻĒāĻŋāĻ‚ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŋ:

āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ -> āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ -> āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§‹āĻĒ -> āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§‹āĻĒ
āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ—ā§āĻ°ā§āĻĒ в āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§‹āĻĒ, āĻŸāĻŋāĻĒā§āĻ¨ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻŋāĻ¤ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨

āĻ†āĻŽāĻ°āĻž āĻ—ā§‹āĻĒāĻ¨ (āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ•ā§‹āĻĨāĻžāĻ“ āĻ˛āĻŋāĻ–ā§‡) āĻĒāĻžāĻ‡ āĻ¯āĻž āĻ†āĻŽāĻ°āĻž āĻ•ā§€āĻ•ā§āĻ˛ā§‹āĻ•ā§‡ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ:

āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ -> kubernetes -> āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ° -> āĻ—ā§‹āĻĒāĻ¨
āĻāĻŸāĻŋ āĻ¸ā§‡āĻŸāĻ†āĻĒ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻ°ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ›āĻŋāĻ˛ āĻ¯āĻ–āĻ¨, āĻ¸āĻĢāĻ˛ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ā§‡āĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻŋ āĻāĻ•āĻŸāĻŋ 403 āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻĒā§‡āĻ¯āĻŧā§‡āĻ›āĻŋā§ˇ āĻŦāĻžāĻ— āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ.

āĻ āĻŋāĻ• āĻ•āĻ°ā§āĻ¨:

āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§āĻ•ā§‹āĻĒ -> āĻ­ā§‚āĻŽāĻŋāĻ•āĻž -> āĻŽā§āĻ¯āĻžāĻĒāĻžāĻ° -> āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨

āĻŽā§āĻ¯āĻžāĻĒāĻžāĻ°āĻ†āĻŽāĻ°āĻž Keycloak āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Kubernetes-āĻ ActiveDirectory āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĻā§‡āĻ‡

āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ•ā§‹āĻĄ

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

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

āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻ¸āĻžāĻ‡āĻŸ āĻĨā§‡āĻ•ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŽā§‚āĻ˛ āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ° āĻ•ā§‹āĻĨāĻžāĻ¯āĻŧ āĻ…āĻŦāĻ¸ā§āĻĨāĻŋāĻ¤ āĻāĻŦāĻ‚ 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 āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨

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 āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°ā§‡, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻŋāĻ¤ āĻšāĻ¯āĻŧ. āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻĄā§āĻ¯āĻžāĻļāĻŦā§‹āĻ°ā§āĻĄā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§‡āĻ–āĻŋ

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 āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ āĻ¯āĻž DataOPS āĻ—ā§āĻ°ā§āĻĒā§‡āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ…ā§āĻ¯āĻžāĻĄāĻŽāĻŋāĻ¨ āĻ…āĻ§āĻŋāĻ•āĻžāĻ° (āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ ClusterRole āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°-āĻ…ā§āĻ¯āĻžāĻĄāĻŽāĻŋāĻ¨) āĻĻā§‡āĻŦā§‡āĨ¤


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-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻĢāĻžāĻ‡āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŦā§‡, āĻ¯āĻžāĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ā§‡ āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ…āĻ§ā§€āĻ¨ā§‡ 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-----

āĻāĻŸāĻž āĻāĻ‡ āĻŽāĻ¤ āĻ•āĻŋāĻ›ā§ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧ. āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻĢāĻžāĻ‡āĻ˛ āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻŸāĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ:

āĻ†āĻŽāĻ°āĻž Keycloak āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Kubernetes-āĻ ActiveDirectory āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĻā§‡āĻ‡

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨