የኩበርኔትስ ማረጋገጫ በ GitHub OAuth እና Dex

Dex፣ dex-k8s-authenticator እና GitHubን በመጠቀም የኩበርኔትስ ክላስተር መዳረሻን ለማመንጨት አጋዥ ስልጠና ለእርስዎ ትኩረት አቀርባለሁ።

የኩበርኔትስ ማረጋገጫ በ GitHub OAuth እና Dex
ከሩሲያኛ ቋንቋ Kubernetes የመጣው የአካባቢ ሜም ወደ ውስጥ ገባ ቴሌግራም

መግቢያ

ለልማት ቡድን እና QA ተለዋዋጭ አካባቢዎችን ለመፍጠር Kubernetes እንጠቀማለን። ስለዚህ ለሁለቱም ዳሽቦርድ እና kubectl የክላስተር መዳረሻ ልንሰጣቸው እንፈልጋለን። ከተመሳሳዩ OpenShift በተቃራኒ ቫኒላ ኩበርኔትስ ቤተኛ ማረጋገጫ ስለሌለው ለዚህ የሶስተኛ ወገን መሳሪያዎችን እንጠቀማለን።

በዚህ ውቅር ውስጥ የሚከተሉትን እንጠቀማለን-

  • dex-k8s-አረጋጋጭ  - kubectl config ለማመንጨት የድር መተግበሪያ
  • Dex - ክፍት መታወቂያ አገናኝ አቅራቢ
  • GitHub - በቀላሉ GitHub በእኛ ኩባንያ ውስጥ ስለምንጠቀም ነው።

ጎግል ኦአይዲሲን ለመጠቀም ሞክረናል፣ ግን በሚያሳዝን ሁኔታ እኛ አልተሳካም እነሱን በቡድን ለመጀመር ፣ስለዚህ ከ GitHub ጋር ያለው ውህደት ለእኛ ተስማሚ ነው። ያለ ቡድን ካርታ፣ በቡድን ላይ የተመሰረቱ የRBAC ፖሊሲዎችን መፍጠር አይቻልም።

ስለዚህ የእኛ የኩበርኔትስ ፍቃድ ሂደታችን በምስል ውክልና እንዴት እንደሚሰራ፡-

የኩበርኔትስ ማረጋገጫ በ GitHub OAuth እና Dex
የፈቃድ ሂደት

ትንሽ ተጨማሪ ዝርዝር እና ነጥብ በነጥብ፡-

  1. ተጠቃሚ ወደ dex-k8s-authenticator ገብቷል (login.k8s.example.com)
  2. dex-k8s-አረጋጋጭ ጥያቄውን ወደ Dex ያዞራል (dex.k8s.example.com)
  3. Dex ወደ GitHub መግቢያ ገፅ ያዞራል።
  4. GitHub አስፈላጊውን የፍቃድ መረጃ ያመነጫል እና ወደ Dex ይመልሳል
  5. ዴክስ የተቀበለውን መረጃ ወደ dex-k8s-አረጋጋጭ ያስተላልፋል
  6. ተጠቃሚ የOIDC ማስመሰያ ከ GitHub ያገኛል
  7. dex-k8s-authenticator ወደ kubeconfig ማስመሰያ ያክላል
  8. kubectl ማስመሰያ ወደ KubeAPIServer ያስተላልፋል
  9. በተላለፈው ማስመሰያ ላይ የተመሰረተ KubeAPISserver የ kubectl መዳረሻን ይመልሳል
  10. ተጠቃሚ ከ kubectl ይደርሳል

የዝግጅት ተግባራት

በእርግጥ የኩበርኔትስ ክላስተር ተጭኖልናል (k8s.example.com), እንዲሁም HELM አስቀድሞ ተጭኗል። በ GitHub (ሱፐር-org) ላይ ድርጅት አለን።
HELM ከሌለዎት ይጫኑት። በጣም ቀላል.

በመጀመሪያ GitHub ን ማዘጋጀት አለብን.

ወደ የድርጅት ቅንብሮች ገጽ ይሂዱ ፣https://github.com/organizations/super-org/settings/applications) እና አዲስ መተግበሪያ ይፍጠሩ (የተፈቀደለት OAuth መተግበሪያ)፡-
የኩበርኔትስ ማረጋገጫ በ GitHub OAuth እና Dex
በ GitHub ላይ አዲስ መተግበሪያ ይፍጠሩ

መስኮቹን በሚፈለጉት ዩአርኤሎች ይሙሉ፣ ለምሳሌ፡-

  • መነሻ ገጽ URL፡ https://dex.k8s.example.com
  • የመልሶ ጥሪ ዩአርኤል ፍቃድ https://dex.k8s.example.com/callback

በአገናኞች ይጠንቀቁ, ስኬቶችን ላለማጣት አስፈላጊ ነው.

ለተጠናቀቀው ቅጽ ምላሽ GitHub ያመነጫል። Client ID и Client secret, በአስተማማኝ ቦታ ያስቀምጣቸዋል, ለእኛ ጠቃሚ ይሆናሉ (ለምሳሌ, እንጠቀማለን Vault ሚስጥሮችን ለመጠበቅ):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

ለንዑስ ጎራዎች የዲ ኤን ኤስ መዝገቦችን ያዘጋጁ login.k8s.example.com и dex.k8s.example.com, እንዲሁም የኤስ ኤስ ኤል የምስክር ወረቀቶች ለመግቢያዎች.

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

KubeAPISየአገልጋይ ውቅር

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-አረጋጋጭ

Dex እንዲሰራ፣ ከኩበርኔትስ ማስተር ሰርተፍኬት እና ቁልፍ ሊኖርህ ይገባል፣ ከዚያ እናወጣዋለን፡

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

የdex-k8s-አረጋጋጭ ማከማቻን ዝጋ፡

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-አረጋጋጭ፡-

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-አረጋጋጭን ጫን፡-

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 መለያ ይግቡ፡

የኩበርኔትስ ማረጋገጫ በ 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 ተጠቃሚዎች ሃብቶችን አይተው ወደ ፖድ ውስጥ መግባት ይችላሉ፣ ነገር ግን የመቀየር ፍቃድ የላቸውም።

ምንጭ: hab.com

አስተያየት ያክሉ