เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™ Kubernetes เป‚เบ”เบเปƒเบŠเป‰ GitHub OAuth เปเบฅเบฐ Dex

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเป€เบ›เบฑเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบธเปˆเบก Kubernetes เป‚เบ”เบเปƒเบŠเป‰ Dex, dex-k8s-authenticator เปเบฅเบฐ GitHub.

เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™ Kubernetes เป‚เบ”เบเปƒเบŠเป‰ GitHub OAuth เปเบฅเบฐ Dex
meme เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบˆเบฒเบเบžเบฒเบชเบฒเบฅเบฑเบ”เป€เบŠเบ Kubernetes เบชเบปเบ™เบ—เบฐเบ™เบฒเปƒเบ™ เป‚เบ—เบฅเบฐเป€เบฅเบ

เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต

เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ Kubernetes เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ เปเบฅเบฐเบ—เบตเบกเบ‡เบฒเบ™ QA. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบธเปˆเบกเบชเปเบฒเบฅเบฑเบšเบ—เบฑเบ‡ dashboard เปเบฅเบฐ kubectl. เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบš OpenShift, vanilla Kubernetes เบšเปเปˆเบกเบตเบเบฒเบ™เบžเบดเบชเบนเบ”เบขเบทเบ™เบขเบฑเบ™เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰.

เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบ™เบตเป‰โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹:

  • dex-k8s-authenticatorโ€Š - เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบงเบฑเบšเป„เบŠเบ•เปŒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡ kubectl config
  • Dex โ€” เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบด OpenID Connect
  • GitHub - เบžเบฝเบ‡เปเบ•เปˆเบเป‰เบญเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ GitHub เปƒเบ™เบšเปเบฅเบดเบชเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบฐเบเบฒเบเบฒเบกเปƒเบŠเป‰ Google ODC, เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒ เบฅเบปเป‰เบกเป€เบซเบผเบง เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบเบฑเบšเบเบธเปˆเบก, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบเบฑเบš GitHub เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบžเบงเบเป€เบฎเบปเบฒเบ”เบต. เบ–เป‰เบฒเบšเปเปˆเบกเบตเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบเบธเปˆเบก, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบ™เบฐเป‚เบเบšเบฒเบ RBAC เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบเบธเปˆเบก.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” Kubernetes เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”เปƒเบ™เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบžเบฒเบš:

เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™ Kubernetes เป‚เบ”เบเปƒเบŠเป‰ GitHub OAuth เปเบฅเบฐ Dex
เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”

เบฅเบฒเบโ€‹เบฅเบฐโ€‹เบญเบฝเบ”โ€‹เป€เบฅเบฑเบโ€‹เบ™เป‰เบญเบโ€‹เปเบฅเบฐโ€‹เบˆเบธเบ”โ€‹เป‚เบ”เบโ€‹เบˆเบธเบ”โ€‹:

  1. เบœเบนเป‰เปƒเบŠเป‰เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš dex-k8s-authenticator (login.k8s.example.com)
  2. dex-k8s-authenticator เบชเบปเปˆเบ‡เบ•เปเปˆเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰ Dex (dex.k8s.example.com)
  3. Dex เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเบซเบ™เป‰เบฒเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš GitHub
  4. GitHub เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบซเป‰ Dex
  5. Dex เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเป„เบ›เปƒเบซเป‰ dex-k8s-authenticator
  6. เบœเบนเป‰เปƒเบŠเป‰เป„เบ”เป‰เบฎเบฑเบš token ODC เบˆเบฒเบ GitHub
  7. dex-k8s-authenticator เป€เบžเบตเปˆเบก token เบเบฑเบš kubeconfig
  8. kubectl เบœเปˆเบฒเบ™ token เป„เบ›เบซเบฒ KubeAPIServer
  9. KubeAPIServer เบเบฑเบšเบ„เบทเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ kubectl เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ token เบ—เบตเปˆเบœเปˆเบฒเบ™
  10. เบœเบนเป‰เปƒเบŠเป‰เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบˆเบฒเบ kubectl

เบเบฒเบ™เบเบฐเบเบฝเบกเบเบฒเบ™เบเบฐเบเบฝเบก

เปเบ™เปˆเบ™เบญเบ™, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบเบธเปˆเบก Kubernetes เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเป‰เบง (k8s.example.com), เปเบฅเบฐเบเบฑเบ‡เบกเบฒเบžเป‰เบญเบกเบเบฑเบš HELM เบ—เบตเปˆเบ•เบดเบ”เบ•เบฑเป‰เบ‡เป„เบงเป‰เบเปˆเบญเบ™. เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบกเบตเบญเบปเบ‡เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™ GitHub (super-org).
เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบกเบต HELM, เปƒเบซเป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™ เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitHub.

เป„เบ›เบ—เบตเปˆเปœเป‰เบฒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบญเบปเบ‡เบเบญเบ™, (https://github.com/organizations/super-org/settings/applications) เปเบฅเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบซเบกเปˆ (Authorized OAuth App):
เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™ Kubernetes เป‚เบ”เบเปƒเบŠเป‰ GitHub OAuth เปเบฅเบฐ Dex
เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบซเบกเปˆเปƒเบ™ GitHub

เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเปƒเบ™เบŠเปˆเบญเบ‡เบ—เบตเปˆเบกเบต URL เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡:

  • URL เปœเป‰เบฒเบซเบผเบฑเบ: https://dex.k8s.example.com
  • URL เป‚เบ—เบเบฑเบšเบ„เบทเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”: https://dex.k8s.example.com/callback

เบˆเบปเปˆเบ‡เบฅเบฐเบกเบฑเบ”เบฅเบฐเบงเบฑเบ‡เบเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเบšเปเปˆเบชเบนเบ™เป€เบชเบ slashes.

เปƒเบ™เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เปเบšเบšเบŸเบญเบกเบ—เบตเปˆเบชเปเบฒเป€เบฅเบฑเบ”, GitHub เบˆเบฐเบชเป‰เบฒเบ‡ Client ID ะธ Client secret, เปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบ›เบญเบ”เป„เบž, เบžเบงเบเป€เบ‚เบปเบฒเบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ•เปเปˆเบžเบงเบเป€เบฎเบปเบฒ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ Vault เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ„เบงเบฒเบกโ€‹เบฅเบฑเบšโ€‹)โ€‹:

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

เบเบฐเบเบฝเบกเบšเบฑเบ™เบ—เบถเบ DNS เบชเปเบฒเบฅเบฑเบšเป‚เบ”เป€เบกเบ™เบเปˆเบญเบ login.k8s.example.com ะธ dex.k8s.example.com, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™ SSL เบชเปเบฒเบฅเบฑเบš ingress.

เบกเบฒเบชเป‰เบฒเบ‡เปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™ 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

ClusterIssuer เบ—เบตเปˆเบกเบตเบซเบปเบงเบ‚เปเป‰ 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 เปเบฅเบฐเบ›เบฑเบšเบ›เบธเบ‡ cluster:

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

เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ เป‚เบ„เบš เบชเปเบฒเบฅเบฑเบš deploy clusters, เปเบ•เปˆเบ™เบตเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบชเปเบฒเบฅเบฑเบš เบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบเบธเปˆเบกเบญเบทเปˆเบ™เป†.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Dex เปเบฅเบฐ dex-k8s-authenticator

เป€เบžเบทเปˆเบญเปƒเบซเป‰ Dex เป€เบฎเบฑเบ”เบงเบฝเบ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เปเบฅเบฐเบเบฐเปเบˆเบˆเบฒเบเปเบกเปˆเปเบšเบš Kubernetes, เปƒเบซเป‰เป€เบญเบปเบฒเบกเบฑเบ™เบˆเบฒเบเบšเปˆเบญเบ™เบ™เบฑเป‰เบ™:

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

เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒ clone repository dex-k8s-authenticator:

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

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป„เบŸเบฅเปŒเบ„เบธเบ™เบ„เปˆเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ„เปˆเบฒเบ•เบปเบงเปเบ›เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบขเปˆเบฒเบ‡เบเบทเบ”เบซเบเบธเปˆเบ™ HELM เบ•เบฒเบ•เบฐเบฅเบฒเบ‡.

เปƒเบซเป‰เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบš Dex:

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

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

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

เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ (Dex เบ„เบงเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™เบฅเบฐเบซเบฑเบ” 400, เปเบฅเบฐ dex-k8s-autheticator เบ„เบงเบ™เบเบฑเบšเบ„เบทเบ™เบฅเบฐเบซเบฑเบ” 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 เบ‚เบญเบ‡เบ—เปˆเบฒเบ™:

เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™ Kubernetes เป‚เบ”เบเปƒเบŠเป‰ GitHub OAuth เปเบฅเบฐ Dex
เปœเป‰เบฒเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš

เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™ Kubernetes เป‚เบ”เบเปƒเบŠเป‰ GitHub OAuth เปเบฅเบฐ Dex
เปœเป‰เบฒเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบ–เบทเบเบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒ GitHub

เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™ Kubernetes เป‚เบ”เบเปƒเบŠเป‰ GitHub OAuth เปเบฅเบฐ Dex
 เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบเบˆเบฒเบเบซเบ™เป‰เบฒเป€เบงเบฑเบš, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰ 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 เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบญเบปเบ‡เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เปเบฅเบฐเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš pods, เปเบ•เปˆเบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเบกเบตเบชเบดเบ”เบ—เบตเปˆเบˆเบฐเบ›เปˆเบฝเบ™เบžเบงเบเบกเบฑเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™