GitHub OAuth ve Dex'i kullanarak Kubernetes'te kimlik doğrulaması yapın

Dex, dex-k8s-authenticator ve GitHub kullanarak bir Kubernetes kümesine erişim oluşturmaya yönelik bir öğreticiyi dikkatinize sunuyorum.

GitHub OAuth ve Dex'i kullanarak Kubernetes'te kimlik doğrulaması yapın
Rusça Kubernetes sohbetinden yerel meme Telegram

Giriş

Geliştirme ve QA ekibi için dinamik ortamlar oluşturmak amacıyla Kubernetes'i kullanıyoruz. Bu yüzden onlara hem kontrol paneli hem de kubectl için kümeye erişim izni vermek istiyoruz. OpenShift'in aksine, vanilya Kubernetes'in yerel kimlik doğrulaması yoktur, bu nedenle bunun için üçüncü taraf araçları kullanırız.

Bu konfigürasyonda şunları kullanıyoruz:

  • dex-k8s-kimlik doğrulayıcı  — kubectl yapılandırması oluşturmak için web uygulaması
  • Dex — OpenID Bağlantı sağlayıcısı
  • GitHub - şirketimizde GitHub kullandığımız için

Google OIDC'yi kullanmaya çalıştık ama ne yazık ki başarısız onlara gruplarla başlamak gerekiyordu, bu nedenle GitHub ile entegrasyon bize oldukça uygun oldu. Grup eşleme olmadan gruplara dayalı RBAC politikaları oluşturmak mümkün olmayacaktır.

Peki Kubernetes yetkilendirme sürecimiz görsel olarak nasıl işliyor:

GitHub OAuth ve Dex'i kullanarak Kubernetes'te kimlik doğrulaması yapın
Yetkilendirme süreci

Biraz daha detay ve noktadan noktaya:

  1. Kullanıcı dex-k8s-authenticator'da oturum açar (login.k8s.example.com)
  2. dex-k8s-authenticator isteği Dex'e iletir (dex.k8s.example.com)
  3. Dex GitHub giriş sayfasına yönlendiriyor
  4. GitHub gerekli yetkilendirme bilgilerini oluşturur ve bunu Dex'e gönderir
  5. Dex, alınan bilgiyi dex-k8s-authenticator'a aktarır
  6. Kullanıcı GitHub'dan bir OIDC belirteci alır
  7. dex-k8s-authenticator kubeconfig'e jeton ekler
  8. kubectl jetonu KubeAPIServer'a iletir
  9. KubeAPIServer, iletilen belirteci temel alarak kubectl'e erişimleri döndürür
  10. Kullanıcı kubectl'den erişim sağlıyor

Hazırlık faaliyetleri

Elbette zaten kurulu bir Kubernetes kümemiz var (k8s.example.com) ve ayrıca HELM önceden yüklenmiş olarak gelir. Ayrıca GitHub'da (super-org) bir organizasyonumuz var.
HELM'iniz yoksa yükleyin Çok basit.

Öncelikle GitHub'u kurmamız gerekiyor.

Kuruluş ayarları sayfasına gidin, (https://github.com/organizations/super-org/settings/applications) ve yeni bir uygulama (Yetkili OAuth Uygulaması) oluşturun:
GitHub OAuth ve Dex'i kullanarak Kubernetes'te kimlik doğrulaması yapın
GitHub'da yeni bir uygulama oluşturma

Alanları gerekli URL'lerle doldurun, örneğin:

  • Ana sayfa URL'si: https://dex.k8s.example.com
  • Yetkilendirme geri çağırma URL'si: https://dex.k8s.example.com/callback

Bağlantılara dikkat edin, eğik çizgileri kaybetmemek önemlidir.

Tamamlanan bir forma yanıt olarak GitHub, Client ID и Client secret, bunları güvenli bir yerde saklayın, işimize yarayacaklardır (örneğin, kullanıyoruz) Tonoz sırları saklamak için):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

Alt alan adları için DNS kayıtlarını hazırlayın login.k8s.example.com и dex.k8s.example.comve giriş için SSL sertifikaları.

SSL sertifikaları oluşturalım:

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

Başlıklı ClusterIssuer le-clusterissuer Zaten mevcut olmalıdır, ancak yoksa HELM kullanarak oluşturun:

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

KubeAPISunucu yapılandırması

KubeAPIServer'ın çalışması için OIDC'yi yapılandırmanız ve kümeyi güncellemeniz gerekir:

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

Kullanırız kop kümeleri dağıtmak için, ancak bu benzer şekilde çalışır diğer küme yöneticileri.

Dex yapılandırması ve dex-k8s kimlik doğrulayıcı

Dex'in çalışması için Kubernetes master'dan bir sertifika ve anahtar almanız gerekiyor, oradan alalım:

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

Dex-k8s-authenticator deposunu klonlayalım:

git clone [email protected]:mintel/dex-k8s-authenticator.git
cd dex-k8s-authenticator/

Değer dosyalarını kullanarak değişkenlerimizi esnek bir şekilde yapılandırabiliriz. HELM çizelgeleri.

Dex için konfigürasyonu anlatalım:

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

Ve dex-k8s-authenticator için:

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 ve dex-k8s-authenticator'ı yükleyin:

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

Hizmetlerin işlevselliğini kontrol edelim (Dex 400 kodunu döndürmelidir ve dex-k8s-authenticator 200 kodunu döndürmelidir):

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 yapılandırması

Grup için salt okunur erişime sahip bir ClusterRole oluşturuyoruz:

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 için bir konfigürasyon oluşturalım:

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

Artık teste hazırız.

Testler

Giriş sayfasına gidin (https://login.k8s.example.com) ve GitHub hesabınızı kullanarak giriş yapın:

GitHub OAuth ve Dex'i kullanarak Kubernetes'te kimlik doğrulaması yapın
Giriş sayfası

GitHub OAuth ve Dex'i kullanarak Kubernetes'te kimlik doğrulaması yapın
Giriş sayfası GitHub'a yönlendirildi

GitHub OAuth ve Dex'i kullanarak Kubernetes'te kimlik doğrulaması yapın
 Erişim sağlamak için oluşturulan talimatları izleyin

Web sayfasından kopyalayıp yapıştırdıktan sonra küme kaynaklarımızı yönetmek için kubectl'i kullanabiliriz:

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"

Ve işe yarıyor, kuruluşumuzdaki tüm GitHub kullanıcıları kaynakları görebilir ve bölmelerde oturum açabilir, ancak bunları değiştirme hakları yoktur.

Kaynak: habr.com

Yorum ekle