Kubernetes-verifikasie met GitHub OAuth en Dex

Ek bied aan u aandag 'n handleiding vir die generering van toegang tot 'n Kubernetes-kluster met behulp van Dex, dex-k8s-authenticator en GitHub.

Kubernetes-verifikasie met GitHub OAuth en Dex
Plaaslike meme van die Russiestalige Kubernetes gesels in telegram

Inleiding

Ons gebruik Kubernetes om dinamiese omgewings vir die ontwikkelingspan en QA te skep. Ons wil hulle dus toegang gee tot die groepering vir beide die dashboard en kubectl. Anders as dieselfde OpenShift, het vanilla Kubernetes nie inheemse verifikasie nie, daarom gebruik ons ​​derdeparty-nutsgoed hiervoor.

In hierdie konfigurasie gebruik ons:

  • dex-k8s-authenticator  - webtoepassing vir die generering van kubectl config
  • Dex - OpenID Connect-verskaffer
  • GitHub - bloot omdat ons GitHub in ons maatskappy gebruik

Ons het probeer om Google OIDC te gebruik, maar ons het ongelukkig misluk om hulle met groepe te begin, so die integrasie met GitHub het ons goed gepas. Sonder groepkartering sal dit nie moontlik wees om groepgebaseerde RBAC-beleide te skep nie.

Dus, hoe werk ons ​​Kubernetes-magtigingsproses in 'n visuele voorstelling:

Kubernetes-verifikasie met GitHub OAuth en Dex
Magtigingsproses

'n Bietjie meer detail en punt vir punt:

  1. Gebruiker meld aan by dex-k8s-authenticator (login.k8s.example.com)
  2. dex-k8s-authenticator herlei die versoek na Dex (dex.k8s.example.com)
  3. Dex herlei na GitHub-aanmeldbladsy
  4. GitHub genereer die vereiste magtigingsinligting en stuur dit terug na Dex
  5. Dex gee die ontvangde inligting deur aan dex-k8s-authenticator
  6. Gebruiker kry OIDC-token van GitHub
  7. dex-k8s-authenticator voeg token by kubeconfig
  8. kubectl gee token aan KubeAPIServer
  9. KubeAPIServer gebaseer op die geslaagde token gee toegang tot kubectl terug
  10. Gebruikerstoegang vanaf kubectl

Voorbereidende aksies

Ons het natuurlik reeds 'n Kubernetes-kluster geïnstalleer (k8s.example.com), sowel as HELM vooraf geïnstalleer. Ons het ook 'n organisasie op GitHub (super-org).
As jy nie HELM het nie, installeer dit baie eenvoudige.

Eerstens moet ons GitHub opstel.

Gaan na die organisasie-instellingsbladsy, (https://github.com/organizations/super-org/settings/applications) en skep 'n nuwe toepassing (gemagtigde OAuth-toepassing):
Kubernetes-verifikasie met GitHub OAuth en Dex
Skep 'n nuwe toepassing op GitHub

Vul die velde in met die vereiste URL's, byvoorbeeld:

  • Tuisblad URL: https://dex.k8s.example.com
  • Magtiging-terugbel-URL: https://dex.k8s.example.com/callback

Wees versigtig met skakels, dit is belangrik om nie deeltekens te verloor nie.

In reaksie op die voltooide vorm, sal GitHub genereer Client ID и Client secret, stoor hulle op 'n veilige plek, hulle sal vir ons nuttig wees (ons gebruik byvoorbeeld kluis om geheime te bewaar):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

Berei DNS-rekords vir subdomeine voor login.k8s.example.com и dex.k8s.example.com, sowel as SSL-sertifikate vir ingange.

Kom ons skep SSL-sertifikate:

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

Groepuitreiker met titel le-clusterissuer behoort reeds te bestaan, indien nie, skep dit met 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-konfigurasie

Vir kubeAPIServer om te werk, moet jy OIDC konfigureer en die groepering opgradeer:

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

Ons gebruik skop groepe uit te brei, maar dit werk op dieselfde manier vir ander klusterbestuurders.

Dex-konfigurasie en dex-k8s-authenticator

Vir Dex om te werk, moet jy 'n sertifikaat en 'n sleutel van die Kubernetes-meester hê, ons sal dit daarvandaan uithaal:

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

Kloon die dex-k8s-authenticator-bewaarplek:

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

Met behulp van waardes-lêers kan ons veranderlikes buigsaam vir ons opstel HELM kaarte.

Kom ons beskryf die konfigurasie vir 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

En vir 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

Installeer Dex en 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

Kom ons kyk na die diensbaarheid van die dienste (Dex moet kode 400 terugstuur, en dex-k8s-authenticator moet kode 200 terugstuur):

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-konfigurasie

Skep 'n ClusterRole vir die groep, in ons geval met leesalleentoegang:

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

Kom ons skep 'n konfigurasie vir 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

Nou is ons gereed vir toetsing.

toetse

Gaan na die aanmeldbladsyhttps://login.k8s.example.com) en meld aan met 'n GitHub-rekening:

Kubernetes-verifikasie met GitHub OAuth en Dex
Magtigingsbladsy

Kubernetes-verifikasie met GitHub OAuth en Dex
Magtigingbladsy herlei na GitHub

Kubernetes-verifikasie met GitHub OAuth en Dex
 Volg die gegenereerde instruksies om toegang te verkry

Nadat ons van die webblad af gekopieer het, kan ons kubectl gebruik om ons groephulpbronne te bestuur:

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"

En dit werk, alle GitHub-gebruikers in ons organisasie kan hulpbronne sien en by peule aanmeld, maar hulle het nie toestemming om dit te verander nie.

Bron: will.com

Voeg 'n opmerking