GitHub OAuth жана Dex аркылуу Kubernetes'те аныктыгын текшериңиз

Мен сиздердин назарыңыздарга Dex, dex-k8s-authenticator жана GitHub аркылуу Kubernetes кластерине кирүү мүмкүнчүлүгүн түзүү боюнча окуу куралын сунуштайм.

GitHub OAuth жана Dex аркылуу Kubernetes'те аныктыгын текшериңиз
Орус тилдүү Kubernetes жергиликтүү мем чатта телеграмма

тааныштыруу

Биз иштеп чыгуу жана QA командасы үчүн динамикалык чөйрөлөрдү түзүү үчүн Kubernetes колдонобуз. Ошентип, биз аларга башкаруу тактасы жана kubectl үчүн кластерге кирүү мүмкүнчүлүгүн бергибиз келет. OpenShiftтен айырмаланып, vanilla Kubernetesтин түпнуска аутентификациясы жок, андыктан биз бул үчүн үчүнчү тараптын куралдарын колдонобуз.

Бул конфигурацияда биз колдонобуз:

Биз 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-аныктыгын текшерүүчүгө өткөрүп берет
  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 колдонуучулары ресурстарды көрүп, подкасттарга кире алышат, бирок аларды өзгөртүүгө укуктары жок.

Source: www.habr.com

Комментарий кошуу