GitHub OAuth və Dex ilə Kubernetes Doğrulama

Diqqətinizə Dex, dex-k8s-authenticator və GitHub-dan istifadə edərək Kubernetes klasterinə giriş yaratmaq üçün dərsliyi təqdim edirəm.

GitHub OAuth və Dex ilə Kubernetes Doğrulama
Rusdilli Kubernetes-dən yerli mem söhbət edir Teleqram

Giriş

İnkişaf və QA komandası üçün dinamik mühitlər yaratmaq üçün Kubernetes-dən istifadə edirik. Beləliklə, biz onlara həm tablosuna, həm də kubectl üçün klasterə giriş vermək istəyirik. OpenShift-dən fərqli olaraq, vanil Kubernetes-in yerli autentifikasiyası yoxdur, buna görə də bunun üçün üçüncü tərəf alətlərindən istifadə edirik.

Bu konfiqurasiyada istifadə edirik:

  • dex-k8s-autentifikator  — kubectl konfiqurasiyasını yaratmaq üçün veb proqram
  • Dex — OpenID Connect provayderi
  • GitHub - sadəcə olaraq şirkətimizdə GitHub istifadə etdiyimiz üçün

Google OIDC-dən istifadə etməyə çalışdıq, amma təəssüf ki, biz uğursuz onları qruplarla başlamaq üçün GitHub ilə inteqrasiya bizə çox uyğun gəldi. Qrup xəritəsi olmadan, qruplara əsaslanan RBAC siyasətlərini yaratmaq mümkün olmayacaq.

Beləliklə, Kubernetes icazə prosesimiz vizual təqdimatda necə işləyir:

GitHub OAuth və Dex ilə Kubernetes Doğrulama
Avtorizasiya prosesi

Bir az daha ətraflı və nöqtə nöqtə:

  1. İstifadəçi dex-k8s-authenticator-a daxil olur (login.k8s.example.com)
  2. dex-k8s-authenticator sorğunu Dex-ə yönləndirir (dex.k8s.example.com)
  3. Dex GitHub giriş səhifəsinə yönləndirir
  4. GitHub lazımi icazə məlumatını yaradır və onu Dex-ə qaytarır
  5. Dex alınan məlumatı dex-k8s-authenticator-a ötürür
  6. İstifadəçi GitHub-dan OIDC tokeni alır
  7. dex-k8s-authenticator kubeconfig-ə işarə əlavə edir
  8. kubectl tokeni KubeAPIServer-ə ötürür
  9. KubeAPIServer ötürülən token əsasında kubectl-ə girişləri qaytarır
  10. İstifadəçi kubectl-dən giriş əldə edir

Hazırlıq işləri

Əlbəttə, bizdə artıq Kubernetes klasteri quraşdırılıb (k8s.example.com) və həmçinin əvvəlcədən quraşdırılmış HELM ilə gəlir. GitHub-da (super-org) təşkilatımız da var.
Əgər sizdə HELM yoxdursa, onu quraşdırın çox sadə.

Əvvəlcə GitHub-u qurmalıyıq.

Təşkilat parametrləri səhifəsinə keçin, (https://github.com/organizations/super-org/settings/applications) və yeni proqram yaradın (Authorized OAuth App):
GitHub OAuth və Dex ilə Kubernetes Doğrulama
GitHub-da yeni proqram yaradılması

Sahələri lazımi URL-lərlə doldurun, məsələn:

  • Əsas səhifə URL: https://dex.k8s.example.com
  • Avtorizasiya geri zəng URL: https://dex.k8s.example.com/callback

Bağlantılarla diqqətli olun, kəsikləri itirməmək vacibdir.

Tamamlanmış formaya cavab olaraq GitHub yaradacaq Client ID и Client secret, onları təhlükəsiz yerdə saxlayın, onlar bizim üçün faydalı olacaqlar (məsələn, istifadə edirik Sərdaba sirləri saxlamaq üçün):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

Subdomenlər üçün DNS qeydlərini hazırlayın login.k8s.example.com и dex.k8s.example.com, həmçinin giriş üçün SSL sertifikatları.

SSL sertifikatları yaradaq:

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

Başlığı olan ClusterEmitent le-clusterissuer artıq mövcud olmalıdır, lakin yoxdursa, onu HELM-dən istifadə edərək yaradın:

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 konfiqurasiyası

kubeAPIServer-in işləməsi üçün OIDC-ni konfiqurasiya etməli və klasteri yeniləməlisiniz:

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

İstifadə edirik qəpik klasterlərin yerləşdirilməsi üçün, lakin bu, oxşar şəkildə işləyir digər klaster menecerləri.

Dex konfiqurasiyası və dex-k8s-authenticator

Dex-in işləməsi üçün Kubernetes ustasından sertifikat və açarınız olmalıdır, gəlin onu oradan əldə edək:

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

Gəlin dex-k8s-authenticator repozitoriyasını klonlayaq:

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

Dəyər fayllarından istifadə edərək, dəyişənlərimizi çevik şəkildə konfiqurasiya edə bilərik HELM qrafikləri.

Dex üçün konfiqurasiyanı təsvir edək:

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

Və dex-k8s-authenticator üçün:

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

Dex və dex-k8s-authenticator quraşdırın:

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

Xidmətlərin funksionallığını yoxlayaq (Dex 400 kodunu, dex-k8s-authenticator isə 200 kodunu qaytarmalıdır):

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 konfiqurasiyası

Qrup üçün ClusterRole yaradırıq, bizim vəziyyətimizdə yalnız oxumaq imkanı ilə:

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

ClusterRoleBinding üçün konfiqurasiya yaradaq:

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

İndi sınaq üçün hazırıq.

Testlər

Giriş səhifəsinə keçin (https://login.k8s.example.com) və GitHub hesabınızdan istifadə edərək daxil olun:

GitHub OAuth və Dex ilə Kubernetes Doğrulama
Giriş səhifəsi

GitHub OAuth və Dex ilə Kubernetes Doğrulama
Giriş səhifəsi GitHub-a yönləndirildi

GitHub OAuth və Dex ilə Kubernetes Doğrulama
 Giriş əldə etmək üçün yaradılan təlimatları izləyin

Veb səhifədən kopyala-yapışdırdıqdan sonra klaster resurslarımızı idarə etmək üçün kubectl-dən istifadə edə bilərik:

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"

Və bu işləyir, təşkilatımızdakı bütün GitHub istifadəçiləri resursları görə bilər və podlara daxil ola bilər, lakin onları dəyişdirmək hüququ yoxdur.

Mənbə: www.habr.com

Добавить комментарий