GitHub OAuth اور Dex کا استعمال کرتے ہوئے Kubernetes میں تصدیق کریں۔

میں آپ کی توجہ میں Dex، dex-k8s-authenticator اور GitHub کا استعمال کرتے ہوئے Kubernetes کلسٹر تک رسائی پیدا کرنے کے لیے ایک ٹیوٹوریل پیش کرتا ہوں۔

GitHub OAuth اور Dex کا استعمال کرتے ہوئے Kubernetes میں تصدیق کریں۔
روسی زبان کے Kubernetes سے مقامی میم چیٹ میں تار

تعارف

ہم ترقی اور QA ٹیم کے لیے متحرک ماحول بنانے کے لیے Kubernetes کا استعمال کرتے ہیں۔ لہذا ہم انہیں ڈیش بورڈ اور kubectl دونوں کے لیے کلسٹر تک رسائی دینا چاہتے ہیں۔ OpenShift کے برعکس، vanilla Kubernetes میں مقامی تصدیق نہیں ہے، لہذا ہم اس کے لیے فریق ثالث کے ٹولز استعمال کرتے ہیں۔

اس ترتیب میں ہم استعمال کرتے ہیں:

  • dex-k8s-authenticator  - kubectl config پیدا کرنے کے لیے ویب ایپلیکیشن
  • اس Dex - اوپن آئی ڈی کنیکٹ فراہم کنندہ
  • GitHub - صرف اس وجہ سے کہ ہم اپنی کمپنی میں GitHub استعمال کرتے ہیں۔

ہم نے گوگل او آئی ڈی سی کو استعمال کرنے کی کوشش کی، لیکن بدقسمتی سے ہم ناکام ان کو گروپس کے ساتھ شروع کرنے کے لیے، اس لیے GitHub کے ساتھ انضمام ہمارے لیے کافی مناسب تھا۔ گروپ میپنگ کے بغیر، گروپوں کی بنیاد پر RBAC پالیسیاں بنانا ممکن نہیں ہوگا۔

تو، ہمارا Kubernetes اجازت دینے کا عمل بصری نمائندگی میں کیسے کام کرتا ہے:

GitHub OAuth اور Dex کا استعمال کرتے ہوئے Kubernetes میں تصدیق کریں۔
اجازت دینے کا عمل

تھوڑی سی مزید تفصیل اور پوائنٹ بہ نقطہ:

  1. صارف dex-k8s-authenticator میں لاگ ان ہوتا ہے (login.k8s.example.com)
  2. dex-k8s-authenticator درخواست کو ڈیکس (dex.k8s.example.com)
  3. ڈیکس GitHub لاگ ان پیج پر ری ڈائریکٹ کرتا ہے۔
  4. GitHub اجازت کی ضروری معلومات تیار کرتا ہے اور اسے Dex پر واپس کرتا ہے۔
  5. Dex موصول ہونے والی معلومات کو dex-k8s-authenticator کو دیتا ہے۔
  6. صارف کو GitHub سے OIDC ٹوکن ملتا ہے۔
  7. dex-k8s-authenticator kubeconfig میں ٹوکن شامل کرتا ہے۔
  8. kubectl ٹوکن KubeAPIServer کو دیتا ہے۔
  9. KubeAPIServer پاس شدہ ٹوکن کی بنیاد پر kubectl تک رسائی واپس کرتا ہے۔
  10. صارف کو کیوبیکٹل سے رسائی حاصل ہوتی ہے۔

تیاری کے اقدامات

یقینا، ہمارے پاس پہلے سے ہی ایک Kubernetes کلسٹر انسٹال ہے (k8s.example.com)، اور پہلے سے انسٹال شدہ HELM کے ساتھ بھی آتا ہے۔ GitHub (super-org) پر ہماری ایک تنظیم بھی ہے۔
اگر آپ کے پاس HELM نہیں ہے تو اسے انسٹال کریں۔ بہت آسان.

سب سے پہلے ہمیں GitHub سیٹ اپ کرنے کی ضرورت ہے۔

تنظیم کی ترتیبات کے صفحے پر جائیں، (https://github.com/organizations/super-org/settings/applications) اور ایک نئی ایپلیکیشن بنائیں (مجاز OAuth ایپ):
GitHub OAuth اور Dex کا استعمال کرتے ہوئے Kubernetes میں تصدیق کریں۔
GitHub پر ایک نئی ایپلیکیشن بنانا

ضروری URLs کے ساتھ کھیتوں کو پُر کریں، مثال کے طور پر:

  • ہوم پیج 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

عنوان کے ساتھ کلسٹر جاری کرنے والا 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-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 repository کو کلون کریں:

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

ویلیوز فائلوں کا استعمال کرتے ہوئے، ہم لچکدار طریقے سے اپنے لیے متغیرات کو ترتیب دے سکتے ہیں۔ HELM چارٹس.

آئیے ڈیکس کے لیے کنفیگریشن کی وضاحت کرتے ہیں:

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 کنفیگریشن

ہم گروپ کے لیے ایک کلسٹر رول بناتے ہیں، ہمارے معاملے میں صرف پڑھنے کی رسائی کے ساتھ:

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 اکاؤنٹ کا استعمال کرتے ہوئے لاگ ان کریں:

GitHub OAuth اور Dex کا استعمال کرتے ہوئے Kubernetes میں تصدیق کریں۔
لاگ ان صفحہ

GitHub OAuth اور Dex کا استعمال کرتے ہوئے Kubernetes میں تصدیق کریں۔
لاگ ان صفحہ کو GitHub پر ری ڈائریکٹ کیا گیا۔

GitHub OAuth اور Dex کا استعمال کرتے ہوئے Kubernetes میں تصدیق کریں۔
 رسائی حاصل کرنے کے لیے تیار کردہ ہدایات پر عمل کریں۔

ویب صفحہ سے کاپی پیسٹ کرنے کے بعد، ہم اپنے کلسٹر وسائل کو منظم کرنے کے لیے 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

نیا تبصرہ شامل کریں