Mali vodič o tome kako koristiti Keycloak za povezivanje Kubernetesa sa vašim LDAP serverom i postavljanje uvoza korisnika i grupa. Ovo će vam omogućiti da postavite RBAC za svoje korisnike i koristite auth-proxy da zaštitite Kubernetes Dashboard i druge aplikacije koje ne znaju kako da se autoriziraju.
Keycloak Installation
Pretpostavimo da već imate LDAP server. To može biti Active Directory, FreeIPA, OpenLDAP ili bilo šta drugo. Ako nemate LDAP server, onda u principu možete kreirati korisnike direktno u Keycloak interfejsu, ili koristiti javne oidc provajdere (Google, Github, Gitlab), rezultat će biti skoro isti.
Prije svega, instalirajmo sam Keycloak, instalacija se može izvršiti zasebno, ili direktno u Kubernetes klaster, po pravilu, ako imate više Kubernetes klastera, bilo bi lakše instalirati ga zasebno. S druge strane, uvijek možete koristiti
Da biste pohranili Keycloak podatke, trebat će vam baza podataka. Podrazumevano je h2
(svi podaci se pohranjuju lokalno), ali je također moguće koristiti postgres
, mysql
ili mariadb
.
Ako se ipak odlučite zasebno instalirati Keycloak, detaljnije upute možete pronaći u
Postavljanje federacije
Pre svega, hajde da stvorimo novo carstvo. Realm je prostor naše aplikacije. Svaka aplikacija može imati svoje područje s različitim korisnicima i postavkama autorizacije. Glavno područje koristi sam Keycloak i njegovo korištenje za bilo šta drugo je pogrešno.
Pritisni Dodaj carstvo
opcija
vrijednost
Ime
kubernetes
Display Name
Kubernetes
HTML ime za prikaz
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes po defaultu provjerava da li je email korisnika potvrđen ili ne. Pošto koristimo sopstveni LDAP server, ova provera će se skoro uvek vratiti false
. Hajde da onemogućimo predstavljanje ove postavke u Kubernetesu:
Opsezi klijenta -> E-mail -> Maperi -> email verifikovan (Izbriši)
Sada postavimo federaciju, za ovo idemo na:
Korisnička federacija -> Dodaj provajdera… -> ldap
Evo primjera podešavanja za FreeIPA:
opcija
vrijednost
Ime za prikaz konzole
freeipa.example.org
Prodavac
Red Hat Directory Server
UUID LDAP atribut
ipauniqueid
URL veze
ldaps://freeipa.example.org
Korisnik DN
cn=users,cn=accounts,dc=example,dc=org
Vezi DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Povežite akreditiv
<password>
Dozvoli Kerberos autentifikaciju:
on
Kerberos carstvo:
EXAMPLE.ORG
Direktor servera:
HTTP/[email protected]
ključna kartica:
/etc/krb5.keytab
Korisnik keycloak-svc
moraju biti kreirani unaprijed na našem LDAP serveru.
U slučaju Active Directory, jednostavno odaberite Dobavljač: Active Directory a potrebna podešavanja će se automatski ubaciti u obrazac.
Pritisni Save
Sada idemo dalje:
Korisnička federacija -> freeipa.example.org -> Maperi -> Ime
opcija
vrijednost
Ldap atributi
givenName
Sada omogućite grupno mapiranje:
Korisnička federacija -> freeipa.example.org -> Maperi -> stvoriti
opcija
vrijednost
Ime
groups
Tip mapera
group-ldap-mapper
LDAP grupe DN
cn=groups,cn=accounts,dc=example,dc=org
Strategija preuzimanja korisničke grupe
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Ovim je završeno podešavanje federacije, idemo dalje na postavljanje klijenta.
Podešavanje klijenta
Kreirajmo novog klijenta (aplikaciju koja će primati korisnike iz Keycloaka). Idemo:
Klijenata -> stvoriti
opcija
vrijednost
ID klijenta
kubernetes
Vrsta pristupa
confidenrial
Korijenski URL
http://kubernetes.example.org/
Važeći URI za preusmjeravanje
http://kubernetes.example.org/*
Admin URL
http://kubernetes.example.org/
Takođe ćemo kreirati prostor za grupe:
Opsezi klijenta -> stvoriti
opcija
vrijednost
šablon
No template
Ime
groups
Puna putanja grupe
false
I postavite maper za njih:
Opsezi klijenta -> grupe -> Maperi -> stvoriti
opcija
vrijednost
Ime
groups
Mapper Type
Group membership
Naziv potraživanja tokena
groups
Sada moramo omogućiti grupno mapiranje u našem opsegu klijenta:
Klijenata -> kubernetes -> Opsezi klijenta -> Zadani opseg klijenta
Odaberite grupe в Dostupni opseg klijenta, pritisnite Dodaj odabrano
Sada postavimo autentifikaciju naše aplikacije, idite na:
Klijenata -> kubernetes
opcija
vrijednost
Autorizacija je omogućena
ON
Hajde da guramo štedi i time se završava podešavanje klijenta, sada na kartici
Klijenata -> kubernetes -> akreditiv
Možeš dobiti tajna koje ćemo kasnije koristiti.
Konfigurisanje Kubernetesa
Podešavanje Kubernetesa za OIDC autorizaciju je prilično trivijalno i nije nešto previše komplikovano. Sve što treba da uradite je da ubacite CA sertifikat vašeg OIDC servera /etc/kubernetes/pki/oidc-ca.pem
i dodajte potrebne opcije za kube-apiserver.
Da biste to učinili, ažurirajte /etc/kubernetes/manifests/kube-apiserver.yaml
na svim tvojim majstorima:
...
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
...
Također ažurirajte kubeadm konfiguraciju u klasteru kako ne biste izgubili ove postavke tokom ažuriranja:
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
...
Ovim je završeno podešavanje Kubernetesa. Možete ponoviti ove korake u svim svojim Kubernetes klasterima.
Inicijalna autorizacija
Nakon ovih koraka, već ćete imati konfiguriranu Kubernetes klaster s OIDC autorizacijom. Jedina stvar je da vaši korisnici još nemaju konfiguriran klijent, kao ni vlastitu kubeconfig. Da biste riješili ovaj problem, morate konfigurirati automatsko izdavanje kubeconfig korisnicima nakon uspješne autorizacije.
Da biste to učinili, možete koristiti posebne web aplikacije koje vam omogućavaju autentifikaciju korisnika, a zatim preuzeti gotovu kubeconfig. Jedan od najpovoljnijih je
Za konfiguraciju Kuberosa, dovoljno je opisati predložak za kubeconfig i pokrenuti ga sa sljedećim parametrima:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
Za više detalja pogledajte
Također je moguće koristiti
Dobijeni kubeconfig se može provjeriti na web stranici users[].user.auth-provider.config.id-token
sa vašeg kubeconfig-a na obrazac na stranici i odmah preuzmite transkript.
RBAC podešavanje
Kada konfigurišete RBAC, možete se pozvati i na korisničko ime (polje name
u jwt tokenu) i za grupu korisnika (polje groups
u jwt tokenu). Evo primjera postavljanja dozvola za grupu 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-admins
Više primjera za RBAC možete pronaći u
Postavljanje auth-proxy
Postoji divan projekat
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=<your-client-secret-here>
- --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: ClusterIP
izvor: www.habr.com