
Egy rövid útmutató arról, hogyan lehet a Keycloak segítségével összekapcsolni a Kubernetes-t a LDAP szerverével, és beállítani a felhasználók és csoportok importálását. Ez lehetővé teszi az RBAC konfigurálását a felhasználók számára és az auth-proxy használatát a Kubernetes Dashboard és más alkalmazások védelmére, amelyek nem tudják önállóan kezelni az autorizációt.
Keycloak telepítése
Tegyük fel, hogy már van LDAP szervere. Ez lehet Active Directory, FreeIPA, OpenLDAP vagy bármi más. Ha nincs LDAP szervere, akkor alapvetően felhasználókat hozhat létre közvetlenül a Keycloak felületén, vagy használhat nyilvános oidc szolgáltatókat (Google, Github, Gitlab), az eredmény majdnem ugyanaz lesz.
Először is telepítsük magát a Keycloak-ot, a telepítés végezhető önállóan is, vagy közvetlenül a Kubernetes klaszterbe. Általában, ha több Kubernetes klasztere van, célszerűbb külön telepíteni. Másrészt mindig használhatja és telepítheti közvetlenül a klaszterébe.
A Keycloak adatok tárolásához adatbázisra lesz szüksége. Alapértelmezésként h2 (minden adat helyben tárolva), de használhat postgres, mysql vagy mariadb.
Ha mégis külön szeretné telepíteni a Keycloak-ot, részletesebb útmutatót talál itt .
Föderáció beállítása
Először is, hozzunk létre egy új realm-et. A realm az alkalmazásunk területe. Minden alkalmazás saját realm-mel rendelkezhet különböző felhasználókkal és autorizációs beállításokkal. A Master realm-t a Keycloak saját maga használja, és nem helyes másra használni.
Kattintunk Realm hozzáadása
Opció
Érték
Név
kubernetes
Megjelenítési név
Kubernetes
HTML megjelenítési név
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
A Kubernetes alapértelmezés szerint ellenőrzi, hogy a felhasználónak van-e megerősített e-mail címe vagy sem. Mivel saját LDAP szervert használunk, ez az ellenőrzés szinte mindig hamislesz. Nézzük meg, hogyan kapcsolhatjuk ki ezt a paramétert a Kubernetes-ben:
Kliencskopák —> Email —> Leképezők —> E-mail megerősítve (Törlés)
Most beállítjuk a föderációt, ehhez lépjünk a következőre:
Felhasználói föderáció —> Szolgáltató hozzáadása… —> ldap
Példaként bemutatok egy beállítást a FreeIPA számára:
Opció
Érték
Konzol megjelenítési név
freeipa.example.org
Szállító
Red Hat Directory Server
UUID LDAP attribútum
ipauniqueid
Kapcsolati URL
ldaps://freeipa.example.org
Felhasználók DN
cn=users,cn=accounts,dc=example,dc=org
Bind DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Bind Credential
<password>
Kerberos hitelesítési engedélyezése:
on
Kerberos Realm:
EXAMPLE.ORG
Szerver principal:
HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:
/etc/krb5.keytab
A felhasználót keycloak-svc előre létre kell hozni a LDAP szerverünkön.
Active Directory esetén elegendő egyszerűen kiválasztani Szállító: Active Directory és a szükséges beállítások automatikusan kitöltődnek az űrlapon.
Kattintunk Mentés
Most lépjünk a következőre:
Felhasználói föderáció —> freeipa.example.org —> Leképezők —> Keresztnév
Opció
Érték
LDAP attribútum
givenName
Most kapcsoljuk be a csoporttérképezést:
Felhasználói föderáció —> freeipa.example.org —> Leképezők —> Létrehozás
Opció
Érték
Név
groups
Térképező típus
group-ldap-mapper
LDAP Csoportok DN
cn=groups,cn=accounts,dc=example,dc=org
Felhasználói Csoportok Lekérdezési Stratégiája
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Ezzel befejeztük a szövetségi beállítást, lépjünk tovább az ügyfél beállítására.
Kliens beállítása
Hozzunk létre egy új ügyfelet (alkalmazás, amely felhasználókat fog szerezni a Keycloak-ból). Lépjünk:
Ügyfelek —> Létrehozás
Opció
Érték
Client ID
kubernetes
Hozzáférési típus
bizalmas
Gyökér URL
http://kubernetes.example.org/
Érvényes Átirányító URI-k
http://kubernetes.example.org/*
Admin URL
http://kubernetes.example.org/
Most létrehozunk egy scope-ot a csoportok számára:
Ügyfél Scoped —> Létrehozás
Opció
Érték
Sablon
Nincs sablon
Név
groups
Teljes csoport útvonal
hamis
És konfigurálunk egy mappert számukra:
Ügyfél Scoped —> groups —> Leképezők —> Létrehozás
Opció
Érték
Név
groups
Térképező típus
Csoporttagság
Token Igény Név
groups
Most engedélyeznünk kell a csoportok térképezését az ügyfél scope-unkban:
Ügyfelek —> kubernetes —> Ügyfél Scoped —> Alapértelmezett Ügyfél Scoped
Kiválasztás groups be. Elérhető Client Scopes, kattintsunk Kiválasztott hozzáadása
Most konfiguráljuk az alkalmazásunk hitelesítését, lépjünk:
Ügyfelek —> kubernetes
Opció
Érték
Engedélyezett jogosultság
ON
Kattintsunk mentés és ezzel befejeztük az ügyfél beállítását, most a "
Ügyfelek —> kubernetes —> Hitelesítő adatok
fülön meg tudja szerezni Titkos kulcs amelyet a későbbiekben használni fogunk.
Kubernetes beállítása
A Kubernetes beállítása OIDC-hitelesítéssel meglehetősen egyszerű, és nem jelent komoly kihívást. Mindez annyit igényel, hogy a CA-tanúsítványt az OIDC-szerverének elhelyezzük a /etc/kubernetes/pki/oidc-ca.pem majd hozzáadjuk a szükséges opciókat a kube-apiserverhez.
Ehhez frissítse a /etc/kubernetes/manifests/kube-apiserver.yaml minden mesterében:
...
spec:
containers:
- command:
- kube-apiserver
...
- --oidc-ca-file=\/etc\/kubernetes\/pki\/oidc-ca.pem
- --oidc-client-id=kubernetes
- --oidc-groups-claim=groups
- --oidc-issuer-url=https:\/\/keycloak.example.org\/auth\/realms\/kubernetes
- --oidc-username-claim=email
...És frissítse a kubeadm konfigurációt a klaszterben, hogy ne veszítse el ezeket a beállításokat a frissítéskor:
kubectl edit -n kube-system configmaps kubeadm-config...
data:
ClusterConfiguration: |
apiServer:
extraArgs:
oidc-ca-file: \/etc\/kubernetes\/pki\/oidc-ca.pem
oidc-client-id: kubernetes
oidc-groups-claim: groups
oidc-issuer-url: https:\/\/keycloak.example.org\/auth\/realms\/kubernetes
oidc-username-claim: email
...Ezzel befejeztük a Kubernetes beállítását. Ezeket az intézkedéseket megismételheti minden Kubernetes-klaszterében.
Kezdeti hitelesítés
Ezek után már rendelkezni fog egy Kubernetes-klaszterrel, amely OIDC-hitelítéssel van beállítva. Az egyetlen probléma, hogy a felhasználóiak még nem rendelkeznek beállított ügyféllel és saját kubeconfiggal. A probléma megoldásához automatikus kubeconfig kiadásra van szükség a felhasználók számára a sikeres hitelesítés után.
Ehhez speciális webalkalmazásokat használhat, amelyek lehetővé teszik a felhasználó hitelesítését, majd a kész kubeconfig letöltését. Az egyik a legegyszerűbb — , amely lehetővé teszi, hogy egy konfiguráción belül minden Kubernetes-klasztert leírjon, és könnyen váltogathasson közöttük.
A Kuberos beállításához elegendő a kubeconfig sablon leírása és a következő paraméterekkel való futtatás:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/templateA részletesebb információkért nézze meg a Github-on.
Emellett használhatja , ha közvetlenül a felhasználó számítógépén szeretne bejelentkezni. Ebben az esetben a felhasználónak egy böngészőablak nyílik meg, amelyben a localhost-on kell bejelentkeznie.
A kapott kubeconfig ellenőrizhető a weboldalon . Csak másolja a következő értéket users[].user.auth-provider.config.id-token a kubeconfig-jából a weboldalon található űrlapba, és azonnal megkapja a dekódolást.
RBAC beállítása
RBAC beállításakor hivatkozhat felhasználónevére (mező name a jwt-tokenben), vagy felhasználói csoportra (mező groups a jwt-tokenben). Íme egy példa a jogok beállítására a csoport számára: kubernetes-default-namespace-admins:
kubernetes-default-namespace-admins.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: default-admins
namespace: default
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: kubernetes-default-namespace-admins
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: default-admins
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: kubernetes-default-namespace-adminsTovábbi példák az RBAC-ra találhatók itt:
auth-proxy beállítása
Van egy nagyszerű projekt , amely lehetővé teszi bármely alkalmazás védelmét, lehetőséget adva a felhasználónak az OIDC-szerveren való hitelesítésre. Megmutatom, hogyan állítható be a Kubernetes Dashboard példáján keresztül:
dashboard-proxy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kubernetes-dashboard-proxy
spec:
replicas: 1
template:
metadata:
labels:
app: kubernetes-dashboard-proxy
spec:
containers:
- args:
- --listen=0.0.0.0:80
- --discovery-url=https://keycloak.example.org/auth/realms/kubernetes
- --client-id=kubernetes
- --client-secret=
- --redirection-url=https://kubernetes-dashboard.example.org
- --enable-refresh-tokens=true
- --encryption-key=ooTh6Chei1eefooyovai5ohwienuquoh
- --upstream-url=https://kubernetes-dashboard.kube-system
- --resources=uri=/*
image: keycloak/keycloak-gatekeeper
name: kubernetes-dashboard-proxy
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /oauth/health
port: 80
initialDelaySeconds: 3
timeoutSeconds: 2
readinessProbe:
httpGet:
path: /oauth/health
port: 80
initialDelaySeconds: 3
timeoutSeconds: 2
---
apiVersion: v1
kind: Service
metadata:
name: kubernetes-dashboard-proxy
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: kubernetes-dashboard-proxy
type: ClusterIPForrás: habr.com
