
Majhna navodila o tem, kako lahko z uporabo Keycloaka povežete Kubernetes z vašim LDAP strežnikom in nastavite uvoz uporabnikov in skupin. To bo omogočilo nastavitev RBAC za vaše uporabnike ter uporabo auth-proxy za zaščito Kubernetes nadzorne plošče in drugih aplikacij, ki ne morejo samostojno izvajati avtorizacije.
Instalacija Keycloak-a
Recimo, da že imate LDAP strežnik. To je lahko Active Directory, FreeIPA, OpenLDAP ali karkoli drugega. Če LDAP strežnika nimate, lahko v bistvu ustvarite uporabnike neposredno v vmesniku Keycloaka ali pa uporabite javne oidc ponudnike (Google, Github, Gitlab), rezultat bo skoraj enak.
Najprej namestimo sam Keycloak, namestitev se lahko izvede posebej ali takoj v Kubernetes grozdu, običajno, če imate več Kubernetes grozdov, bi bilo lažje namestiti ga posebej. Po drugi strani pa lahko vedno uporabite in ga namestite neposredno v vaš grozd.
Za shranjevanje podatkov Keycloaka potrebujete bazo podatkov. Po privzetu se uporablja h2 (vsi podatki se shranijo lokalno), vendar je mogoče tudi uporabiti postgres, mysql ili mariadb.
Če se kljub vsemu odločite namestiti Keycloak posebej, boste našli bolj podrobna navodila v .
Nastavitev federacije
Najprej ustvarimo nov realm. Realm je prostor naše aplikacije. Vsaka aplikacija ima lahko svoj realm z različnimi uporabniki in nastavitvami avtorizacije. Master realm se uporablja samim Keycloakom in ga ni primerno uporabljati za kaj drugega.
Kliknite Dodaj domeno
Option
Vrednost
Ime
kubernetes
Prikazno ime
Kubernetes
HTML Display Name
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes po privzetu preverja, ali je uporabnik potrdil svoj e-poštni naslov ali ne. Ker uporabljamo lasten LDAP strežnik, bo to preverjanje skoraj vedno vrnilo false. Izklopimo prikaz te možnosti v Kubernetesu:
Client scopes —> Email —> Mappers —> Email verified (Zbriši)
Zdaj nastavimo federacijo, zato pojdimo na:
User federation —> Dodaj ponudnika… —> ldap
Navedel bom primer nastavitve za FreeIPA:
Option
Vrednost
Console Display Name
freeipa.example.org
Vendor
Red Hat Directory Server
UUID LDAP attribute
ipauniqueid
Connection URL
ldaps://freeipa.example.org
Users 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>
Dovoli Kerberos avtorizacijo:
on
Kerberos Realm:
EXAMPLE.ORG
Server Principal:
HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:
/etc/krb5.keytab
Uporabnika keycloak-svc treba ustvariti vnaprej na našem LDAP strežniku.
V primeru Active Directory je dovolj, da preprosto izberete Vendor: Active Directory in potrebne nastavitve se samodejno vstavijo v obrazec.
Kliknite Shrani
Zdaj preidemo na:
User federation —> freeipa.example.org —> Mappers —> Ime
Option
Vrednost
Ldap attribure
givenName
Sedaj vključimo skupinsko preslikavo:
User federation —> freeipa.example.org —> Mappers —> Stworzyć
Option
Vrednost
Ime
groups
Vrsta mapperja
group-ldap-mapper
LDAP skupine DN
cn=groups,cn=accounts,dc=example,dc=org
Strategija pridobivanja uporabniških skupin
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
S tem je nastavitev federacije zaključena, preidemo na nastavitev odjemalca.
Nastavitev stranke
Ustvarimo novega odjemalca (aplikacija, ki bo pridobivala uporabnike iz Keycloak-a). Preidemo na:
Odjemalci —> Stworzyć
Option
Vrednost
Client ID
kubernetes
Vrsta dostopa
zaupno
Koren URL
http://kubernetes.example.org/
Veljavne preusmeritvene URI
http://kubernetes.example.org/*
URL skrbnika
http://kubernetes.example.org/
Prav tako bomo ustvarili obseg za skupine:
Obsegi odjemalca —> Stworzyć
Option
Vrednost
Template
Brez predloge
Ime
groups
Polna pot skupine
false
In nastavimo mappers zanje:
Obsegi odjemalca —> groups —> Mappers —> Stworzyć
Option
Vrednost
Ime
groups
Vrsta mapperja
Članstvo v skupini
Ime zahteve žetona
groups
Sedaj moramo vključiti preslikavo skupin v našem obsegu odjemalca:
Odjemalci —> kubernetes —> Obsegi odjemalca —> Privzeti obsegi odjemalca
Izbiramo groups u Na voljo Client Scopes, kliknite Dodaj izbrano
Sedaj bomo nastavili avtentikacijo naše aplikacije, preidemo na:
Odjemalci —> kubernetes
Option
Vrednost
Avtorizacija omogočena
VKLJUČENO
Kliknite save in s tem je nastavitev odjemalca zaključena, zdaj na zavihku
Odjemalci —> kubernetes —> Zahteve
boste lahko pridobili Tajni ki ga bomo uporabili naprej.
Nastavitev Kubernetes
Nastavitev Kubernetes za OIDC-avtorizacijo je precej enostavna in ni zelo zapletena. Vse, kar potrebujete, je, da naložite CA-certifikat vašega OIDC strežnika v /etc/kubernetes/pki/oidc-ca.pem in dodate potrebne možnosti za kube-apiserver.
Zato posodobite /etc/kubernetes/manifests/kube-apiserver.yaml na vseh vaših masterih:
...
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
...Prav tako posodobite kubeadm konfiguracijo v klasterju, da ne izgubite teh nastavitev pri posodobitvah:
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
...S tem je nastavitev Kubernetes zaključena. Te iste korake lahko ponovite v vseh vaših Kubernetes klasterjih.
Začetna avtentikacija
Po teh korakih boste imeli Kubernetes klaster z nastavljeno OIDC-avtorizacijo. Edina zadeva je, da vaši uporabniki trenutno nimajo nastavljene stranke, prav tako niti svojega kubeconfig. Da bi to težavo rešili, je treba nastaviti samodejno izdajo kubeconfiga uporabnikom po uspešni avtentikaciji.
Za to lahko uporabite posebne spletne aplikacije, ki omogočajo avtentikacijo uporabnika in nato prenos pripravljenega kubeconfiga. Ena izmed najbolj priročnih je , ki omogoča opis vseh Kubernetes klasterjev v eni konfiguraciji in enostavno preklapljanje med njimi.
Za nastavitev Kuberos je dovolj, da opišete predlogo za kubeconfig in zaženete z naslednjimi parametri:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/templateZa podrobnejše informacije si oglejte na Githubu.
Prav tako je mogoče uporabiti če želite izvesti avtentikacijo neposredno na uporabnikovem računalniku. V tem primeru se bo uporabniku odprl brskalnik s prijavno formo na localhost.
Prejeti kubeconfig lahko preverite na spletni strani . Preprosto kopirajte vrednost users[].user.auth-provider.config.id-token iz vašega kubeconfiga v obrazec na spletu in takoj prejmite razlago.
Nastavitev RBAC
Pri nastavitvi RBAC se lahko sklicujete tako na uporabniško ime (polje name v jwt-tokenu), kot tudi na skupino uporabnikov (polje groups v jwt-tokenu). Tukaj je primer nastavitve pravic za skupino 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-adminsVeč primerov za RBAC lahko najdete v
Настройка auth-proxy
Obstaja odličen projekt , ki omogoča zaščito katere koli aplikacije, tako da uporabniku omogoči avtentikacijo na OIDC-strežniku. Pokažem vam, kako ga nastaviti na primeru Kubernetes Dashboard:
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: ClusterIPIzvor: habr.com
