αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ GitHub OAuth αž“αž·αž„ Dex

αžαŸ’αž‰αž»αŸ†αž’αŸ’αžœαžΎαž”αž‘αž”αž„αŸ’αž αžΆαž‰αžŠαž›αŸ‹αž€αžΆαžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αžΌαžœαž˜αŸαžšαŸ€αž“αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž…αž„αŸ’αž€αŸ„αž˜ Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ Dex, dex-k8s-authenticator αž“αž·αž„ GitHub αŸ”

αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ GitHub OAuth αž“αž·αž„ Dex
meme αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αž–αžΈ Kubernetes αž‡αž‡αŸ‚αž€αž‡αžΆαž—αžΆαžŸαžΆαžšαž»αžŸαŸ’αžŸαžΈ Telegram

αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†

αž™αžΎαž„αž”αŸ’αžšαžΎ Kubernetes αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž”αžšαž·αž™αžΆαž€αžΆαžŸαžαžΆαž˜αžœαž“αŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž€αŸ’αžšαž»αž˜ QAαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž…αž„αŸ‹αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž–αž½αž€αž‚αŸαž“αžΌαžœαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž…αž„αŸ’αž€αŸ„αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž“αž·αž„ kubectlαŸ” αž˜αž·αž“αžŠαžΌαž… OpenShift αž‘αŸ vanilla Kubernetes αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžŠαžΎαž˜αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαž—αžΆαž‚αžΈαž‘αžΈαž”αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž“αŸαŸ‡αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αŸαŸ‡ αž™αžΎαž„αž”αŸ’αžšαžΎαŸ–

  • dex-k8s-αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹β€Š - αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžŽαŸ’αžαžΆαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ kubectl
  • Dex - αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆ OpenID Connect
  • GitHub - αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž™αžΎαž„αž”αŸ’αžšαžΎ GitHub αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αž™αžΎαž„αž”αžΆαž“αž–αŸ’αž™αžΆαž™αžΆαž˜αž”αŸ’αžšαžΎ Google ODC αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž’αž€αž»αžŸαž›αž™αžΎαž„ αž”αžΆαž“αž”αžšαžΆαž‡αŸαž™ αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž–αž½αž€αžœαžΆαž‡αžΆαž˜αž½αž™αž€αŸ’αžšαž»αž˜ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™ GitHub αžŸαžΆαž€αžŸαž˜αž“αžΉαž„αž™αžΎαž„αžŽαžΆαžŸαŸ‹αŸ” αž”αžΎαž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž’αŸ’αžœαžΎαž•αŸ‚αž“αž‘αžΈαž‡αžΆαž€αŸ’αžšαž»αž˜αž‘αŸ αžœαžΆαž“αžΉαž„αž˜αž·αž“αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž‚αŸ„αž›αž€αžΆαžšαžŽαŸ RBAC αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αŸ’αžšαž»αž˜αž”αžΆαž“αž‘αŸαŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžαžΎαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž•αŸ’αžαž›αŸ‹αžŸαž·αž‘αŸ’αž’αž· Kubernetes αžšαž”αžŸαŸ‹αž™αžΎαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αžšαžΌαž”αž—αžΆαž–αŸ–

αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes αžŠαŸ„αž™αž”αŸ’αžšαžΎ GitHub OAuth αž“αž·αž„ Dex
αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž

αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαž·αž…αž αžΎαž™αž…αž„αŸ’αž’αž»αž›αž‘αŸ…αž…αŸ†αžŽαž»αž…αž˜αž½αž™αŸ–

  1. αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„ dex-k8s-autheticator (login.k8s.example.com)
  2. dex-k8s-authentiator αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαžŸαŸ†αžŽαžΎαž‘αŸ… Dex (dex.k8s.example.com)
  3. Dex αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž‘αŸ…αž‘αŸ†αž–αŸαžšαž…αžΌαž› GitHub
  4. GitHub αž”αž„αŸ’αž€αžΎαžαž–αŸαžαŸŒαž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αžœαžΆαž‘αŸ… Dex
  5. Dex αž”αž‰αŸ’αž‡αžΌαž“αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž‘αŸ… dex-k8s-authentiator
  6. αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αž‘αž½αž›αž”αžΆαž“αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹ ODC αž–αžΈ GitHub
  7. dex-k8s-authentiator αž”αž“αŸ’αžαŸ‚αž˜αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αŸ… kubeconfig
  8. kubectl αž”αž‰αŸ’αž‡αžΌαž“αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αŸ… KubeAPIServer
  9. KubeAPIServer αžαŸ’αžšαž‘αž”αŸ‹αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎ kubectl αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αž˜αŸαž
  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

αž”αŸ†αž–αŸαž‰αž€αŸ’αž“αž»αž„αžœαžΆαž›αž‡αžΆαž˜αž½αž™ URLs αž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž§αž‘αžΆαž αžšαžŽαŸαŸ–

  • 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

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 αž“αž·αž„αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž…αž„αŸ’αž€αŸ„αž˜αŸ–

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 αž“αž·αž„ 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-----

αžαŸ„αŸ‡αž€αŸ’αž›αžΌαž“αžƒαŸ’αž›αžΆαŸ†αž„ 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-authentiatorαŸ–

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-authentiatorαŸ–

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

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

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