
En kort vejledning til, hvordan du kan forbinde Kubernetes med din LDAP-server ved hjĂŠlp af Keycloak og konfigurere import af brugere og grupper. Dette vil gĂžre det muligt at konfigurere RBAC for dine brugere og bruge auth-proxy til at beskytte Kubernetes Dashboard og andre applikationer, der ikke kan autentificere sig selv.
Installation af Keycloak
Lad os antage, at du allerede har en LDAP-server. Det kan vĂŠre Active Directory, FreeIPA, OpenLDAP eller noget andet. Hvis du ikke har en LDAP-server, kan du grundlĂŠggende oprette brugere direkte i Keycloak-interfacet eller bruge offentlige oidc-udbydere (Google, Github, Gitlab), resultatet vil blive nĂŠsten det samme.
FĂžrst skal vi installere selve Keycloak; installationen kan udfĂžres separat eller direkte i Kubernetes-klyngen. Hvis du har flere Kubernetes-klynger, vil det typisk vĂŠre lettere at installere det separat. PĂ„ den anden side kan du altid bruge og installere den direkte i din klynge.
For at gemme data i Keycloak har du brug for en database. Som standard bruges h2 (alle data gemmes lokalt), men det er ogsÄ muligt at bruge postgres, mysql eller mariadb.
Hvis du alligevel har besluttet at installere Keycloak separat, finder du mere detaljerede instruktioner i .
Konfiguration af federation
FĂžrst opretter vi et nyt realm. Et realm er et rum for vores applikation. Hver applikation kan have sit eget realm med forskellige brugere og autentifikationsindstillinger. Master realm bruges af Keycloak selv, og det er forkert at bruge det til andet.
Klik pÄ TilfÞj realm
Mulighed
VĂŠrdi
Navn
kubernetes
Visningsnavn
Kubernetes
HTML Visningsnavn
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes tjekker som standard, om en brugers e-mail er bekrĂŠftet eller ej. Da vi bruger vores egen LDAP-server, vil denne kontrol nĂŠsten altid returnere false. Lad os deaktivere visningen af denne parameter i Kubernetes:
Klientomfang â> E-mail â> Mapper â> E-mail bekrĂŠftet (Slet)
Nu konfigurerer vi federation, for dette gÄr vi til:
Brugerfederation â> TilfĂžj udbyder⊠â> ldap
Her er et eksempel pÄ konfiguration for FreeIPA:
Mulighed
VĂŠrdi
Konsol Visningsnavn
freeipa.example.org
LeverandĂžr
Red Hat Directory Server
UUID LDAP-attribut
ipauniqueid
Forbindelses-URL
ldaps://freeipa.example.org
Brugere 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>
Tillad Kerberos autentifikation:
on
Kerberos Realm:
EXAMPLE.ORG
Server Principal:
HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:
/etc/krb5.keytab
Brugeren keycloak-svc skal oprettes pÄ forhÄnd pÄ vores LDAP-server.
I tilfĂŠlde af Active Directory er det tilstrĂŠkkeligt blot at vĂŠlge LeverandĂžr: Active Directory og de nĂždvendige indstillinger vil automatisk blive indsat i formen.
Klik pÄ Gem
Nu gÄr vi videre til:
Brugerfederation â> freeipa.example.org â> Mapper â> Fornavn
Mulighed
VĂŠrdi
LDAP-attribut
givenName
Lad os nu aktivere gruppe-mapping:
Brugerfederation â> freeipa.example.org â> Mapper â> Opret
Mulighed
VĂŠrdi
Navn
groups
Mapper type
group-ldap-mapper
LDAP Grupper DN
cn=groups,cn=accounts,dc=example,dc=org
Brugergrupper Hentningsstrategi
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Nu er konfigurationen af federation afsluttet, lad os gÄ videre til klientkonfigurationen.
Klientkonfiguration
Vi opretter en ny klient (applikation, der vil hente brugere fra Keycloak). GĂ„ til:
Klienter â> Opret
Mulighed
VĂŠrdi
Denne ID bruges til at identificere
kubernetes
Adgangstype
confidenrial
Rod URL
http://kubernetes.example.org/
Gyldige omdirigerings-URIs
http://kubernetes.example.org/*
Admin URL
http://kubernetes.example.org/
Vi opretter ogsÄ et scope for grupper:
Klient Scopes â> Opret
Mulighed
VĂŠrdi
Skabelon
Ingen skabelon
Navn
groups
Fuld gruppevej
false
Og vi konfigurerer mapper til dem:
Klient Scopes â> groups â> Mapper â> Opret
Mulighed
VĂŠrdi
Navn
groups
Mapper Type
Gruppemedlemskab
Token Claim Navn
groups
Nu skal vi aktivere gruppering i vores klient scope:
Klienter â> kubernetes â> Klient Scopes â> Standard Klient Scopes
Vi vÊlger groups i TilgÊngelige Client Scopes, klik pÄ TilfÞj valgte
Lad os nu konfigurere godkendelse af vores applikation, gÄ til:
Klienter â> kubernetes
Mulighed
VĂŠrdi
Autorisation Aktiveret
TIL
Klik pÄ gem og hermed er oprettelsen af klienten fÊrdig, nu pÄ fanen
Klienter â> kubernetes â> Oplysninger
vil du kunne fÄ Secret som vi vil bruge fremadrettet.
Kubernetes konfiguration
Konfiguration af Kubernetes til OIDC-godkendelse er ganske triviel og ikke sĂŠrlig kompleks. Alt, hvad du behĂžver, er at placere CA-certifikatet fra din OIDC-server i /etc/kubernetes/pki/oidc-ca.pem og tilfĂžje de nĂždvendige indstillinger til kube-apiserver.
For at gÞre dette, opdater /etc/kubernetes/manifests/kube-apiserver.yaml pÄ alle dine mastere:
...
spec:
containere:
- kommando:
- 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
...Opdater ogsÄ kubeadm-konfigurationen i klyngen, sÄ du ikke mister disse indstillinger ved opdatering:
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
...Nu er konfigurationen af Kubernetes afsluttet. Du kan gentage disse handlinger i alle dine Kubernetes-klynger.
Indledende godkendelse
Efter disse handlinger vil du have en Kubernetes-klynge med konfigureret OIDC-godkendelse. Den eneste ting er, at dine brugere endnu ikke har konfigureret en klient eller deres egen kubeconfig. For at lĂžse dette problem skal du konfigurere automatisk udstedelse af kubeconfig til brugerne efter en succesfuld godkendelse.
Til dette kan du bruge specielle webapplikationer, der muliggÞr brugerautentifikation og derefter muliggÞr download af en klar kubeconfig. En af de mest bekvemme er , som gÞr det muligt at beskrive alle Kubernetes-klynger i én konfigurationsfil og nemt skifte imellem dem.
For at konfigurere Kuberos er det nok at beskrive en skabelon til kubeconfig og starte med fĂžlgende parametre:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/templateFor more detailed information, see on Github.
It is also possible to use if you want to perform authentication directly on the user's computer. In this case, a browser will open for the user with an authentication form on localhost.
The obtained kubeconfig can be verified on the site . Just copy the value users[].user.auth-provider.config.id-token from your kubeconfig into the form on the site and immediately get the decryption.
Setting up RBAC
When configuring RBAC, you can refer to either the username (the field name in the jwt token) or to the user group (the field groups in the jwt token). Here is an example of rights configuration for the group 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-adminsMore examples for RBAC can be found in
Konfiguration af auth-proxy
There is a wonderful project , which allows securing any application, giving the user the ability to authenticate on an OIDC server. I will show how to set it up using the example of 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: ClusterIPKilde: habr.com
