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

Представям на вашето внимание урок за генериране на достъп до Kubernetes клъстер с помощта на Dex, dex-k8s-authenticator и GitHub.

Kubernetes удостоверяване с GitHub OAuth и Dex
Местен мем от рускоезичния чат Kubernetes в Telegram

въведение

Използваме Kubernetes за създаване на динамични среди за екипа за разработка и QA. Затова искаме да им дадем достъп до клъстера както за таблото, така и за kubectl. За разлика от същия OpenShift, ванилия Kubernetes няма собствено удостоверяване, така че използваме инструменти на трети страни за това.

В тази конфигурация използваме:

  • dex-k8s-удостоверител  - уеб приложение за генериране на kubectl config
  • Декс - OpenID Connect доставчик
  • GitHub – просто защото използваме GitHub в нашата компания

Опитахме се да използваме Google OIDC, но за съжаление ние Неуспешно да ги стартираме с групи, така че интеграцията с GitHub ни подхождаше много добре. Без групово съпоставяне няма да е възможно да се създадат базирани на група RBAC политики.

И така, как работи нашият процес на оторизация на Kubernetes във визуално представяне:

Kubernetes удостоверяване с GitHub OAuth и Dex
Процес на оторизация

Малко по-подробно и точка по точка:

  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. Потребителят получава OIDC токен от GitHub
  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) и създайте ново приложение (Оторизирано OAuth приложение):
Kubernetes удостоверяване с GitHub OAuth и Dex
Създайте ново приложение в 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:

Kubernetes удостоверяване с GitHub OAuth и Dex
Страница за оторизация

Kubernetes удостоверяване с GitHub OAuth и Dex
Страницата за оторизация е пренасочена към GitHub

Kubernetes удостоверяване с 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

Добавяне на нов коментар