Kubernetese autentimine GitHub OAuthi ja Dexiga

Esitan teie tähelepanu õpetuse, kuidas luua juurdepääs Kubernetese klastrile Dexi, dex-k8s-autentiaatori ja GitHubi abil.

Kubernetese autentimine GitHub OAuthi ja Dexiga
Kohalik meem venekeelsest Kubernetesest vestleb Telegramm

Sissejuhatus

Kasutame Kubernetesi arendusmeeskonna ja kvaliteedikontrolli jaoks dünaamiliste keskkondade loomiseks. Seega tahame anda neile juurdepääsu klastrile nii armatuurlaua kui ka kubectli jaoks. Erinevalt samast OpenShiftist pole vanilje Kubernetesil natiivset autentimist, seega kasutame selleks kolmanda osapoole tööriistu.

Selles konfiguratsioonis kasutame:

  • dex-k8s-autentiaator  - veebirakendus kubectl konfiguratsiooni genereerimiseks
  • Dex - OpenID Connect pakkuja
  • GitHub – lihtsalt sellepärast, et kasutame oma ettevõttes GitHubi

Proovisime kasutada Google OIDC-d, kuid kahjuks kasutasime ebaõnnestus et neid rühmadega alustada, nii et GitHubiga integreerimine sobis meile suurepäraselt. Ilma rühma vastendamiseta ei ole võimalik luua rühmapõhiseid RBAC-poliitikaid.

Niisiis, kuidas meie Kubernetese autoriseerimisprotsess töötab visuaalses esituses:

Kubernetese autentimine GitHub OAuthi ja Dexiga
Autoriseerimisprotsess

Natuke täpsemalt ja punkt-punktilt:

  1. Kasutaja logib sisse dex-k8s-authenticatori (login.k8s.example.com)
  2. dex-k8s-authenticator suunab päringu Dexi (dex.k8s.example.com)
  3. Dex suunab ümber GitHubi sisselogimislehele
  4. GitHub genereerib vajaliku autoriseerimise teabe ja tagastab selle Dexile
  5. Dex edastab saadud teabe dex-k8s-authenticatorile
  6. Kasutaja saab GitHubilt OIDC-märgi
  7. dex-k8s-authenticator lisab kubeconfigile märgi
  8. kubectl edastab loa KubeAPIServerile
  9. Edastatud märgil põhinev KubeAPIServer tagastab juurdepääsu kubectlile
  10. Kasutajate juurdepääsud saidilt kubectl

Ettevalmistavad toimingud

Muidugi on meil juba installitud Kubernetese klaster (k8s.example.com), samuti eelinstallitud HELM. Meil on ka organisatsioon GitHubis (super-org).
Kui teil pole HELM-i, installige see väga lihtne.

Kõigepealt peame seadistama GitHubi.

Minge organisatsiooni seadete lehele (https://github.com/organizations/super-org/settings/applications) ja looge uus rakendus (volitatud OAuthi rakendus):
Kubernetese autentimine GitHub OAuthi ja Dexiga
Looge GitHubis uus rakendus

Täitke väljad nõutud URL-idega, näiteks:

  • Avalehe URL: https://dex.k8s.example.com
  • Volituse tagasihelistamise URL: https://dex.k8s.example.com/callback

Olge linkidega ettevaatlik, oluline on mitte kaotada kaldkriipse.

Vastuseks täidetud vormile loob GitHub Client ID и Client secret, salvestage need kindlasse kohta, on need meile kasulikud (näiteks kasutame võlvkelder saladuste hoidmiseks):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

Valmistage alamdomeenide jaoks ette DNS-kirjed login.k8s.example.com и dex.k8s.example.com, samuti sissepääsude SSL-sertifikaadid.

Loome SSL-sertifikaadid:

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 koos pealkirjaga le-clusterissuer peaks juba olemas olema, kui ei, siis loo see HELM-i abil:

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

KubeAPIServeri konfiguratsioon

KubeAPIServeri töötamiseks peate konfigureerima OIDC ja uuendama klastri:

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

Me kasutame lööma klastrite laiendamiseks, kuid see toimib samamoodi teised klastrijuhid.

Dexi konfiguratsioon ja dex-k8s-autentiaator

Dexi töötamiseks peab teil olema Kubernetese meistri sertifikaat ja võti, me tõmbame selle sealt välja:

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

Kloonige dex-k8s-autentifikaatori hoidla:

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

Väärtusfailide abil saame oma jaoks paindlikult muutujaid seadistada HELM graafikud.

Kirjeldame Dexi konfiguratsiooni:

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

Ja dex-k8s-authenticatori jaoks:

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

Installige Dex ja 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

Kontrollime teenuste kasutatavust (Dex peaks tagastama koodi 400 ja dex-k8s-authenticator peaks tagastama koodi 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 konfiguratsioon

Looge rühma jaoks ClusterRole, meie puhul kirjutuskaitstud juurdepääsuga:

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

Loome ClusterRoleBindingu jaoks konfiguratsiooni:

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

Nüüd oleme testimiseks valmis.

Testid

Mine sisselogimislehelehttps://login.k8s.example.com) ja logige sisse GitHubi kontoga:

Kubernetese autentimine GitHub OAuthi ja Dexiga
Autoriseerimisleht

Kubernetese autentimine GitHub OAuthi ja Dexiga
Autoriseerimisleht suunati GitHubi

Kubernetese autentimine GitHub OAuthi ja Dexiga
 Juurdepääsu saamiseks järgige loodud juhiseid

Pärast veebilehelt kopeerimist ja kleepimist saame kasutada kubectli oma klastri ressursside haldamiseks:

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"

Ja see töötab, kõik meie organisatsiooni GitHubi kasutajad näevad ressursse ja logivad sisse, kuid neil pole luba neid muuta.

Allikas: www.habr.com

Lisa kommentaar