GitHub OAuth ۽ Dex استعمال ڪندي ڪبرنيٽس ۾ تصديق ڪريو

مان توهان جي توجه لاءِ پيش ڪريان ٿو هڪ سبق پيدا ڪرڻ لاءِ ڪبرنيٽس ڪلستر تائين رسائي Dex، dex-k8s-authenticator ۽ GitHub استعمال ڪندي.

GitHub OAuth ۽ Dex استعمال ڪندي ڪبرنيٽس ۾ تصديق ڪريو
روسي-ٻولي ڪبرنيٽس کان مقامي ميمي چيٽ ۾ تار

تعارف

اسان ترقي ۽ QA ٽيم لاءِ متحرڪ ماحول پيدا ڪرڻ لاءِ ڪبرنيٽس استعمال ڪندا آهيون. تنهن ڪري اسان انهن کي ڊيش بورڊ ۽ ڪبيڪٽل ٻنهي لاءِ ڪلستر تائين رسائي ڏيڻ چاهيون ٿا. OpenShift جي برعڪس، vanilla Kubernetes وٽ اصلي تصديق نه آهي، تنهنڪري اسان ان لاءِ ٽئين پارٽي جا اوزار استعمال ڪريون ٿا.

هن ترتيب ۾ اسان استعمال ڪريون ٿا:

  • dex-k8s-Authenticator  kubectl config پيدا ڪرڻ لاءِ ويب ايپليڪيشن
  • ڊي - OpenID Connect فراهم ڪندڙ
  • GitHub - صرف ان ڪري جو اسان استعمال ڪندا آهيون GitHub اسان جي ڪمپني ۾

اسان گوگل OIDC استعمال ڪرڻ جي ڪوشش ڪئي، پر بدقسمتي سان اسان ناڪام ٿي ويو انھن کي گروپن سان شروع ڪرڻ لاءِ، تنھنڪري GitHub سان انضمام اسان کي چڱيءَ طرح مناسب آھي. گروپ ميپنگ جي بغير، گروپن جي بنياد تي RBAC پاليسيون ٺاهڻ ممڪن نه ٿيندو.

تنهن ڪري، اسان جو ڪبرنيٽس اختيار ڪرڻ وارو عمل بصري نمائندگي ۾ ڪيئن ڪم ڪندو آهي:

GitHub OAuth ۽ Dex استعمال ڪندي ڪبرنيٽس ۾ تصديق ڪريو
اختيار ڏيڻ وارو عمل

ٿورڙو وڌيڪ تفصيل ۽ نقطي ذريعي:

  1. استعمال ڪندڙ dex-k8s-authenticator ۾ لاگ ان ٿئي ٿو (login.k8s.example.com)
  2. dex-k8s-authenticator درخواست کي ڊيڪس ڏانهن موڪلي ٿو (dex.k8s.example.com)
  3. ڊيڪس GitHub لاگ ان صفحي ڏانهن منتقل ڪري ٿو
  4. GitHub ضروري اختيار جي معلومات پيدا ڪري ٿو ۽ ان کي ڊيڪس ڏانهن موٽائي ٿو
  5. ڊيڪس وصول ڪيل معلومات کي dex-k8s-authenticator ڏانهن منتقل ڪري ٿو
  6. صارف GitHub کان هڪ OIDC ٽوڪن وصول ڪري ٿو
  7. dex-k8s-authenticator kubeconfig ۾ ٽوڪن شامل ڪري ٿو
  8. kubectl ٽوڪن کي KubeAPIServer ڏانهن منتقل ڪري ٿو
  9. KubeAPIServer پاس ڪيل ٽوڪن جي بنياد تي kubectl تائين رسائي واپس ڪري ٿو
  10. استعمال ڪندڙ کي رسائي حاصل ڪري ٿي kubectl کان

تياري واري عمل

يقينا، اسان وٽ اڳ ۾ ئي ڪوبرنيٽس ڪلستر نصب ٿيل آهي (k8s.example.com)، ۽ پڻ اڳ ۾ نصب ٿيل HELM سان گڏ اچي ٿو. اسان وٽ پڻ هڪ تنظيم آهي GitHub (super-org).
جيڪڏهن توهان وٽ HELM نه آهي، ان کي انسٽال ڪريو تمام سادو.

پهرين اسان کي سيٽ ڪرڻ جي ضرورت آهي GitHub.

وڃو تنظيمي سيٽنگون صفحي، (https://github.com/organizations/super-org/settings/applications) ۽ هڪ نئين ايپليڪيشن ٺاهيو (مجاز OAuth ايپ):
GitHub OAuth ۽ Dex استعمال ڪندي ڪبرنيٽس ۾ تصديق ڪريو
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 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 چارٽس.

اچو ته وضاحت ڪريون 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

اچو ته خدمتن جي ڪارڪردگي جي جانچ ڪريون (ڊيڪس کي ڪوڊ 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 اڪائونٽ استعمال ڪندي لاگ ان ڪريو:

GitHub OAuth ۽ Dex استعمال ڪندي ڪبرنيٽس ۾ تصديق ڪريو
لاگ ان صفحو

GitHub OAuth ۽ Dex استعمال ڪندي ڪبرنيٽس ۾ تصديق ڪريو
لاگ ان صفحو GitHub ڏانهن منتقل ڪيو ويو

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

تبصرو شامل ڪريو