Bemutatom nektek a tutoriált a jogosultságok generálásához a Kubernetes klaszterhez Dex, dex-k8s-authenticator és GitHub segítségével.

Helyi mém az orosz nyelvű Kubernetes csevegőből a
Bevezetés
A Kubernetes-t használjuk dinamikus környezetek létrehozására a fejlesztői és QA csapat számára. Így hozzáférést szeretnénk biztosítani számukra a klaszterhez, mind a műszerfalhoz, mind a kubectl-hez. Az OpenShift-tel ellentétben a natív Kubernetes nem rendelkezik beépített hitelesítéssel, ezért külső eszközöket használunk ennek megvalósításához.
Ebben a konfigurációban a következőket használjuk:
- — webalkalmazás a kubectl konfiguráció generálásához
- — OpenID Connect szolgáltató
- GitHub — csak azért, mert a GitHub-ot használjuk a cégünknél
Próbáltuk használni a Google OIDC-t, de sajnos nem behoznunk őket csoportokkal, ezért a GitHub integrációval teljesen elégedettek vagyunk. Csoportok nélküli leképezés nélkül nem lehet RBAC politikákat létrehozni csoportok alapján.
Tehát hogyan is működik a Kubernetes hitelesítési folyamatunk vizuálisan:

Hitelesítési folyamat
Kicsit részletesebben és pontokba szedve:
- A felhasználó belép a dex-k8s-authenticatorba (
login.k8s.example.com) - a dex-k8s-authenticator átirányítja a kérést a Dex-be (
dex.k8s.example.com) - A Dex átirányít a GitHub hitelesítési oldalára
- A GitHub generálja a szükséges hitelesítési információkat és visszaküldi azokat a Dex-nek
- A Dex továbbítja a szerzett információt a dex-k8s-authenticatornak
- A felhasználó OIDC tokent kap a GitHub-tól
- A dex-k8s-authenticator hozzáadja a tokent a kubeconfighoz
- A kubectl továbbítja a tokent a KubeAPIServernek
- A KubeAPIServer a megadott token alapján visszaadja a hozzáféréseket a kubectl-nek
- A felhasználó hozzáféréseket kap a kubectl-től
Előkészítő lépések
Nyilvánvalóan már telepítve van a Kubernetes klaszterünk (k8s.example.com), valamint a HELM is előre telepítve van. Továbbá van egy szervezetünk a GitHub-on (super-org).
Ha nincs HELM, akkor annak telepítése .
Először is be kell állítanunk a GitHub-ot.
Lépjünk a szervezet beállításaihoz, (https://github.com/organizations/super-org/settings/applications) és hozzunk létre egy új alkalmazást (Engedélyezett OAuth App):

Új alkalmazás létrehozása a GitHub-on
Töltsük ki a mezőket a szükséges URL-ekkel, például:
- Honlap URL:
https://dex.k8s.example.com - Engedélyezési visszahívási URL:
https://dex.k8s.example.com/callback
Legyünk figyelmesek a linkekre, fontos, hogy ne veszítsük el a perjelet.
A kitöltött űrlapra a GitHub generálni fogja Client ID és Client secret, őrizzük meg ezeket biztonságos helyen, szükségünk lesz rájuk (például mi a tárolót használjuk a titkokhoz):
Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1 Készítse el a DNS rekordokat a szubdoménekhez login.k8s.example.com és dex.k8s.example.com, valamint SSL-tanúsítványokat az ingress-ekhez.
Hozzunk létre SSL-tanúsítványokat:
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 néven le-clusterissuer már léteznie kell, ha nem, létrehozzuk HELM-mel:
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: {}
EOFKubeAPIServer konfiguráció
A kubeAPIServer működéséhez OIDC-t kell konfigurálni és frissíteni a klasztert:
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 --yesHasználunk az klaszterek telepítéséhez, de analóg módon működik más klasztermenedzserekhez is .
Dex és dex-k8s-authenticator konfiguráció
A Dex működtetéséhez tanúsítványra és kulcsra van szükség a Kubernetes mesterből, tegyük ezt ki onnan:
sudo cat /srv/kubernetes/ca.{crt,key}
-----BEGIN CERTIFICATE-----
AAAAAAAAAAABBBBBBBBBBCCCCCC
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
DDDDDDDDDDDEEEEEEEEEEFFFFFF
-----END RSA PRIVATE KEY-----Klónozzuk a dex-k8s-authenticator tárolót:
git clone git@github.com:mintel/dex-k8s-authenticator.git
cd dex-k8s-authenticator/A values-fájlok segítségével rugalmasan állíthatjuk be a változókat az .
Írjuk le a konfigurációt a Dex számára:
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
És a dex-k8s-authenticator számára:
cat < values-auth.yml
global:
deployEnv: prod
dexK8sAuthenticator:
clusters:
- name: k8s.example.com
short_description: "k8s klaszter"
description: "Kubernetes klaszter"
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
EOFTelepítjük a Dex-et és a dex-k8s-authenticator-t:
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-authenticatorEllenőrizzük a szolgáltatások működését (a Dex-nek 400-as kódot, a dex-k8s-authenticator-nek pedig 200-as kódot kell visszaadnia):
curl -sI https://dex.k8s.example.com/callback | head -1
HTTP/2 400
curl -sI https://login.k8s.example.com/ | head -1
HTTP/2 200RBAC konfiguráció
Létrehozunk egy ClusterRole-t a csoport számára, a mi esetünkben read-only hozzáférésekkel:
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"]
EOFHozzunk létre egy konfigurációt a ClusterRoleBinding számára:
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"
EOFMost készen állunk a tesztelésre.
Tesztelés
Lépjünk a bejelentkező oldalra (https://login.k8s.example.com) és engedélyezzük magunkat GitHub-fiókkal:

Bejelentkező oldal

Bejelentkező oldal átirányítva GitHub-ra

Kövesd az előállított utasítást a hozzáférések megszerzéséhez
A weboldalról másolt tartalom után használhatjuk a kubectl-t a klaszterünk erőforrásainak kezelésére:
kubectl get po
NÉV KÉSZ ÁLLAPOT ÚJRASZERVEZÉSEK KOR
mypod 1/1 FUtólagos 0 3d
kubectl delete po mypod
Hiba a szervertől (Tiltott): pods "mypod" törlése tilos: A felhasználó "amet@example.com" nem törölhet podokat a "default" névtérben És ez működik, az összes GitHub-felhasználónk a szervezetünkben láthatja az erőforrásokat és beléphet a podokba, de nincs joguk azok módosítására.
Forrás: habr.com
