Predstavljam vam vadnico za generiranje dostopa do gruče Kubernetes z uporabo Dex, dex-k8s-authenticator in GitHub.

Lokalni meme iz klepeta Kubernetes v ruskem jeziku v
Predstavitev
Kubernetes uporabljamo za ustvarjanje dinamičnih okolij za razvojno in QA ekipo. Zato jim želimo omogočiti dostop do gruče za nadzorno ploščo in kubectl. Za razliko od OpenShift, vanilija Kubernetes nima izvorne avtentikacije, zato za to uporabljamo orodja tretjih oseb.
V tej konfiguraciji uporabljamo:
- — spletna aplikacija za generiranje konfiguracije kubectl
- — Ponudnik OpenID Connect
- GitHub – preprosto zato, ker uporabljamo GitHub v našem podjetju
Poskušali smo uporabiti Google OIDC, a žal smo da jih začnemo s skupinami, zato nam je integracija z GitHubom zelo ustrezala. Brez preslikave skupin ne bo mogoče ustvariti pravilnikov RBAC na podlagi skupin.
Torej, kako deluje naš avtorizacijski postopek Kubernetes v vizualni predstavitvi:

Postopek avtorizacije
Malo več podrobnosti in po točkah:
- Uporabnik se prijavi v dex-k8s-authenticator (
login.k8s.example.com) - dex-k8s-authenticator posreduje zahtevo Dexu (
dex.k8s.example.com) - Dex preusmeri na prijavno stran GitHub
- GitHub ustvari potrebne podatke za avtorizacijo in jih vrne Dexu
- Dex posreduje prejete informacije dex-k8s-authenticatorju
- Uporabnik prejme žeton OIDC od GitHub
- dex-k8s-authenticator doda žeton v kubeconfig
- kubectl posreduje žeton KubeAPIServerju
- KubeAPIServer vrne dostope do kubectl na podlagi posredovanega žetona
- Uporabnik dobi dostop iz kubectl
Pripravljalne dejavnosti
Seveda že imamo nameščeno gručo Kubernetes (k8s.example.com), prav tako pa ima vnaprej nameščen HELM. Imamo tudi organizacijo na GitHubu (super-org).
Če nimate HELM-a, ga namestite .
Najprej moramo nastaviti GitHub.
Pojdite na stran z nastavitvami organizacije, (https://github.com/organizations/super-org/settings/applications) in ustvarite novo aplikacijo (Authorized OAuth App):

Ustvarjanje nove aplikacije na GitHubu
Izpolnite polja s potrebnimi URL-ji, na primer:
- URL domače strani:
https://dex.k8s.example.com - URL povratnega klica avtorizacije:
https://dex.k8s.example.com/callback
Bodite previdni pri povezavah, pomembno je, da ne izgubite poševnic.
Kot odgovor na izpolnjen obrazec bo GitHub ustvaril Client ID и Client secret, jih hranimo na varnem mestu, nam bodo koristile (npr. uporabljamo za shranjevanje skrivnosti):
Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1 Pripravite DNS zapise za poddomene login.k8s.example.com и dex.k8s.example.com, kot tudi SSL certifikate za vstop.
Ustvarimo SSL certifikate:
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 z naslovom le-clusterissuer že mora obstajati, če pa ne, ga ustvarite s 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: {}
EOFKonfiguracija KubeAPIServer
Da kubeAPIServer deluje, morate konfigurirati OIDC in posodobiti gručo:
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 --yesUporabljamo za uvajanje gruč, vendar to deluje podobno za .
Konfiguracija Dex in dex-k8s-avtentifikator
Da bo Dex deloval, morate imeti potrdilo in ključ od masterja Kubernetes, poglejmo od tam:
sudo cat /srv/kubernetes/ca.{crt,key}
-----BEGIN CERTIFICATE-----
AAAAAAAAAAABBBBBBBBBBCCCCCC
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
DDDDDDDDDDDEEEEEEEEEEFFFFFF
-----END RSA PRIVATE KEY-----Klonirajmo repozitorij dex-k8s-authenticator:
git clone git@github.com:mintel/dex-k8s-authenticator.git
cd dex-k8s-authenticator/Z uporabo datotek z vrednostmi lahko prilagodljivo konfiguriramo spremenljivke za naše .
Opišimo konfiguracijo za 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
In za 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
EOFNamestite Dex in 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-authenticatorPreverimo delovanje storitev (Dex naj vrne kodo 400, dex-k8s-authenticator pa naj vrne kodo 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 200Konfiguracija RBAC
Ustvarimo ClusterRole za skupino, v našem primeru z dostopom samo za branje:
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"]
EOFUstvarimo konfiguracijo za 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"
EOFZdaj smo pripravljeni na testiranje.
Testi
Pojdite na stran za prijavo (https://login.k8s.example.com) in se prijavite s svojim računom GitHub:

prijavna stran

Stran za prijavo preusmerjena na GitHub

Za dostop sledite ustvarjenim navodilom
Po kopiranju in lepljenju s spletne strani lahko uporabimo kubectl za upravljanje naših virov gruče:
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" In deluje, vsi uporabniki GitHub v naši organizaciji si lahko ogledajo vire in se prijavijo v sklope, vendar nimajo pravic, da bi jih spreminjali.
Vir: www.habr.com
