Autentifikimi në Kubernetes me GitHub OAuth dhe Dex

Ju kujtoj tutorialin për krijimin e aksesit në Kubernetes me ndihmën e Dex, dex-k8s-authenticator dhe GitHub.

Autentifikimi në Kubernetes me GitHub OAuth dhe Dex
Një meme lokale nga biseda në gjuhën ruse për Kubernetes në Telegram

Hyrje

Ne përdorim Kubernetes për të krijuar mjedise dinamike për ekipet e zhvilluesve dhe QA. Në këtë mënyrë, duam t'u japim atyre akses në klaster si për dashboard-in ashtu edhe për kubectl. Ndryshe nga OpenShift, Kubernetes standard nuk ka autentifikim native, prandaj ne përdorim mjete të jashtme për këtë.

Në këtë konfigurim ne përdorim:

  • dex-k8s-authenticator  — aplikacion web pĂ«r gjenerimin e konfigurimit tĂ« kubectl
  • Dex — ofruesi OpenID Connect
  • GitHub — thjesht sepse ne pĂ«rdorim GitHub nĂ« kompaninĂ« tonĂ«

Ne u përpoqëm të përdorim Google OIDC, por fatkeqësisht nuk arritëm të krijojmë grupet e tyre, prandaj integrimi me GitHub na kënaqi plotësisht. Pa hartimin e grupeve, nuk do të mundim të krijojmë politika RBAC të bazuara në grupe. Prandaj, si funksionon procesi ynë i autorizimit në Kubernetes në një pamje vizuale:

Pak më shumë detaje dhe hap pas hapi:

Autentifikimi në Kubernetes me GitHub OAuth dhe Dex
Procesi i autorizimit

Përdoruesi hyn në dex-k8s-authenticator (

  1. login.k8s.example.comdex-k8s-authenticator ridrejon kërkesën në Dex ()
  2. dex.k8s.example.comDex ridrejon në faqen e autorizimit në GitHub)
  3. GitHub gjeneron informacionin e nevojshëm për autorizim dhe e kthen atë prapa në Dex
  4. Dex e dërgon informacionin e marë në dex-k8s-authenticator
  5. Përdoruesi merr OIDC token nga GitHub
  6. dex-k8s-authenticator e shton token-in në kubeconfig
  7. kubectl e dërgon token-in në KubeAPIServer
  8. KubeAPIServer bazuar në token-in e dërguar kthen akseset në kubectl
  9. Përdoruesi merr akseset nga kubectl
  10. Hapat përgatitore

Natyrisht, ne tashmë kemi një klaster Kubernetes (

k8s.example.com), si dhe HELM të parainstaluar. Gjithashtu, kemi një organizatë në GitHub (super-org).Nëse nuk keni HELM, mund ta instaloni
shumë lehtë Së pari, na duhet të konfigurojmë GitHub..

Shkoni në faqen e cilësimeve të organizatës, (

) dhe krijoni një aplikacion të ri (Aplikacioni i Autorizuar OAuth):https://github.com/organizations/super-org/settings/applicationsKrijimi i një aplikacioni të ri në GitHub
Autentifikimi në Kubernetes me GitHub OAuth dhe Dex
Plotësoni fushat me URL të nevojshme, për shembull:

Homepage URL:

  • Authorization callback URL: https://dex.k8s.example.com
  • Kujdesuni me lidhjet, Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« mos humbni slashes. https://dex.k8s.example.com/callback

Në përgjigje të formularit të plotësuar, GitHub do të gjenerojë

Client secret Identifikuesi i Klientit dhe , mbajini në një vend të sigurt, do t'i nevojitemi (ne për shembull përdorimpër ruajtjen e sekreteve): Vault Client ID: 1ab2c3d4e5f6g7h8 Client secret: 98z76y54x32w1

Përgatitni DNS rekordet për subdomenet

, si dhe certifikatat SSL për ingress-et. dex-k8s-authenticator ridrejon kërkesën në Dex ( dhe Dex ridrejon në faqen e autorizimit në GitHubDo të krijojmë certifikata 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 me emrin

le-clusterissuer duhet tĂ« ekzistojĂ«, nĂ«se jo — ta krijojmĂ« atĂ« me ndihmĂ«n e 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: k8s-admin@example.com privateKeySecretRef: name: le-clusterissuer http01: {} EOF

Konfigurimi i KubeAPIServer

Për funksionimin e kubeAPIServer nevojitet të konfigurohet OIDC dhe të përditësohet klasteri:

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

për implementimin e klasterëve, por kjo funksionon në mënyrë të ngjashme dhe për

Ne përdorim kops menaxherë të tjerë klasterësh Konfigurimi i Dex dhe dex-k8s-authenticator.

Për funksionimin e Dex nevojitet një certifikatë dhe një çelës nga Kubernetes-master, do ta nxjerrim atë nga aty:

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

Do ta klonojmë depo-n dex-k8s-authenticator:

git clone git@github.com:mintel/dex-k8s-authenticator.git cd dex-k8s-authenticator/

Me ndihmën e dosjeve values ne mund të konfigurojmë në mënyrë fleksibile variablat për

HELM-chartet Do ta përshkruajmë konfigurimin për Dex:.

ĐžĐżĐžŃˆĐ”ĐŒ ĐșĐŸĐœŃ„ĐžĐłŃƒŃ€Đ°Ń†ĐžŃŽ ĐŽĐ»Ń Dex:

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

Dhe për dex-k8s-authenticator:

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

Le të instalojmë Dex dhe 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

TĂ« kontrollojmĂ« funksionimin e shĂ«rbimeve (Dex duhet tĂ« kthejĂ« kodin 400, ndĂ«rsa dex-k8s-authenticator — kodin 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

Konfigurimi RBAC

Krijojmë ClusterRole për grupin, në rastin tonë me akses read-only:

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

Të krijojmë konfigurimin për 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

Tani jemi gati për testim.

Testet

Shkoni në faqen e logimit (https://login.k8s.example.com) dhe autorizohuni nëpërmjet account-it tuaj GitHub:

Autentifikimi në Kubernetes me GitHub OAuth dhe Dex
Faqja e autorizimit

Autentifikimi në Kubernetes me GitHub OAuth dhe Dex
Faqja e autorizimit e drejtuar në GitHub

Autentifikimi në Kubernetes me GitHub OAuth dhe Dex
 Pasojmë instrukcionin e gjeneruar për të marrë akseset

Pas kopjimit nga faqja e internetit, mund të përdorim kubectl për të menaxhuar burimet e klasterit tonë:

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 "amet@example.com" cannot delete pods in the namespace "default"

Dhe funksionon, të gjithë përdoruesit e GitHub në organizatën tonë mund të shohin burimet dhe të hyjnë në pod-et, megjithatë ata nuk kanë të drejta për t'i ndryshuar ato.

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster