Kubernetes-todennus GitHub OAuthin ja Dexin avulla

Esitän huomioillesi opetusohjelman, jolla luodaan pääsy Kubernetes-klusteriin Dexin, dex-k8s-authenticatorin ja GitHubin avulla.

Kubernetes-todennus GitHub OAuthin ja Dexin avulla
Paikallinen meem venäjänkielisestä Kubernetesista chattailee Telegram

Esittely

Käytämme Kubernetesia dynaamisten ympäristöjen luomiseen kehitystiimille ja laadunvarmistukselle. Joten haluamme antaa heille pääsyn klusteriin sekä kojelaudalle että kubectlille. Toisin kuin samassa OpenShiftissä, vanilla Kubernetesilla ei ole alkuperäistä todennusta, joten käytämme tähän kolmannen osapuolen työkaluja.

Tässä kokoonpanossa käytämme:

  • dex-k8s-authenticator  - Web-sovellus kubectl-asetusten luomiseen
  • Dex - OpenID Connect -palveluntarjoaja
  • GitHub – yksinkertaisesti siksi, että käytämme GitHubia yrityksessämme

Yritimme käyttää Google OIDC:tä, mutta valitettavasti yritimme epäonnistui aloittaa ne ryhmillä, joten integraatio GitHubin kanssa sopi meille mainiosti. Ilman ryhmäkartoitusta ei ole mahdollista luoda ryhmäpohjaisia ​​RBAC-käytäntöjä.

Joten miten Kubernetes-valtuutusprosessimme toimii visuaalisessa esityksessä:

Kubernetes-todennus GitHub OAuthin ja Dexin avulla
Valtuutusprosessi

Hieman tarkemmin ja kohta kohdalta:

  1. Käyttäjä kirjautuu sisään dex-k8s-authenticatoriin (login.k8s.example.com)
  2. dex-k8s-authenticator uudelleenohjaa pyynnön Dexille (dex.k8s.example.com)
  3. Dex uudelleenohjaa GitHubin kirjautumissivulle
  4. GitHub luo tarvittavat valtuutustiedot ja palauttaa ne Dexille
  5. Dex välittää vastaanotetut tiedot dex-k8s-authenticatorille
  6. Käyttäjä saa OIDC-tunnuksen GitHubista
  7. dex-k8s-authenticator lisää tunnuksen kubeconfigiin
  8. kubectl välittää tunnuksen KubeAPIServerille
  9. Välitettyyn tunnukseen perustuva KubeAPIServer palauttaa pääsyn kubectliin
  10. Käyttäjät pääsevät kubectl

Valmistelutoimet

Tietenkin meillä on jo asennettu Kubernetes-klusteri (k8s.example.com), sekä esiasennettu HELM. Meillä on myös organisaatio GitHubissa (super-org).
Jos sinulla ei ole HELMiä, asenna se hyvin yksinkertainen.

Ensin meidän on määritettävä GitHub.

Siirry organisaation asetussivulle, (https://github.com/organizations/super-org/settings/applications) ja luo uusi sovellus (valtuutettu OAuth-sovellus):
Kubernetes-todennus GitHub OAuthin ja Dexin avulla
Luo uusi sovellus GitHubissa

Täytä kentät vaadituilla URL-osoitteilla, esimerkiksi:

  • Kotisivun URL-osoite: https://dex.k8s.example.com
  • Valtuutuksen takaisinsoitto-URL-osoite: https://dex.k8s.example.com/callback

Ole varovainen linkkien kanssa, on tärkeää, ettet menetä vinoviivoja.

Vastauksena täytettyyn lomakkeeseen GitHub luo Client ID и Client secret, tallenna ne turvalliseen paikkaan, niistä on meille hyötyä (käytämme esimerkiksi Holvi salaisuuksien säilyttämiseksi):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

Valmistele DNS-tietueet aliverkkotunnuksille login.k8s.example.com и dex.k8s.example.com, sekä SSL-sertifikaatit sisääntuloille.

Luodaan SSL-varmenteita:

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 ja otsikko le-clusterissuer pitäisi olla jo olemassa, jos ei, luo se HELMillä:

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

Jotta kubeAPIServer toimisi, sinun on määritettävä OIDC ja päivitettävä klusteri:

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

Käytämme potkia laajentaa klustereita, mutta se toimii samalla tavalla muut klusterin johtajat.

Dex-määritys ja dex-k8s-auhenticator

Jotta Dex toimisi, sinulla on oltava Kubernetes-masterin sertifikaatti ja avain, vedämme sen sieltä:

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

Kloonaa dex-k8s-authenticator-arkisto:

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

Arvotiedostojen avulla voimme asettaa muuttujia joustavasti HELM-kaaviot.

Kuvataan Dexin kokoonpano:

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-authenticatorille:

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

Asenna 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

Tarkastetaan palveluiden käytettävyys (Dexin pitäisi palauttaa koodi 400 ja dex-k8s-authenticator palauttaa koodin 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-kokoonpano

Luo ryhmälle ClusterRole, meidän tapauksessamme vain luku -oikeudet:

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

Luodaan kokoonpano ClusterRoleBindingille:

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

Nyt olemme valmiita testaukseen.

testit

Siirry kirjautumissivullehttps://login.k8s.example.com) ja kirjaudu sisään GitHub-tilillä:

Kubernetes-todennus GitHub OAuthin ja Dexin avulla
Valtuutussivu

Kubernetes-todennus GitHub OAuthin ja Dexin avulla
Valtuutussivu uudelleenohjattiin GitHubille

Kubernetes-todennus GitHub OAuthin ja Dexin avulla
 Noudata luotuja ohjeita päästäksesi sisään

Kun kopioimme ja liitämme verkkosivulta, voimme käyttää kubectlia klusteriresurssien hallintaan:

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 se toimii, kaikki organisaatiomme GitHub-käyttäjät voivat nähdä resurssit ja kirjautua podeihin, mutta heillä ei ole oikeutta muuttaa niitä.

Lähde: will.com

Lisää kommentti