En liten opplæring om hvordan du bruker Keycloak til å koble Kubernetes til LDAP-serveren din og sette opp import av brukere og grupper. Dette vil tillate deg å sette opp RBAC for brukerne dine og bruke auth-proxy for å beskytte Kubernetes Dashboard og andre applikasjoner som ikke vet hvordan de skal autorisere seg selv.
Keycloak installasjon
La oss anta at du allerede har en LDAP-server. Det kan være Active Directory, FreeIPA, OpenLDAP eller hva som helst. Hvis du ikke har en LDAP-server, så kan du i prinsippet opprette brukere direkte i Keycloak-grensesnittet, eller bruke offentlige oidc-leverandører (Google, Github, Gitlab), resultatet blir nesten det samme.
Først av alt, la oss installere Keycloak selv, installasjonen kan utføres separat, eller direkte til Kubernetes-klyngen, som regel, hvis du har flere Kubernetes-klynger, ville det være lettere å installere det separat. På den annen side kan du alltids bruke
For å lagre Keycloak-data trenger du en database. Standard er h2
(alle data lagres lokalt), men det er også mulig å bruke postgres
, mysql
eller mariadb
.
Hvis du likevel bestemmer deg for å installere Keycloak separat, kan du finne mer detaljerte instruksjoner i
Forbundsoppsett
Først av alt, la oss skape et nytt rike. Realm er plassen for applikasjonen vår. Hver applikasjon kan ha sin egen verden med forskjellige brukere og autorisasjonsinnstillinger. Mesterriket brukes av Keycloak selv, og å bruke det til noe annet er feil.
Klikk her Legg til rike
Alternativ
Verdi
Navn
kubernetes
Visningsnavn
Kubernetes
HTML-visningsnavn
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes sjekker som standard om brukerens e-post er bekreftet eller ikke. Siden vi bruker vår egen LDAP-server, vil denne sjekken nesten alltid komme tilbake false
. La oss deaktivere representasjonen av denne innstillingen i Kubernetes:
Klientomfang -> Epost -> Kartleggere -> e-post bekreftet (Slett)
La oss nå sette opp føderasjonen, for dette går vi til:
Brukerforbund -> Legg til leverandør... -> ldap
Her er et eksempeloppsett for FreeIPA:
Alternativ
Verdi
Visningsnavn for konsoll
freeipa.example.org
Leverandør
Red Hat Directory Server
UUID LDAP-attributt
ipauniqueid
Tilkoblings-URL
ldaps://freeipa.example.org
Bruker DN
cn=users,cn=accounts,dc=example,dc=org
Bind DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Bind legitimasjon
<password>
Tillat Kerberos-autentisering:
on
Kerberos Realm:
EXAMPLE.ORG
Server rektor:
HTTP/[email protected]
nøkkelfane:
/etc/krb5.keytab
bruker keycloak-svc
må opprettes på forhånd på vår LDAP-server.
Når det gjelder Active Directory, trenger du bare å velge Leverandør: Active Directory og de nødvendige innstillingene vil automatisk legges inn i skjemaet.
Klikk her Spar
La oss nå gå videre:
Brukerforbund -> freeipa.example.org -> Kartleggere -> Fornavn
Alternativ
Verdi
Ldap-attributter
givenName
La oss nå aktivere gruppekartlegging:
Brukerforbund -> freeipa.example.org -> Kartleggere -> Opprett
Alternativ
Verdi
Navn
groups
Mapper type
group-ldap-mapper
LDAP-grupper DN
cn=groups,cn=accounts,dc=example,dc=org
Hent strategi for brukergrupper
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Dette fullfører føderasjonsoppsettet, la oss gå videre til å sette opp klienten.
Klientoppsett
La oss lage en ny klient (en applikasjon som vil motta brukere fra Keycloak). La oss gå:
Klenter -> Opprett
Alternativ
Verdi
kunde-ID
kubernetes
Tilgangstype
confidenrial
Rot-URL
http://kubernetes.example.org/
Gyldige omdirigerings-URIer
http://kubernetes.example.org/*
Administrator-URL
http://kubernetes.example.org/
Vi vil også lage et omfang for grupper:
Klientomfang -> Opprett
Alternativ
Verdi
Mal
No template
Navn
groups
Full gruppevei
false
Og sett opp en kartlegger for dem:
Klientomfang -> grupper -> Kartleggere -> Opprett
Alternativ
Verdi
Navn
groups
Mapper Type
Group membership
Navn på tokenkrav
groups
Nå må vi aktivere gruppekartlegging i vårt kundeomfang:
Klenter -> Kubernetes -> Klientomfang -> Standard klientomfang
Velg grupper в Tilgjengelige klientomfang, trykk Legg til valgte
La oss nå sette opp autentiseringen av applikasjonen vår, gå til:
Klenter -> Kubernetes
Alternativ
Verdi
Autorisasjon aktivert
ON
La oss trykke redde og dette fullfører klientoppsettet, nå på fanen
Klenter -> Kubernetes -> Credentials
du kan få Secret som vi skal bruke videre.
Konfigurere Kubernetes
Å sette opp Kubernetes for OIDC-autorisasjon er ganske trivielt og ikke veldig komplisert. Alt du trenger å gjøre er å legge inn CA-sertifikatet til OIDC-serveren din /etc/kubernetes/pki/oidc-ca.pem
og legg til de nødvendige alternativene for kube-apiserver.
For å gjøre dette, oppdater /etc/kubernetes/manifests/kube-apiserver.yaml
på alle dine herrer:
...
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
...
Og oppdater også kubeadm-konfigurasjonen i klyngen for ikke å miste disse innstillingene under oppdateringen:
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
...
Dette fullfører Kubernetes-oppsettet. Du kan gjenta disse trinnene på tvers av alle Kubernetes-klyngene dine.
Innledende autorisasjon
Etter disse trinnene vil du allerede ha en Kubernetes-klynge med OIDC-autorisasjon konfigurert. Det eneste poenget er at brukerne dine ennå ikke har en klient konfigurert, så vel som sin egen kubeconfig. For å løse dette problemet må du konfigurere den automatiske utstedelsen av kubeconfig til brukere etter vellykket godkjenning.
For å gjøre dette kan du bruke spesielle nettapplikasjoner som lar deg autentisere brukeren og deretter laste ned den ferdige kubeconfig. En av de mest praktiske er
For å konfigurere Kuberos er det nok å beskrive malen for kubeconfig og kjøre den med følgende parametere:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
For flere detaljer se
Det er også mulig å bruke
Den resulterende kubeconfig kan sjekkes på nettstedet users[].user.auth-provider.config.id-token
fra kubeconfig til skjemaet på nettsiden og motta umiddelbart en utskrift.
RBAC oppsett
Når du konfigurerer RBAC, kan du referere til både brukernavnet (felt name
i jwt-tokenet) og for en gruppe brukere (felt groups
i jwt-token). Her er et eksempel på å angi tillatelser for en gruppe 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
Flere eksempler for RBAC finner du i
Innstilling av auth-proxy
Det er et fantastisk prosjekt
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
Kilde: www.habr.com