Dilysu yn Kubernetes gan ddefnyddio GitHub OAuth a Dex

Rwy'n cyflwyno tiwtorial i'ch sylw ar gyfer cynhyrchu mynediad i glwstwr Kubernetes gan ddefnyddio Dex, dex-k8s-authenticator a GitHub.

Dilysu yn Kubernetes gan ddefnyddio GitHub OAuth a Dex
Meme lleol o'r Kubernetes iaith Rwsieg sgwrsio yn Telegram

Cyflwyniad

Rydym yn defnyddio Kubernetes i greu amgylcheddau deinamig ar gyfer y tîm datblygu a sicrhau ansawdd. Felly rydym am roi mynediad iddynt i'r clwstwr ar gyfer y dangosfwrdd a'r kubectl. Yn wahanol i OpenShift, nid oes gan fanila Kubernetes ddilysu brodorol, felly rydym yn defnyddio offer trydydd parti ar gyfer hyn.

Yn y cyfluniad hwn rydym yn defnyddio:

  • dex-k8s-dilyswr  — cymhwysiad gwe ar gyfer cynhyrchu cyfluniad kubectl
  • Dex — Darparwr OpenID Connect
  • GitHub - yn syml oherwydd ein bod yn defnyddio GitHub yn ein cwmni

Fe wnaethon ni geisio defnyddio Google OIDC, ond yn anffodus ni wedi methu i'w cychwyn gyda grwpiau, felly roedd yr integreiddio â GitHub yn gweddu'n eithaf da i ni. Heb fapio grŵp, ni fydd yn bosibl creu polisïau RBAC yn seiliedig ar grwpiau.

Felly, sut mae ein proses awdurdodi Kubernetes yn gweithio mewn cynrychiolaeth weledol:

Dilysu yn Kubernetes gan ddefnyddio GitHub OAuth a Dex
Proses awdurdodi

Ychydig mwy o fanylion ac fesul pwynt:

  1. Defnyddiwr yn mewngofnodi i dex-k8s-authenticator (login.k8s.example.com)
  2. dex-k8s-authenticator yn anfon y cais ymlaen at Dex (dex.k8s.example.com)
  3. Mae Dex yn ailgyfeirio i dudalen mewngofnodi GitHub
  4. Mae GitHub yn cynhyrchu'r wybodaeth awdurdodi angenrheidiol ac yn ei dychwelyd i Dex
  5. Mae Dex yn trosglwyddo'r wybodaeth a dderbyniwyd i dex-k8s-authenticator
  6. Mae'r defnyddiwr yn derbyn tocyn OIDC gan GitHub
  7. dex-k8s-authenticator yn ychwanegu tocyn at kubeconfig
  8. kubectl yn trosglwyddo'r tocyn i KubeAPIServer
  9. Mae KubeAPIServer yn dychwelyd mynediadau i kubectl yn seiliedig ar y tocyn a basiwyd
  10. Mae'r defnyddiwr yn cael mynediad o kubectl

camau gweithredu paratoadol

Wrth gwrs, mae gennym eisoes glwstwr Kubernetes wedi'i osod (k8s.example.com), a hefyd yn dod gyda HELM wedi'i osod ymlaen llaw. Mae gennym hefyd sefydliad ar GitHub (super-org).
Os nad oes gennych HELM, gosodwch ef syml iawn.

Yn gyntaf mae angen i ni sefydlu GitHub.

Ewch i dudalen gosodiadau'r sefydliad, (https://github.com/organizations/super-org/settings/applications) a chreu cais newydd (App OAuth Awdurdodedig):
Dilysu yn Kubernetes gan ddefnyddio GitHub OAuth a Dex
Creu cais newydd ar GitHub

Llenwch y meysydd gyda'r URLau angenrheidiol, er enghraifft:

  • URL hafan: https://dex.k8s.example.com
  • URL galwad yn ôl awdurdodiad: https://dex.k8s.example.com/callback

Byddwch yn ofalus gyda chysylltiadau, mae'n bwysig peidio â cholli slaes.

Mewn ymateb i ffurflen wedi'i chwblhau, bydd GitHub yn cynhyrchu Client ID и Client secret, cadwch nhw mewn lle diogel, byddant yn ddefnyddiol i ni (er enghraifft, rydym yn defnyddio Bwlch ar gyfer storio cyfrinachau):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

Paratoi cofnodion DNS ar gyfer is-barthau login.k8s.example.com и dex.k8s.example.com, yn ogystal â thystysgrifau SSL ar gyfer mynediad.

Gadewch i ni greu tystysgrifau 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

Cyhoeddwr Clwstwr gyda theitl le-clusterissuer dylai fodoli eisoes, ond os na, crëwch ef gan ddefnyddio 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

Ffurfweddiad KubeAPISserver

Er mwyn i kubeAPIServer weithio, mae angen i chi ffurfweddu OIDC a diweddaru'r clwstwr:

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

Rydym yn defnyddio cwps ar gyfer lleoli clystyrau, ond mae hyn yn gweithio'n debyg ar gyfer rheolwyr clwstwr eraill.

Cyfluniad Dex a dex-k8s-authenticator

Er mwyn i Dex weithio, mae angen i chi gael tystysgrif ac allwedd gan feistr Kubernetes, gadewch i ni ei chael oddi yno:

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

Gadewch i ni glonio'r ystorfa dex-k8s-authenticator:

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

Gan ddefnyddio ffeiliau gwerthoedd, gallwn ffurfweddu newidynnau hyblyg ar gyfer ein Siartiau HELM.

Gadewch i ni ddisgrifio'r cyfluniad ar gyfer 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

Ac ar gyfer 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

Gosod Dex a 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

Gadewch i ni wirio ymarferoldeb y gwasanaethau (dylai Dex ddychwelyd cod 400, a dylai dex-k8s-authenticator ddychwelyd cod 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

Cyfluniad RBAC

Rydym yn creu Rôl Clwstwr ar gyfer y grŵp, yn ein hachos ni gyda mynediad darllen yn unig:

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

Gadewch i ni greu cyfluniad ar gyfer 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

Nawr rydym yn barod ar gyfer profi.

Profion

Ewch i'r dudalen mewngofnodi (https://login.k8s.example.com) a mewngofnodwch gan ddefnyddio'ch cyfrif GitHub:

Dilysu yn Kubernetes gan ddefnyddio GitHub OAuth a Dex
Tudalen mewngofnodi

Dilysu yn Kubernetes gan ddefnyddio GitHub OAuth a Dex
Tudalen mewngofnodi wedi'i hailgyfeirio i GitHub

Dilysu yn Kubernetes gan ddefnyddio GitHub OAuth a Dex
 Dilynwch y cyfarwyddiadau a gynhyrchwyd i gael mynediad

Ar ôl copïo-gludo o'r dudalen we, gallwn ddefnyddio kubectl i reoli adnoddau ein clwstwr:

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"

Ac mae'n gweithio, gall holl ddefnyddwyr GitHub yn ein sefydliad weld adnoddau a mewngofnodi i godau, ond nid oes ganddynt hawliau i'w newid.

Ffynhonnell: hab.com

Ychwanegu sylw