
Kratki vodič o tome kako povezati Kubernetes s vašim LDAP poslužiteljem koristeći Keycloak i postaviti uvoz korisnika i grupa. To će omogućiti konfiguraciju RBAC-a za vaše korisnike i korištenje auth-proxy-a za zaštitu Kubernetes Dashboards i drugih aplikacija koje ne mogu samostalno provesti autorizaciju.
Instalacija Keycloak-a
Pretpostavimo da već imate LDAP poslužitelj. To može biti Active Directory, FreeIPA, OpenLDAP ili nešto drugo. Ako nemate LDAP poslužitelj, možete stvarati korisnike izravno u sučelju Keycloak-a ili koristiti javne oidc pružatelje (Google, Github, Gitlab), rezultat će biti gotovo isti.
Prvo ćemo instalirati sam Keycloak, instalacija se može obaviti odvojeno ili odmah u Kubernetes klasteru. Ako imate više Kubernetes klastera, obično bi bilo lakše instalirati ga odvojeno. S druge strane, uvijek možete koristiti i instalirati ga izravno u vaš klaster.
Za pohranu podataka Keycloak-a bit će vam potrebna baza podataka. Po defaultu se koristi h2 (svi podaci se čuvaju lokalno), ali također možete koristiti postgres, mysql ili mariadb.
Ako ste se odlučili instalirati Keycloak odvojeno, detaljnije upute možete pronaći u .
Postavljanje federacije
Prvo ćemo stvoriti novo kraljevstvo. Kraljevstvo je prostor naše aplikacije. Svaka aplikacija može imati svoje kraljevstvo s različitim korisnicima i postavkama autorizacije. Master kraljevstvo koristi sam Keycloak i pogrešno je koristiti ga za nešto drugo.
Kliknemo Dodaj kraljevstvo
Opcija
Vrijednost
Name
kubernetes
Prikazno ime
Kubernetes
HTML Prikazno ime
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes standardno provjerava je li korisnik potvrdio svoj email. Budući da koristimo vlastiti LDAP poslužitelj, ova provjera će gotovo uvijek vraćati false. Isključimo prikaz ove postavke u Kubernetes-u:
Klijentske sfere -> Email -> Mapperi -> Email potvrđen (Izbriši)
Sada ćemo postaviti federaciju, za to idemo na:
Federacija korisnika -> Dodaj pružatelja… -> ldap
Dajem primjer postavke za FreeIPA:
Opcija
Vrijednost
Naziv prikaza konzole
freeipa.example.org
Dobavljač
Red Hat Directory Server
UUID LDAP atribut
ipauniqueid
URL veze
ldaps://freeipa.example.org
DN korisnika
cn=users,cn=accounts,dc=example,dc=org
Bind DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Bind vjerodajnica
<password>
Dopusti Kerberos autentifikaciju:
uključeno
Kerberos kraljevstvo:
EXAMPLE.ORG
Server Principal:
HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:
/etc/krb5.keytab
Korisnika keycloak-svc treba prethodno stvoriti na našem LDAP poslužitelju.
U slučaju Active Directory, dovoljno je samo odabrati Dobavljač: Active Directory i potrebne postavke će se automatski unijeti u obrazac.
Kliknemo Spremi
Sada idemo na:
Federacija korisnika -> freeipa.example.org -> Mapperi -> Ime
Opcija
Vrijednost
Ldap atribut
givenName
Sada ćemo uključiti mapiranje grupa:
Federacija korisnika -> freeipa.example.org -> Mapperi -> Create
Opcija
Vrijednost
Name
groups
Tip mappera
group-ldap-mapper
LDAP Grupe DN
cn=groups,cn=accounts,dc=example,dc=org
Strategija dobivanja korisničkih grupa
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Time je postavljanje federacije završeno, pređimo na postavku klijenta.
Postavka klijenta
Stvorimo novog klijenta (aplikacija koja će primati korisnike iz Keycloak-a). Idemo na:
Klijenti -> Create
Opcija
Vrijednost
Client ID
kubernetes
Tip pristupa
confidenrial
Osnovni URL
http://kubernetes.example.org/
Valjane URI preusmjeravanja
http://kubernetes.example.org/*
Admin URL
http://kubernetes.example.org/
Također ćemo stvoriti scope za grupe:
Scopes klijenta -> Create
Opcija
Vrijednost
Predložak
Nema predloška
Name
groups
Puni put do grupe
false
I postavićemo mapper za njih:
Scopes klijenta -> groups -> Mapperi -> Create
Opcija
Vrijednost
Name
groups
Tip mappera
Članstvo u grupi
Ime tokenovog zahtjeva
groups
Sada trebamo omogućiti mapiranje grupa u našem client scope-u:
Klijenti -> kubernetes -> Scopes klijenta -> Zadani client scope-ovi
Biramo groups u Dostupni client scope-ovi, kliknite Dodaj odabrano
Sada ćemo postaviti autentifikaciju naše aplikacije, idemo na:
Klijenti -> kubernetes
Opcija
Vrijednost
Autorizacija omogućena
ON
Kliknite spremi i time je postavka klijenta završena, sada na kartici
Klijenti -> kubernetes -> Akreditivi
možete dobiti Tajna koju ćemo koristiti u nastavku.
Postavka Kubernetes-a
Postavka Kubernetes-a za OIDC-autorizaciju je relativno trivijalna i nije jako složena. Sve što trebate je staviti CA-certifikat vašeg OIDC-servera u /etc/kubernetes/pki/oidc-ca.pem i dodati potrebne opcije za kube-apiserver.
Za to ažurirajte /etc/kubernetes/manifests/kube-apiserver.yaml na svim vašim 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 te postavke prilikom 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
...Time je postavka Kubernetes-a završena. Možete ponoviti iste radnje u svim vašim Kubernetes klasterima.
Početna autorizacija
Nakon tih radnji već ćete imati Kubernetes klaster sa postavljenom OIDC-autorizacijom. Jedina stvar je da vaši korisnici još nemaju postavljenog klijenta kao ni vlastiti kubeconfig. Da biste riješili ovaj problem potrebno je postaviti automatsko izdavanje kubeconfig-a korisnicima nakon uspješne autorizacije.
Za to možete koristiti posebne web-aplikacije koje omogućuju autentifikaciju korisnika, a zatim preuzimanje gotovog kubeconfiga. Jedna od najpraktičnijih je , koja omogućuje opisivanje svih Kubernetes klastera u jednoj konfiguraciji i jednostavno prebacivanje između njih.
Za postavljanje Kuberosa dovoljno je opisati predložak za kubeconfig i pokrenuti s sljedećim parametrima:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/templateZa detaljnije informacije pogledajte na Githubu.
Također je moguće koristiti ako želite provesti autorizaciju izravno na korisničkom računalu. U tom slučaju korisniku će se otvoriti preglednik s obrascem za autorizaciju na localhostu.
Dobiveni kubeconfig možete provjeriti na web stranici . Jednostavno kopirajte vrijednost users[].user.auth-provider.config.id-token iz vašeg kubeconfiga u obrazac na web stranici i odmah ćete dobiti dešifriranje.
Postavljanje RBAC-a
Prilikom postavljanja RBAC-a možete se pozvati kako na ime korisnika (polje ime u jwt-tokenu), tako i na grupu korisnika (polje groups u jwt-tokenu). Evo primjera postavke prava 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-adminsViše primjera za RBAC možete pronaći u
Postavljanje auth-proxy-a
Postoji odličan projekt , koji omogućuje zaštitu bilo koje aplikacije, dajući korisniku mogućnost autentifikacije na OIDC poslužitelju. Pokazat ću kako ga postaviti na primjeru Kubernetes Dashborda:
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
