احراز هویت Kubernetes با GitHub OAuth و Dex

من آموزشی برای ایجاد دسترسی به خوشه Kubernetes با استفاده از Dex، dex-k8s-authenticator و GitHub به توجه شما ارائه می کنم.

احراز هویت Kubernetes با GitHub OAuth و Dex
میم محلی از چت روسی زبان Kubernetes در تلگرام

معرفی

ما از Kubernetes برای ایجاد محیط های پویا برای تیم توسعه و QA استفاده می کنیم. بنابراین می‌خواهیم به آنها برای داشبورد و کوبکتل دسترسی به کلاستر بدهیم. برخلاف همان OpenShift، Vanilla Kubernetes احراز هویت بومی ندارد، بنابراین ما از ابزارهای شخص ثالث برای این کار استفاده می کنیم.

در این پیکربندی ما از:

  • dex-k8s-authenticator  - برنامه وب برای ایجاد پیکربندی kubectl
  • دگزامتازون - ارائه دهنده OpenID Connect
  • GitHub - صرفاً به این دلیل که ما از GitHub در شرکت خود استفاده می کنیم

ما سعی کردیم از Google OIDC استفاده کنیم، اما متاسفانه ما شکست خورده برای شروع آنها با گروه ها، بنابراین ادغام با GitHub به خوبی برای ما مناسب است. بدون نگاشت گروهی، ایجاد خط مشی های RBAC مبتنی بر گروه امکان پذیر نخواهد بود.

بنابراین، فرآیند مجوز Kubernetes ما در یک نمایش بصری چگونه کار می کند:

احراز هویت Kubernetes با GitHub OAuth و Dex
فرآیند مجوز

کمی جزئیات بیشتر و نکته به نقطه:

  1. ورود کاربر به dex-k8s-authenticator (login.k8s.example.com)
  2. dex-k8s-authenticator درخواست را به Dex هدایت می کند (dex.k8s.example.com)
  3. Dex به صفحه ورود به سیستم GitHub هدایت می شود
  4. GitHub اطلاعات مجوز مورد نیاز را تولید می کند و آن را به Dex برمی گرداند
  5. Dex اطلاعات دریافتی را به dex-k8s-authenticator ارسال می کند
  6. کاربر رمز OIDC را از GitHub دریافت می کند
  7. dex-k8s-authenticator توکن را به kubeconfig اضافه می کند
  8. kubectl توکن را به KubeAPIServer ارسال می کند
  9. KubeAPIServer بر اساس توکن ارسال شده، دسترسی به kubectl را برمی‌گرداند
  10. دسترسی کاربر از kubectl

اقدامات مقدماتی

البته، ما قبلاً یک خوشه Kubernetes نصب کرده ایم (k8s.example.com) و همچنین HELM از پیش نصب شده است. ما همچنین یک سازمان در GitHub (super-org) داریم.
اگر HELM ندارید، آن را نصب کنید بسیار ساده.

ابتدا باید GitHub را راه اندازی کنیم.

به صفحه تنظیمات سازمان بروید، (https://github.com/organizations/super-org/settings/applications) و یک برنامه جدید ایجاد کنید (Authorized OAuth App):
احراز هویت Kubernetes با GitHub OAuth و Dex
یک برنامه جدید در GitHub ایجاد کنید

فیلدها را با URL های مورد نیاز پر کنید، به عنوان مثال:

  • آدرس صفحه اصلی: https://dex.k8s.example.com
  • URL بازگشت به تماس مجوز: https://dex.k8s.example.com/callback

مراقب پیوندها باشید، مهم است که اسلش ها را از دست ندهید.

در پاسخ به فرم تکمیل شده، GitHub تولید خواهد کرد Client ID и Client secret، آنها را در مکانی امن ذخیره کنید، برای ما مفید خواهند بود (مثلاً استفاده می کنیم طاق برای حفظ اسرار):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

سوابق DNS را برای زیر دامنه ها آماده کنید login.k8s.example.com и dex.k8s.example.comو همچنین گواهی های SSL برای ورود.

بیایید گواهینامه های 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 با عنوان le-clusterissuer باید از قبل وجود داشته باشد، اگر نه، آن را با استفاده از 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

برای اینکه kubeAPIServer کار کند، باید OIDC را پیکربندی کرده و کلاستر را ارتقا دهید:

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

ما استفاده می کنیم لگد زدن برای گسترش خوشه‌ها، اما به همین صورت برای سایر مدیران خوشه.

پیکربندی Dex و dex-k8s-authenticator

برای اینکه Dex کار کند، باید یک گواهی و یک کلید از استاد Kubernetes داشته باشید، ما آن را از آنجا بیرون خواهیم آورد:

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

مخزن dex-k8s-authenticator را کلون کنید:

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

با کمک مقادیر-فایل‌ها، می‌توانیم متغیرهایی را برای خود تنظیم کنیم نمودار HELM.

بیایید پیکربندی 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

و برای 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

Dex و 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

بیایید قابلیت سرویس دهی سرویس ها را بررسی کنیم (Dex باید کد 400 را برگرداند و dex-k8s-authenticator باید کد 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

یک ClusterRole برای گروه ایجاد کنید، در مورد ما با دسترسی فقط خواندنی:

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 ایجاد کنیم:

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

اکنون برای آزمایش آماده ایم.

تستها

به صفحه ورود برویدhttps://login.k8s.example.com) و با یک حساب GitHub وارد شوید:

احراز هویت Kubernetes با GitHub OAuth و Dex
صفحه مجوز

احراز هویت Kubernetes با GitHub OAuth و Dex
صفحه مجوز به GitHub هدایت شد

احراز هویت Kubernetes با GitHub OAuth و Dex
 دستورالعمل های تولید شده را دنبال کنید تا دسترسی داشته باشید

پس از کپی پیست از صفحه وب، می توانیم از kubectl برای مدیریت منابع خوشه خود استفاده کنیم:

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"

و کار می کند، همه کاربران GitHub در سازمان ما می توانند منابع را ببینند و به پادها وارد شوند، اما اجازه تغییر آنها را ندارند.

منبع: www.habr.com

اضافه کردن نظر