GitHub OAuth āĻāĻŦāĻ‚ Dex āĻāĻ° āĻ¸āĻžāĻĨā§‡ Kubernetes āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ

āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻœāĻ°ā§‡ Dex, dex-k8s-authenticator āĻāĻŦāĻ‚ GitHub āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŸāĻŋāĻ‰āĻŸā§‹āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻ›āĻŋāĨ¤

GitHub OAuth āĻāĻŦāĻ‚ Dex āĻāĻ° āĻ¸āĻžāĻĨā§‡ Kubernetes āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ
āĻ°āĻžāĻļāĻŋāĻ¯āĻŧāĻžāĻ¨ āĻ­āĻžāĻˇāĻžāĻ° āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻšā§āĻ¯āĻžāĻŸ āĻ‡āĻ¨ āĻĨā§‡āĻ•ā§‡ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻŽā§‡āĻŽā§ˇ Telegram

āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

āĻ†āĻŽāĻ°āĻž āĻ‰āĻ¨ā§āĻ¨āĻ¯āĻŧāĻ¨ āĻāĻŦāĻ‚ QA āĻĻāĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ—āĻ¤āĻŋāĻļā§€āĻ˛ āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ Kubernetes āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋāĨ¤ āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻ¤āĻžāĻĻā§‡āĻ° āĻĄā§āĻ¯āĻžāĻļāĻŦā§‹āĻ°ā§āĻĄ āĻāĻŦāĻ‚ kubectl āĻ‰āĻ­āĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻĻāĻŋāĻ¤ā§‡ āĻšāĻžāĻ‡āĨ¤ āĻ“āĻĒā§‡āĻ¨āĻļāĻŋāĻĢāĻŸā§‡āĻ° āĻŦāĻŋāĻĒāĻ°ā§€āĻ¤ā§‡, āĻ­ā§āĻ¯āĻžāĻ¨āĻŋāĻ˛āĻž āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ā§‡āĻ° āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ āĻ¨ā§‡āĻ‡, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¤ā§ƒāĻ¤ā§€āĻ¯āĻŧ āĻĒāĻ•ā§āĻˇā§‡āĻ° āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋāĨ¤

āĻāĻ‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ:

  • dex-k8s-āĻĒā§āĻ°āĻŽāĻžāĻŖāĻ•āĻžāĻ°ā§€â€Š — kubectl āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨
  • Dex — OpenID āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻĒā§āĻ°āĻĻāĻžāĻ¨āĻ•āĻžāĻ°ā§€
  • GitHub - āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ•āĻžāĻ°āĻŖ āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§‹āĻŽā§āĻĒāĻžāĻ¨āĻŋāĻ¤ā§‡ GitHub āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ

āĻ†āĻŽāĻ°āĻž Google OIDC āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻĻā§āĻ°ā§āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻļāĻ¤ āĻ†āĻŽāĻ°āĻž āĻĢā§‡āĻ˛ āĻ¤āĻžāĻĻā§‡āĻ° āĻ—ā§āĻ°ā§āĻĒ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻ¤ā§‡, āĻ¤āĻžāĻ‡ GitHub-āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•ā§€āĻ•āĻ°āĻŖ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§‡āĻļ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤āĨ¤ āĻ—ā§āĻ°ā§āĻĒ āĻŽā§āĻ¯āĻžāĻĒāĻŋāĻ‚ āĻ›āĻžāĻĄāĻŧāĻž, āĻ—ā§āĻ°ā§āĻĒ āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ• RBAC āĻ¨ā§€āĻ¤āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦ āĻšāĻŦā§‡ āĻ¨āĻžāĨ¤

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ•āĻŸāĻŋ āĻ­āĻŋāĻœā§āĻ¯ā§āĻ¯āĻŧāĻžāĻ˛ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻžāĻ¯āĻŧ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡:

GitHub OAuth āĻāĻŦāĻ‚ Dex āĻāĻ° āĻ¸āĻžāĻĨā§‡ Kubernetes āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ
āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž

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

  1. āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ dex-k8s-āĻĒā§āĻ°āĻŽāĻžāĻŖāĻ•āĻžāĻ°ā§€āĻ¤ā§‡ āĻ˛āĻ— āĻ‡āĻ¨ āĻ•āĻ°ā§‡ (login.k8s.example.com)
  2. dex-k8s-āĻĒā§āĻ°āĻŽāĻžāĻŖāĻ•āĻžāĻ°ā§€ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻŸāĻŋ āĻĄā§‡āĻ•ā§āĻ¸ā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻĢāĻ°ā§‹āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻ•āĻ°ā§‡ (dex.k8s.example.com)
  3. āĻĄā§‡āĻ•ā§āĻ¸ āĻ—āĻŋāĻŸāĻšāĻžāĻŦ āĻ˛āĻ—āĻ‡āĻ¨ āĻĒā§ƒāĻˇā§āĻ āĻžāĻ¯āĻŧ āĻĒā§āĻ¨āĻƒāĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°ā§‡
  4. GitHub āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻ¤āĻĨā§āĻ¯ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻĄā§‡āĻ•ā§āĻ¸ā§‡ āĻĢā§‡āĻ°āĻ¤ āĻĻā§‡āĻ¯āĻŧ
  5. Dex āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻ¤āĻĨā§āĻ¯ dex-k8s-āĻĒā§āĻ°āĻŽāĻžāĻŖāĻ•āĻžāĻ°ā§€āĻ•ā§‡ āĻĻā§‡āĻ¯āĻŧ
  6. āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ GitHub āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ OIDC āĻŸā§‹āĻ•ā§‡āĻ¨ āĻĒāĻžāĻ¯āĻŧ
  7. dex-k8s-authenticator kubeconfig āĻ āĻŸā§‹āĻ•ā§‡āĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡
  8. kubectl KubeAPIServer-āĻ āĻŸā§‹āĻ•ā§‡āĻ¨ āĻĒāĻžāĻ¸ āĻ•āĻ°ā§‡
  9. KubeAPIServer āĻĒāĻžāĻ¸ āĻ•āĻ°āĻž āĻŸā§‹āĻ•ā§‡āĻ¨ā§‡āĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ kubectl-āĻ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻĢā§‡āĻ°āĻ¤ āĻĻā§‡āĻ¯āĻŧ
  10. āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ kubectl āĻĨā§‡āĻ•ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻĒāĻžāĻ¯āĻŧ

āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤āĻŋāĻŽā§‚āĻ˛āĻ• āĻ•āĻ°ā§āĻŽ

āĻ…āĻŦāĻļā§āĻ¯āĻ‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻ†āĻ›ā§‡ (k8s.example.com), āĻāĻŦāĻ‚ āĻĒā§‚āĻ°ā§āĻŦā§‡ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž HELM āĻāĻ° āĻ¸āĻžāĻĨā§‡āĻ“ āĻ†āĻ¸ā§‡āĨ¤ GitHub (super-org) āĻ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ“ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤
āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¯āĻĻāĻŋ HELM āĻ¨āĻž āĻĨāĻžāĻ•ā§‡ āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨ āĻ–ā§āĻŦ āĻ¸āĻšāĻœ.

āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° GitHub āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

āĻĒā§āĻ°āĻ¤āĻŋāĻˇā§āĻ āĻžāĻ¨ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻĒā§ƒāĻˇā§āĻ āĻžāĻ¯āĻŧ āĻ¯āĻžāĻ¨, (https://github.com/organizations/super-org/settings/applications) āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ (āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻŋāĻ¤ OAuth āĻ…ā§āĻ¯āĻžāĻĒ):
GitHub OAuth āĻāĻŦāĻ‚ Dex āĻāĻ° āĻ¸āĻžāĻĨā§‡ Kubernetes āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ
āĻ—āĻŋāĻŸāĻšāĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ URL āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋ āĻĒā§‚āĻ°āĻŖ āĻ•āĻ°ā§āĻ¨, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ:

  • āĻšā§‹āĻŽāĻĒā§‡āĻœ URL: https://dex.k8s.example.com
  • āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻ•āĻ˛āĻŦā§āĻ¯āĻžāĻ• URL: https://dex.k8s.example.com/callback

āĻ˛āĻŋāĻ™ā§āĻ•āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ¤āĻ°ā§āĻ• āĻĨāĻžāĻ•ā§āĻ¨, āĻ¸ā§āĻ˛ā§āĻ¯āĻžāĻļāĻ—ā§āĻ˛āĻŋ āĻ¨āĻž āĻšāĻžāĻ°āĻžāĻ¨ā§‹ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤

āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĢāĻ°ā§āĻŽā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ¤ā§‡, GitHub āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŦā§‡ Client ID и Client secret, āĻ¤āĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻœāĻžāĻ¯āĻŧāĻ—āĻžāĻ¯āĻŧ āĻ°āĻžāĻ–ā§āĻ¨, āĻ¤āĻžāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻœā§‡ āĻ˛āĻžāĻ—āĻŦā§‡ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻ–āĻŋāĻ˛āĻžāĻ¨ āĻ—ā§‹āĻĒāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

āĻ¸āĻžāĻŦāĻĄā§‹āĻŽā§‡āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ DNS āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻ•āĻ°ā§āĻ¨ login.k8s.example.com и dex.k8s.example.com, āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻŦā§‡āĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ SSL āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ°āĨ¤

āĻ†āĻ¸ā§āĻ¨ SSL āĻ¸āĻžāĻ°ā§āĻŸāĻŋāĻĢāĻŋāĻ•ā§‡āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ:

cat <<EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: cert-auth-dex
  namespace: kube-system
spec:
  secretName: cert-auth-dex
  dnsNames:
    - dex.k8s.example.com
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - dex.k8s.example.com
  issuerRef:
    name: le-clusterissuer
    kind: ClusterIssuer
---
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: cert-auth-login
  namespace: kube-system
spec:
  secretName: cert-auth-login
  dnsNames:
    - login.k8s.example.com
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - login.k8s.example.com
  issuerRef:
    name: le-clusterissuer
    kind: ClusterIssuer
EOF
kubectl describe certificates cert-auth-dex -n kube-system
kubectl describe certificates cert-auth-login -n kube-system

āĻļāĻŋāĻ°ā§‹āĻ¨āĻžāĻŽ āĻ¸āĻš āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ‡āĻ¸ā§āĻ¯ā§āĻ¯āĻŧāĻžāĻ° le-clusterissuer āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻĨāĻžāĻ•āĻž āĻ‰āĻšāĻŋāĻ¤, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻ¨āĻž āĻĨāĻžāĻ•ā§‡ āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ HELM āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨:

helm install --namespace kube-system -n cert-manager stable/cert-manager
cat << EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: le-clusterissuer
  namespace: kube-system
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: le-clusterissuer
    http01: {}
EOF

KubeAPIServer āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨

kubeAPIServer āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ OIDC āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡:

kops edit cluster
...
  kubeAPIServer:
    anonymousAuth: false
    authorizationMode: RBAC
    oidcClientID: dex-k8s-authenticator
    oidcGroupsClaim: groups
    oidcIssuerURL: https://dex.k8s.example.com/
    oidcUsernameClaim: email
kops update cluster --yes
kops rolling-update cluster --yes

āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻ˛āĻžāĻĨāĻŋ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻŸāĻŋ āĻāĻ•āĻ‡āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻŽā§āĻ¯āĻžāĻ¨ā§‡āĻœāĻžāĻ°.

āĻĄā§‡āĻ•ā§āĻ¸ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻāĻŦāĻ‚ dex-k8s-āĻĒā§āĻ°āĻŽāĻžāĻŖāĻ•āĻžāĻ°ā§€

āĻĄā§‡āĻ•ā§āĻ¸ā§‡āĻ° āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻŽāĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡āĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ° āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ•ā§€ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡, āĻ†āĻ¸ā§āĻ¨ āĻ¸ā§‡āĻ–āĻžāĻ¨ āĻĨā§‡āĻ•ā§‡ āĻāĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ†āĻ¸āĻŋ:

sudo cat /srv/kubernetes/ca.{crt,key}
-----BEGIN CERTIFICATE-----
AAAAAAAAAAABBBBBBBBBBCCCCCC
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
DDDDDDDDDDDEEEEEEEEEEFFFFFF
-----END RSA PRIVATE KEY-----

dex-k8s-authenticator āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•:

git clone [email protected]:mintel/dex-k8s-authenticator.git
cd dex-k8s-authenticator/

āĻŽāĻžāĻ¨ āĻĢāĻžāĻ‡āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻ¨āĻŽāĻ¨ā§€āĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ HELM āĻšāĻžāĻ°ā§āĻŸ.

āĻ†āĻ¸ā§āĻ¨ āĻĄā§‡āĻ•ā§āĻ¸ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻŋ:

cat << EOF > values-dex.yml
global:
  deployEnv: prod
tls:
  certificate: |-
    -----BEGIN CERTIFICATE-----
    AAAAAAAAAAABBBBBBBBBBCCCCCC
    -----END CERTIFICATE-----
  key: |-
    -----BEGIN RSA PRIVATE KEY-----
    DDDDDDDDDDDEEEEEEEEEEFFFFFF
    -----END RSA PRIVATE KEY-----
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - dex.k8s.example.com
  tls:
    - secretName: cert-auth-dex
      hosts:
        - dex.k8s.example.com
serviceAccount:
  create: true
  name: dex-auth-sa
config: |
  issuer: https://dex.k8s.example.com/
  storage: # https://github.com/dexidp/dex/issues/798
    type: sqlite3
    config:
      file: /var/dex.db
  web:
    http: 0.0.0.0:5556
  frontend:
    theme: "coreos"
    issuer: "Example Co"
    issuerUrl: "https://example.com"
    logoUrl: https://example.com/images/logo-250x25.png
  expiry:
    signingKeys: "6h"
    idTokens: "24h"
  logger:
    level: debug
    format: json
  oauth2:
    responseTypes: ["code", "token", "id_token"]
    skipApprovalScreen: true
  connectors:
  - type: github
    id: github
    name: GitHub
    config:
      clientID: $GITHUB_CLIENT_ID
      clientSecret: $GITHUB_CLIENT_SECRET
      redirectURI: https://dex.k8s.example.com/callback
      orgs:
      - name: super-org
        teams:
        - team-red
  staticClients:
  - id: dex-k8s-authenticator
    name: dex-k8s-authenticator
    secret: generatedLongRandomPhrase
    redirectURIs:
      - https://login.k8s.example.com/callback/
envSecrets:
  GITHUB_CLIENT_ID: "1ab2c3d4e5f6g7h8"
  GITHUB_CLIENT_SECRET: "98z76y54x32w1"
EOF

āĻāĻŦāĻ‚ dex-k8s-āĻĒā§āĻ°āĻŽāĻžāĻŖāĻ•āĻžāĻ°ā§€āĻ° āĻœāĻ¨ā§āĻ¯:

cat << EOF > values-auth.yml
global:
  deployEnv: prod
dexK8sAuthenticator:
  clusters:
  - name: k8s.example.com
    short_description: "k8s cluster"
    description: "Kubernetes cluster"
    issuer: https://dex.k8s.example.com/
    k8s_master_uri: https://api.k8s.example.com
    client_id: dex-k8s-authenticator
    client_secret: generatedLongRandomPhrase
    redirect_uri: https://login.k8s.example.com/callback/
    k8s_ca_pem: |
      -----BEGIN CERTIFICATE-----
      AAAAAAAAAAABBBBBBBBBBCCCCCC
      -----END CERTIFICATE-----
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - login.k8s.example.com
  tls:
    - secretName: cert-auth-login
      hosts:
        - login.k8s.example.com
EOF

Dex āĻāĻŦāĻ‚ dex-k8s-āĻĒā§āĻ°āĻŽāĻžāĻŖāĻ•āĻžāĻ°ā§€ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨:

helm install -n dex --namespace kube-system --values values-dex.yml charts/dex
helm install -n dex-auth --namespace kube-system --values values-auth.yml charts/dex-k8s-authenticator

āĻ†āĻ¸ā§āĻ¨ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŋ (āĻĄā§‡āĻ•ā§āĻ¸ā§‡āĻ° āĻ•ā§‹āĻĄ 400 āĻĢā§‡āĻ°āĻ¤ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤, āĻāĻŦāĻ‚ dex-k8s-āĻĒā§āĻ°āĻŽāĻžāĻŖāĻ•āĻžāĻ°ā§€āĻ•ā§‡ āĻ•ā§‹āĻĄ 200 āĻĢā§‡āĻ°āĻ¤ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤):

curl -sI https://dex.k8s.example.com/callback | head -1
HTTP/2 400
curl -sI https://login.k8s.example.com/ | head -1
HTTP/2 200

RBAC āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨

āĻ†āĻŽāĻ°āĻž āĻ—ā§āĻ°ā§āĻĒā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ ClusterRole āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ°-āĻĒāĻ āĻ¨ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ¸āĻš:

cat << EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-read-all
rules:
  -
    apiGroups:
      - ""
      - apps
      - autoscaling
      - batch
      - extensions
      - policy
      - rbac.authorization.k8s.io
      - storage.k8s.io
    resources:
      - componentstatuses
      - configmaps
      - cronjobs
      - daemonsets
      - deployments
      - events
      - endpoints
      - horizontalpodautoscalers
      - ingress
      - ingresses
      - jobs
      - limitranges
      - namespaces
      - nodes
      - pods
      - pods/log
      - pods/exec
      - persistentvolumes
      - persistentvolumeclaims
      - resourcequotas
      - replicasets
      - replicationcontrollers
      - serviceaccounts
      - services
      - statefulsets
      - storageclasses
      - clusterroles
      - roles
    verbs:
      - get
      - watch
      - list
  - nonResourceURLs: ["*"]
    verbs:
      - get
      - watch
      - list
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create"]
EOF

āĻ†āĻ¸ā§āĻ¨ ClusterRoleBinding āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ:

cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: dex-cluster-auth
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-read-all
subjects:
  kind: Group
  name: "super-org:team-red"
EOF

āĻāĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤āĨ¤

āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž

āĻ˛āĻ—āĻ‡āĻ¨ āĻĒā§ƒāĻˇā§āĻ āĻžāĻ¯āĻŧ āĻ¯āĻžāĻ¨ (https://login.k8s.example.com) āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° GitHub āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ˛āĻ— āĻ‡āĻ¨ āĻ•āĻ°ā§āĻ¨:

GitHub OAuth āĻāĻŦāĻ‚ Dex āĻāĻ° āĻ¸āĻžāĻĨā§‡ Kubernetes āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ
āĻ˛āĻ—āĻ‡āĻ¨ āĻĒā§ƒāĻˇā§āĻ āĻžāĻ¯āĻŧ

GitHub OAuth āĻāĻŦāĻ‚ Dex āĻāĻ° āĻ¸āĻžāĻĨā§‡ Kubernetes āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ
āĻ˛āĻ—āĻ‡āĻ¨ āĻĒā§ƒāĻˇā§āĻ āĻž āĻ—āĻŋāĻŸāĻšāĻžāĻŦā§‡ āĻĒā§āĻ¨āĻƒāĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻŋāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡

GitHub OAuth āĻāĻŦāĻ‚ Dex āĻāĻ° āĻ¸āĻžāĻĨā§‡ Kubernetes āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ
 āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻĒā§‡āĻ¤ā§‡ āĻ‰āĻ¤ā§āĻĒāĻ¨ā§āĻ¨ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻžāĻŦāĻ˛ā§€ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§āĻ¨

āĻ“āĻ¯āĻŧā§‡āĻŦ āĻĒā§ƒāĻˇā§āĻ āĻž āĻĨā§‡āĻ•ā§‡ āĻ•āĻĒāĻŋ-āĻĒā§‡āĻ¸ā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ kubectl āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ:

kubectl get po
NAME                READY   STATUS    RESTARTS   AGE
mypod               1/1     Running   0          3d

kubectl delete po mypod
Error from server (Forbidden): pods "mypod" is forbidden: User "[email protected]" cannot delete pods in the namespace "default"

āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ GitHub āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ°āĻž āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻĒāĻĄāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ˛āĻ— āĻ‡āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¤āĻžāĻĻā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻžāĻ° āĻ…āĻ§āĻŋāĻ•āĻžāĻ° āĻ¤āĻžāĻĻā§‡āĻ° āĻ¨ā§‡āĻ‡āĨ¤

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

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