Бо истифода аз GitHub OAuth ва Dex дар Kubernetes аутентификатсия кунед

Ман ба диққати шумо як дастури тавлиди дастрасӣ ба кластери Kubernetes бо истифода аз Dex, dex-k8s-authenticator ва GitHub пешниҳод мекунам.

Бо истифода аз GitHub OAuth ва Dex дар Kubernetes аутентификатсия кунед
Мемҳои маҳаллӣ аз Кубернетес бо забони русӣ сӯҳбат мекунанд телеграмма

Муқаддима

Мо Kubernetes-ро барои эҷоди муҳити динамикӣ барои таҳия ва дастаи QA истифода мебарем. Ҳамин тавр, мо мехоҳем ба онҳо дастрасӣ ба кластерро ҳам барои панели идоракунӣ ва ҳам kubectl диҳем. Баръакси OpenShift, vanilla Kubernetes аутентификатсияи ватанӣ надорад, аз ин рӯ мо барои ин асбобҳои тарафи сеюмро истифода мебарем.

Дар ин конфигуратсия мо истифода мебарем:

  • dex-k8s-аслиқкунанда  — замимаи веб барои тавлиди конфигуратсияи kubectl
  • Dex — Провайдери OpenID Connect
  • GitHub - танҳо аз он сабаб, ки мо дар ширкати худ GitHub-ро истифода мебарем

Мо кӯшиш кардем, ки Google OIDC-ро истифода барем, аммо мутаассифона мо ноком ки онҳоро бо гурӯҳҳо оғоз кунед, аз ин рӯ ҳамгироӣ бо GitHub ба мо хеле мувофиқ буд. Бе харитасозии гурӯҳҳо, эҷоди сиёсатҳои RBAC дар асоси гурӯҳҳо ғайриимкон хоҳад буд.

Пас, чӣ гуна раванди иҷозатдиҳии Kubernetes мо дар намоиши визуалӣ кор мекунад:

Бо истифода аз GitHub OAuth ва Dex дар Kubernetes аутентификатсия кунед
Раванди иҷозатдиҳӣ

Тафсилоти каме бештар ва нуқта ба нуқта:

  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. Истифодабаранда аз GitHub аломати OIDC мегирад
  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):
Бо истифода аз GitHub OAuth ва Dex дар Kubernetes аутентификатсия кунед
Эҷоди як барномаи нав дар GitHub

Майдонҳоро бо URL-ҳои зарурӣ пур кунед, масалан:

  • 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-аутентификатор

Барои кор кардани 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-и худ ворид шавед:

Бо истифода аз 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 дар ташкилоти мо метавонанд захираҳоро бубинанд ва ба подкҳо ворид шаванд, аммо онҳо ҳуқуқи тағир додани онҳоро надоранд.

Манбаъ: will.com

Илова Эзоҳ