
Eine kurze Anleitung, wie Sie mit Keycloak Kubernetes mit Ihrem LDAP-Server verbinden und den Import von Benutzern und Gruppen konfigurieren können. Dies ermöglicht die Einrichtung von RBAC fĂŒr Ihre Benutzer und die Verwendung von auth-proxy zum Schutz des Kubernetes Dashboards und anderer Anwendungen, die keine eigene Authentifizierung durchfĂŒhren können.
Installation von Keycloak
Angenommen, Sie haben bereits einen LDAP-Server. Dies könnte Active Directory, FreeIPA, OpenLDAP oder etwas anderes sein. Wenn Sie keinen LDAP-Server haben, können Sie Benutzer direkt ĂŒber die Keycloak-OberflĂ€che erstellen oder öffentliche OIDC-Anbieter (Google, Github, Gitlab) nutzen, das Ergebnis wird fast dasselbe sein.
Zuerst installieren wir Keycloak selbst, die Installation kann sowohl separat als auch direkt im Kubernetes-Cluster erfolgen. In der Regel wÀre es einfacher, es separat zu installieren, wenn Sie mehrere Kubernetes-Cluster haben. Andererseits können Sie immer verwenden und es direkt in Ihrem Cluster installieren.
FĂŒr die Speicherung von Keycloak-Daten benötigen Sie eine Datenbank. StandardmĂ€Ăig wird h2 verwendet (alle Daten werden lokal gespeichert), aber Sie können auch in einer Umgebung, in der die Locale nicht UTF-8 ist, beispielsweise in einer leeren Umgebung (hier, mysql oder mariadb.
verwenden. Wenn Sie sich entscheiden, Keycloak separat zu installieren, finden Sie detailliertere Anweisungen in .
Einrichtung der Föderation
Zuerst erstellen wir ein neues Realm. Ein Realm ist ein Bereich unserer Anwendung. Jede Anwendung kann ihr eigenes Realm mit unterschiedlichen Benutzern und Authentifizierungseinstellungen haben. Das Master-Realm wird von Keycloak selbst verwendet, und es ist nicht richtig, es fĂŒr etwas anderes zu verwenden.
Klicken Sie auf Realm hinzufĂŒgen
Option
Wert
Name
Kubernetes
Anzeigename
Kubernetes
HTML-Anzeigename
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes ĂŒberprĂŒft standardmĂ€Ăig, ob die E-Mail des Benutzers bestĂ€tigt ist oder nicht. Da wir einen eigenen LDAP-Server verwenden, wird diese ĂberprĂŒfung hier fast immer zurĂŒckgeben false. Lassen Sie uns die Anzeige dieser Einstellung in Kubernetes deaktivieren:
Client-Scopes â> E-Mail â> Mapper â> E-Mail verifiziert (Löschen)
Jetzt konfigurieren wir die Föderation. Gehen Sie dazu zu:
Benutzerföderation â> Anbieter hinzufĂŒgen ⊠â> ldap
Ich gebe ein Beispiel fĂŒr die Konfiguration fĂŒr FreeIPA:
Option
Wert
Konsolenanzeigename
freeipa.example.org
Anbieter
Red Hat Directory Server
UUID-LDAP-Attribut
ipauniqueid
Verbindungs-URL
ldaps://freeipa.example.org
Benutzer-DN
cn=users,cn=accounts,dc=example,dc=org
Bind-DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Bind-Anmeldeinformationen
<password>
Erlaube Kerberos-Authentifizierung:
on
Kerberos-Realm:
EXAMPLE.ORG
Server-Prinzipal:
HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:
/etc/krb5.keytab
Benutzer keycloak-svc muss im Voraus auf unserem LDAP-Server erstellt werden.
Im Falle von Active Directory reicht es aus, einfach auszuwÀhlen Anbieter: Active Directory Die erforderlichen Einstellungen werden automatisch in das Formular eingesetzt.
Klicken Sie auf Speichern
Jetzt gehen wir weiter:
Benutzerföderation â> freeipa.example.org â> Mapper â> Vorname
Option
Wert
Ldap Attribut
givenName
Jetzt aktivieren wir das Gruppemapping:
Benutzerföderation â> freeipa.example.org â> Mapper â> Erstellen
Option
Wert
Name
Gruppen
Mapper-Typ
group-ldap-mapper
LDAP Gruppen-DN
cn=groups,cn=accounts,dc=example,dc=org
Benutzergruppen Abrufstrategie
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Damit ist die Konfiguration der Föderation abgeschlossen, wir gehen zur Konfiguration des Clients ĂŒber.
Client-Konfiguration
Wir erstellen einen neuen Client (eine Anwendung, die Benutzer aus Keycloak empfÀngt). Weiter:
Clients â> Erstellen
Option
Wert
Client-ID
Kubernetes
Zugriffsart
vertraulich
Stamm-URL
http://kubernetes.example.org/
GĂŒltige Weiterleitungs-URIs
http://kubernetes.example.org/*
Admin-URL
http://kubernetes.example.org/
Wir erstellen auch einen Scope fĂŒr Gruppen:
Client-Scopes â> Erstellen
Option
Wert
Vorlage
Kein Template
Name
Gruppen
VollstÀndiger Gruppenpfad
false
Und wir konfigurieren den Mapper dafĂŒr:
Client-Scopes â> Gruppen â> Mapper â> Erstellen
Option
Wert
Name
Gruppen
Mapper-Typ
Gruppenmitgliedschaft
Token Anspruchsname
Gruppen
Jetzt mĂŒssen wir das Gruppemapping in unserem Client-Scope aktivieren:
Clients â> Kubernetes â> Client-Scopes â> Standard-Client-Scopes
WĂ€hlen Sie Gruppen in VerfĂŒgbare Client-Scopes, klicken Sie auf AusgewĂ€hlte hinzufĂŒgen
Jetzt konfigurieren wir die Authentifizierung unserer Anwendung, weiter:
Clients â> Kubernetes
Option
Wert
Autorisierung aktiviert
AN
Klicken Sie auf speichern und damit ist die Client-Konfiguration abgeschlossen, jetzt können Sie im Tab
Clients â> Kubernetes â> Anmeldeinformationen
erhalten Geheimnis das wir spÀter verwenden werden.
Kubernetes-Konfiguration
Die Konfiguration von Kubernetes fĂŒr OIDC-Authentifizierung ist ziemlich trivial und nicht sehr kompliziert. Alles, was Sie brauchen, ist, das CA-Zertifikat Ihres OIDC-Servers in /etc/kubernetes/pki/oidc-ca.pem einzufĂŒgen und die erforderlichen Optionen fĂŒr kube-apiserver hinzuzufĂŒgen.
Dazu aktualisieren Sie /etc/kubernetes/manifests/kube-apiserver.yaml auf all Ihren Master-Knoten:
...
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
...Und aktualisieren Sie auch die kubeadm-Konfiguration im Cluster, um diese Einstellungen bei einem Update nicht zu verlieren:
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
...Damit ist die Kubernetes-Konfiguration abgeschlossen. Sie können die gleichen Schritte in all Ihren Kubernetes-Clustern wiederholen.
Erste Autorisierung
Nach diesen Schritten haben Sie bereits einen Kubernetes-Cluster mit konfigurierte OIDC-Authentifizierung. Der einzige Punkt ist, dass Ihre Benutzer noch keinen Client und kein eigenes kubeconfig haben. Um dieses Problem zu lösen, sollte die automatische Ausgabe von kubeconfig an die Benutzer nach erfolgreicher Authentifizierung konfiguriert werden.
Dazu können spezielle Webanwendungen verwendet werden, die die Authentifizierung des Benutzers ermöglichen und dann das fertige kubeconfig herunterladen. Eine der praktischsten ist , er ermöglicht es, alle Kubernetes-Cluster in einer Konfiguration zu beschreiben und leicht zwischen ihnen zu wechseln.
Um Kuberos einzurichten, reicht es aus, eine Vorlage fĂŒr die kubeconfig zu beschreiben und mit den folgenden Parametern zu starten:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/templateFĂŒr detailliertere Informationen siehe auf Github.
Es ist auch möglich, , wenn Sie die Authentifizierung direkt auf dem Computer des Benutzers durchfĂŒhren möchten. In diesem Fall öffnet sich fĂŒr den Benutzer ein Browser mit einem Authentifizierungsformular auf localhost.
Die erhaltene kubeconfig kann auf der Website ĂŒberprĂŒft werden . Kopieren Sie einfach den Wert users[].user.auth-provider.config.id-token aus Ihrer kubeconfig in das Formular auf der Website und erhalten Sie sofort die Dekodierung.
RBAC-Konfiguration
Bei der Einrichtung von RBAC kann sowohl auf den Benutzernamen (Feld name im jwt-Token), als auch auf die Benutzergruppe (Feld Gruppen im jwt-Token) verwiesen werden. Hier ist ein Beispiel fĂŒr die Berechtigungseinstellungen fĂŒr die 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-adminsMehr Beispiele fĂŒr RBAC finden Sie in der
Einrichtung des auth-proxy
Es gibt ein groĂartiges Projekt , das es ermöglicht, jede Anwendung zu sichern, indem der Benutzer die Möglichkeit hat, sich beim OIDC-Server zu authentifizieren. Ich werde zeigen, wie man es mit dem Kubernetes-Dashboard einrichtet:
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: ClusterIPQuelle: habr.com
