
Eine kurze Anleitung, wie Sie Keycloak nutzen können, um Kubernetes mit Ihrem LDAP-Server zu verbinden und den Import von Benutzern und Gruppen einzurichten. Dies ermöglicht Ihnen, RBAC fĂŒr Ihre Benutzer zu konfigurieren und einen Auth-Proxydienst zu nutzen, um das Kubernetes-Dashboard und andere Anwendungen, die keine eigene Autorisierung unterstĂŒtzen, abzusichern.
Installation von Keycloak
Angenommen, Sie haben bereits einen LDAP-Server. Dies kann ein 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) verwenden; 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 ist es einfacher, es separat zu installieren, wenn Sie mehrere Kubernetes-Cluster haben. Auf der anderen Seite können Sie immer verwenden und es direkt in Ihrem Cluster installieren.
Zur Speicherung der Daten von Keycloak benötigen Sie eine Datenbank. StandardmĂ€Ăig wird h2 (alle Daten werden lokal gespeichert) verwendet, Sie können jedoch auch postgres, mysql oder mariadb.
Wenn Sie dennoch Keycloak separat installieren möchten, finden Sie detaillierte Anleitungen in .
Federationseinrichtung
ZunĂ€chst erstellen wir ein neues Realm. Ein Realm ist der Raum unserer Anwendung. Jede Anwendung kann ihr eigenes Realm mit unterschiedlichen Benutzern und Authentifizierungseinstellungen haben. Das Master-Realm wird von Keycloak selbst verwendet, und es wĂ€re falsch, es fĂŒr etwas anderes zu nutzen.
Klicken Sie auf Realm hinzufĂŒgen
Option
Value
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 Option in Kubernetes deaktivieren:
Client-Bereiche â> E-Mail â> Mapper â> E-Mail verifiziert (Löschen)
Jetzt konfigurieren wir die Föderation, dafĂŒr gehen wir zu:
Benutzerföderation â> Anbieter hinzufĂŒgen⊠â> ldap
Ich gebe ein Beispiel fĂŒr die Konfiguration von FreeIPA:
Option
Value
Konsole Anzeigename
freeipa.example.org
Anbieter
Red Hat Verzeichnisdienst
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 Credential
<password>
Kerberos-Authentifizierung erlauben:
on
Kerberos-Realm:
EXAMPLE.ORG
Server Principal:
HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:
/etc/krb5.keytab
Benutzer keycloak-svc muss im Voraus auf unserem LDAP-Server erstellt werden.
Im Fall von Active Directory reicht es aus, einfach auszuwĂ€hlen Anbieter: Active Directory und die erforderlichen Einstellungen werden automatisch in das Formular eingefĂŒgt.
Klicken Sie auf ), und klicken dann auf die SchaltflÀche
Gehen wir nun weiter:
Benutzerföderation â> freeipa.example.org â> Mapper â> Vorname
Option
Value
Ldap-Attribut
givenName
Aktivieren wir nun das Gruppenmapping:
Benutzerföderation â> freeipa.example.org â> Mapper â> Erstellen
Option
Value
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 Federation-Konfiguration beendet, wir gehen zur Kundeneinrichtung ĂŒber.
Client-Konfiguration
Wir erstellen einen neuen Client (eine Anwendung, die Benutzer aus Keycloak abruft). Gehen wir weiter:
Clients â> Erstellen
Option
Value
Client-Geheimnis
kubernetes
Zugriffstyp
confidenzial
Root-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-Scope â> Erstellen
Option
Value
Vorlage
Kein Template
Name
Gruppen
Voller Gruppenspeicherpfad
false
Und wir konfigurieren den Mapper fĂŒr sie:
Client-Scope â> Gruppen â> Mapper â> Erstellen
Option
Value
Name
Gruppen
Mapper-Typ
Gruppenmitgliedschaft
Token-Anspruchsname
Gruppen
Jetzt mĂŒssen wir das Gruppenmapping in unserem Client-Scope aktivieren:
Clients â> kubernetes â> Client-Scope â> Standard-Client-Scope
WĂ€hlen Sie Gruppen in VerfĂŒgbare Client Scopes, drĂŒcken Sie AusgewĂ€hlte hinzufĂŒgen
Jetzt richten wir die Authentifizierung unserer Anwendung ein, weiter geht's:
Clients â> kubernetes
Option
Value
Autorisierung aktiviert
EIN
DrĂŒcken wir auf speichern und damit ist die Konfiguration des Clients abgeschlossen, nun auf dem Tab
Clients â> kubernetes â> Credentials
wird es möglich sein, Secret den wir spÀter verwenden werden.
Kubernetes-Konfiguration
Die Einrichtung von Kubernetes fĂŒr OIDC-Authentifizierung ist recht trivial und nicht besonders komplex. Alles, was Sie benötigen, ist das CA-Zertifikat Ihres OIDC-Servers in /etc/kubernetes/pki/oidc-ca.pem zu hinterlegen und die notwendigen Optionen fĂŒr kube-apiserver hinzuzufĂŒgen.
Aktualisieren Sie daher /etc/kubernetes/manifests/kube-apiserver.yaml auf all Ihren Master-Servern:
...
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
...Aktualisieren Sie auch die kubeadm-Konfiguration im Cluster, um diese Einstellungen bei einem Upgrade 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 Konfiguration von Kubernetes abgeschlossen. Sie können diese Schritte in all Ihren Kubernetes-Clustern wiederholen.
Ersteinrichtung der Autorisierung
Nach diesen Schritten haben Sie bereits einen Kubernetes-Cluster mit aktivierter OIDC-Autorisierung. Ein wichtiger Punkt ist, dass Ihre Benutzer derzeit keinen konfigurierten Client oder eigenen kubeconfig haben. Um dieses Problem zu lösen, mĂŒssen Sie die automatische Bereitstellung von kubeconfig fĂŒr Benutzer nach erfolgreicher Autorisierung einrichten.
HierfĂŒr können spezielle Webanwendungen verwendet werden, die die Authentifizierung des Benutzers ermöglichen und dann das fertige kubeconfig zum Download bereitstellen. Eine der bequemsten Optionen ist , er ermöglicht es, alle Kubernetes-Cluster in einer Konfiguration zu beschreiben und leicht zwischen ihnen zu wechseln.
FĂŒr die Konfiguration von Kuberos mĂŒssen Sie lediglich eine Vorlage fĂŒr kubeconfig beschreiben und mit den folgenden Parametern 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, zu verwenden, wenn Sie die Authentifizierung direkt auf dem Benutzercomputer durchfĂŒhren möchten. In diesem Fall wird dem Benutzer ein Browser mit dem Authentifizierungsformular auf localhost geöffnet.
Der erhaltene kubeconfig kann auf der Website ĂŒberprĂŒft werden . Kopieren Sie einfach den Wert users[].user.auth-provider.config.id-token aus Ihrem kubeconfig in das Formular auf der Website und Sie erhalten sofort die EntschlĂŒsselung.
RBAC-Konfiguration
Bei der Konfiguration 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 ein Beispiel fĂŒr die Rechtevergabe an 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-adminsWeitere Beispiele fĂŒr RBAC finden Sie unter
Einrichtung des Auth-Proxys
Es gibt ein groĂartiges Projekt , das es ermöglicht, jede Anwendung zu sichern, indem es dem Benutzer die Authentifizierung ĂŒber einen OIDC-Server ermöglicht. Ich zeige Ihnen, wie Sie es am Beispiel des Kubernetes Dashboards einrichten können:
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
