Pagpamatuod sa Kubernetes gamit ang GitHub OAuth ug Dex

Gipresentar ko sa imong pagtagad ang usa ka panudlo alang sa pagmugna og access sa usa ka Kubernetes cluster gamit ang Dex, dex-k8s-authenticator ug GitHub.

Pagpamatuod sa Kubernetes gamit ang GitHub OAuth ug Dex
Lokal nga meme gikan sa Russian-language Kubernetes chat in telegrama

Pasiuna

Gigamit namo ang Kubernetes sa paghimo og mga dinamikong palibot para sa development ug QA team. Busa gusto namong hatagan silag access sa cluster para sa dashboard ug kubectl. Dili sama sa OpenShift, ang vanilla Kubernetes walay lumad nga panghimatuud, mao nga gigamit namo ang mga himan sa ikatulo nga partido alang niini.

Sa kini nga pag-configure among gigamit:

  • dex-k8s-authenticatorβ€Š - aplikasyon sa web alang sa paghimo sa kubectl config
  • Dex - OpenID Connect provider
  • GitHub - tungod lang kay gigamit namo ang GitHub sa among kompanya

Gisulayan namon nga gamiton ang Google OIDC, apan sa kasubo kami napakyas aron magsugod sila sa mga grupo, mao nga ang panagsama sa GitHub haum kaayo kanamo. Kung walay pagmapa sa grupo, dili mahimo ang paghimo sa mga palisiya sa RBAC base sa mga grupo.

Busa, sa unsang paagi ang proseso sa pagtugot sa Kubernetes molihok sa usa ka biswal nga representasyon:

Pagpamatuod sa Kubernetes gamit ang GitHub OAuth ug Dex
Proseso sa pagtugot

Usa ka gamay nga detalye ug punto sa punto:

  1. User logs sa dex-k8s-authenticator (login.k8s.example.com)
  2. Gipasa sa dex-k8s-authenticator ang hangyo sa Dex (dex.k8s.example.com)
  3. Gi-redirect ni Dex ang panid sa pag-login sa GitHub
  4. Ang GitHub nagmugna sa gikinahanglan nga impormasyon sa pagtugot ug gibalik kini sa Dex
  5. Gipasa ni Dex ang nadawat nga kasayuran sa dex-k8s-authenticator
  6. Ang user makadawat ug OIDC token gikan sa GitHub
  7. Ang dex-k8s-authenticator nagdugang token sa kubeconfig
  8. Gipasa sa kubectl ang token sa KubeAPIServer
  9. Gibalik sa KubeAPIServer ang mga access sa kubectl base sa gipasa nga token
  10. Ang user makakuha og access gikan sa kubectl

Mga aksyon nga giandam

Siyempre, aduna na kitay naka-install nga Kubernetes cluster (k8s.example.com), ug dala usab ang HELM nga pre-installed. Adunay usab kami usa ka organisasyon sa GitHub (super-org).
Kung wala kay HELM, i-install kini yano kaayo.

Una kinahanglan naton i-set up ang GitHub.

Adto sa pahina sa mga setting sa organisasyon, (https://github.com/organizations/super-org/settings/applications) ug paghimo ug bag-ong aplikasyon (Awtorisadong OAuth App):
Pagpamatuod sa Kubernetes gamit ang GitHub OAuth ug Dex
Paghimo og bag-ong aplikasyon sa GitHub

Pun-a ang mga natad sa gikinahanglan nga mga URL, pananglitan:

  • URL sa Panimalay: https://dex.k8s.example.com
  • URL sa pagtawag balik sa pagtugot: https://dex.k8s.example.com/callback

Pag-amping sa mga link, hinungdanon nga dili mawala ang mga laslas.

Agig tubag sa usa ka nakompleto nga porma, ang GitHub makamugna Client ID ΠΈ Client secret, ibutang kini sa luwas nga dapit, kini mapuslanon kanato (pananglitan, atong gamiton Vault alang sa pagtipig sa mga sekreto):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

Pag-andam sa mga rekord sa DNS alang sa mga subdomain login.k8s.example.com ΠΈ dex.k8s.example.com, ingon man mga sertipiko sa SSL alang sa pagsulod.

Maghimo kita og mga sertipiko sa 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 nga adunay titulo le-clusterissuer kinahanglan nga anaa na, apan kung dili, buhata kini gamit ang 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

Konfigurasyon sa KubeAPIServer

Para mugana ang kubeAPIServer, kinahanglan nimong i-configure ang OIDC ug i-update ang 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

Gigamit namon kops alang sa pag-deploy sa mga kumpol, apan parehas kini nga nagtrabaho alang sa ubang cluster managers.

Dex configuration ug dex-k8s-authenticator

Aron makatrabaho si Dex, kinahanglan ka nga adunay sertipiko ug usa ka yawe gikan sa master sa Kubernetes, kuhaa kini gikan didto:

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

Atong i-clone ang dex-k8s-authenticator repository:

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

Gamit ang mga file nga kantidad, mahimo namon nga dali nga ma-configure ang mga variable para sa among HELM nga mga tsart.

Atong ihulagway ang configuration alang sa 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

Ug alang sa 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

I-install ang Dex ug 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

Atong susihon ang pag-andar sa mga serbisyo (Dex kinahanglan ibalik ang code 400, ug ang dex-k8s-authenticator kinahanglan ibalik ang code 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 configuration

Naghimo kami usa ka ClusterRole alang sa grupo, sa among kaso nga adunay read-only nga pag-access:

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

Maghimo kita og configuration para sa 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

Karon andam na kami alang sa pagsulay.

Mga Pagsulay

Adto sa login page (https://login.k8s.example.com) ug pag-log in gamit ang imong GitHub account:

Pagpamatuod sa Kubernetes gamit ang GitHub OAuth ug Dex
Login nga panid

Pagpamatuod sa Kubernetes gamit ang GitHub OAuth ug Dex
Ang panid sa pag-login gi-redirect sa GitHub

Pagpamatuod sa Kubernetes gamit ang GitHub OAuth ug Dex
 Sunda ang namugna nga mga instruksyon aron maka-access

Pagkahuman sa pagkopya-paste gikan sa panid sa web, magamit namon ang kubectl aron madumala ang among mga kapanguhaan sa cluster:

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"

Ug kini molihok, ang tanan nga tiggamit sa GitHub sa among organisasyon makakita sa mga kapanguhaan ug maka-log in sa mga pod, apan wala silay katungod sa pag-usab niini.

Source: www.habr.com

Idugang sa usa ka comment