Ju kujtoj tutorialin për krijimin e aksesit në Kubernetes me ndihmën e Dex, dex-k8s-authenticator dhe GitHub.

Një meme lokale nga biseda në gjuhën ruse për Kubernetes në
Hyrje
Ne përdorim Kubernetes për të krijuar mjedise dinamike për ekipet e zhvilluesve dhe QA. Në këtë mënyrë, duam t'u japim atyre akses në klaster si për dashboard-in ashtu edhe për kubectl. Ndryshe nga OpenShift, Kubernetes standard nuk ka autentifikim native, prandaj ne përdorim mjete të jashtme për këtë.
Në këtë konfigurim ne përdorim:
- â aplikacion web pĂ«r gjenerimin e konfigurimit tĂ« kubectl
- â ofruesi OpenID Connect
- GitHub â thjesht sepse ne pĂ«rdorim GitHub nĂ« kompaninĂ« tonĂ«
Ne u përpoqëm të përdorim Google OIDC, por fatkeqësisht nuk arritëm Prandaj, si funksionon procesi ynë i autorizimit në Kubernetes në një pamje vizuale:
Pak më shumë detaje dhe hap pas hapi:

Procesi i autorizimit
Përdoruesi hyn në dex-k8s-authenticator (
- login.k8s.example.com
dex-k8s-authenticator ridrejon kërkesën në Dex () - dex.k8s.example.com
Dex ridrejon në faqen e autorizimit në GitHub) - GitHub gjeneron informacionin e nevojshëm për autorizim dhe e kthen atë prapa në Dex
- Dex e dërgon informacionin e marë në dex-k8s-authenticator
- Përdoruesi merr OIDC token nga GitHub
- dex-k8s-authenticator e shton token-in në kubeconfig
- kubectl e dërgon token-in në KubeAPIServer
- KubeAPIServer bazuar në token-in e dërguar kthen akseset në kubectl
- Përdoruesi merr akseset nga kubectl
- Hapat përgatitore
Natyrisht, ne tashmë kemi një klaster Kubernetes (
k8s.example.com), si dhe HELM të parainstaluar. Gjithashtu, kemi një organizatë në GitHub (super-org).Nëse nuk keni HELM, mund ta instaloni
shumë lehtë .
Shkoni në faqen e cilësimeve të organizatës, (
) dhe krijoni një aplikacion të ri (Aplikacioni i Autorizuar OAuth):https://github.com/organizations/super-org/settings/applicationsKrijimi i një aplikacioni të ri në GitHub

Plotësoni fushat me URL të nevojshme, për shembull:
Homepage URL:
- Authorization callback URL:
https://dex.k8s.example.com - Kujdesuni me lidhjet, është e rëndësishme të mos humbni slashes.
https://dex.k8s.example.com/callback
Në përgjigje të formularit të plotësuar, GitHub do të gjenerojë
Client secret Identifikuesi i Klientit dhe , mbajini në një vend të sigurt, do t'i nevojitemi (ne për shembull përdorimpër ruajtjen e sekreteve): Client ID: 1ab2c3d4e5f6g7h8 Client secret: 98z76y54x32w1
Përgatitni DNS rekordet për subdomenet , si dhe certifikatat SSL për ingress-et. dex-k8s-authenticator ridrejon kërkesën në Dex ( dhe Dex ridrejon në faqen e autorizimit në GitHubDo të krijojmë certifikata 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 me emrin le-clusterissuer duhet tĂ« ekzistojĂ«, nĂ«se jo â ta krijojmĂ« atĂ« me ndihmĂ«n e 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: k8s-admin@example.com privateKeySecretRef: name: le-clusterissuer http01: {} EOF
Konfigurimi i KubeAPIServerPër funksionimin e kubeAPIServer nevojitet të konfigurohet OIDC dhe të përditësohet klasteri:
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
për implementimin e klasterëve, por kjo funksionon në mënyrë të ngjashme dhe përNe përdorim menaxherë të tjerë klasterësh .
Për funksionimin e Dex nevojitet një certifikatë dhe një çelës nga Kubernetes-master, do ta nxjerrim atë nga aty:
sudo cat /srv/kubernetes/ca.{crt,key} -----BEGIN CERTIFICATE----- AAAAAAAAAAABBBBBBBBBBCCCCCC -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- DDDDDDDDDDDEEEEEEEEEEFFFFFF -----END RSA PRIVATE KEY-----
Do ta klonojmë depo-n dex-k8s-authenticator:git clone git@github.com:mintel/dex-k8s-authenticator.git cd dex-k8s-authenticator/
Me ndihmën e dosjeve values ne mund të konfigurojmë në mënyrë fleksibile variablat përHELM-chartet .
ĐпОŃĐ”ĐŒ ĐșĐŸĐœŃОгŃŃаŃĐžŃ ĐŽĐ»Ń Dex:
cat < 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
Dhe për dex-k8s-authenticator:
cat < 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
EOFLe të instalojmë Dex dhe 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-authenticatorTĂ« kontrollojmĂ« funksionimin e shĂ«rbimeve (Dex duhet tĂ« kthejĂ« kodin 400, ndĂ«rsa dex-k8s-authenticator â kodin 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 200Konfigurimi RBAC
Krijojmë ClusterRole për grupin, në rastin tonë me akses read-only:
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"]
EOFTë krijojmë konfigurimin për 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"
EOFTani jemi gati për testim.
Testet
Shkoni në faqen e logimit (https://login.k8s.example.com) dhe autorizohuni nëpërmjet account-it tuaj GitHub:

Faqja e autorizimit

Faqja e autorizimit e drejtuar në GitHub

 Pasojmë instrukcionin e gjeneruar për të marrë akseset
Pas kopjimit nga faqja e internetit, mund të përdorim kubectl për të menaxhuar burimet e klasterit tonë:
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 "amet@example.com" cannot delete pods in the namespace "default" Dhe funksionon, të gjithë përdoruesit e GitHub në organizatën tonë mund të shohin burimet dhe të hyjnë në pod-et, megjithatë ata nuk kanë të drejta për t'i ndryshuar ato.
Burimi: habr.com
