Dieser Artikel wurde geschrieben, um das bereits Bestehende zu erweitern
In diesem Artikel erkläre ich Ihnen, wie Sie Folgendes installieren und konfigurieren:
- Schlüsselumhang ist ein Open-Source-Projekt. Dies bietet einen zentralen Einstiegspunkt für Anwendungen. Funktioniert mit vielen Protokollen, einschließlich LDAP und OpenID, an denen wir interessiert sind.
- Schlüsselmantel-Pförtner - Reverse-Proxy-Anwendung, mit der Sie die Autorisierung über Keycloak integrieren können.
- Gangway – eine Anwendung, die eine Konfiguration für kubectl generiert, mit der Sie sich anmelden und über OpenID eine Verbindung zur Kubernetes-API herstellen können.
So funktionieren Berechtigungen in Kubernetes.
Wir können Benutzer-/Gruppenrechte mithilfe von RBAC verwalten. Es wurden bereits eine Reihe von Artikeln dazu erstellt. Ich werde hier nicht näher darauf eingehen. Das Problem besteht darin, dass Sie mit RBAC Benutzerrechte einschränken können, Kubernetes jedoch nichts über Benutzer weiß. Es stellt sich heraus, dass wir in Kubernetes einen Benutzerbereitstellungsmechanismus benötigen. Dazu fügen wir Kuberntes OpenID einen Anbieter hinzu, der besagt, dass ein solcher Benutzer tatsächlich existiert, und Kubernetes selbst wird ihm die Rechte geben.
Training
- Sie benötigen einen Kubernetes-Cluster oder Minikube
- Active Directory
- Domänen:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Zertifikat für Domänen oder selbstsigniertes Zertifikat
Ich werde nicht weiter darauf eingehen, wie man ein selbstsigniertes Zertifikat erstellt. Sie müssen zwei Zertifikate erstellen. Dies ist das Stammzertifikat (Zertifizierungsstelle) und der Wildcard-Client für die Domäne *.example.org
Nachdem Sie Zertifikate erhalten/ausgestellt haben, muss der Client zu Kubernetes hinzugefügt werden. Dazu erstellen wir ein Geheimnis dafür:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Als nächstes werden wir es für unseren Ingress-Controller verwenden.
Keycloak-Installation
Ich habe beschlossen, dass es am einfachsten ist, hierfür vorgefertigte Lösungen zu verwenden, nämlich Ruderkarten.
Installieren Sie das Repository und aktualisieren Sie es:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Erstellen Sie eine keycloak.yml-Datei mit folgendem Inhalt:
keycloak.yml
keycloak:
# Имя администратора
username: "test_admin"
# Пароль администратор
password: "admin"
# Эти флаги нужны что бы позволить загружать в Keycloak скрипты прямо через web морду. Это нам
понадобиться что бы починить один баг, о котором ниже.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Включаем ingress, указываем имя хоста и сертификат который мы предварительно сохранили в secrets
ingress:
enabled: true
path: /
annotations:
kubernetes.io/ingress.class: nginx
ingress.kubernetes.io/affinity: cookie
hosts:
- keycloak.example.org
tls:
- hosts:
- keycloak.example.org
secretName: tls-keycloak
# Keycloak для своей работы требует базу данных, в тестовых целях я разворачиваю Postgresql прямо в Kuberntes, в продакшене так лучше не делать!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: true
Föderations-Setup
Gehen Sie als Nächstes zur Weboberfläche
Klicken Sie in die linke Ecke Bereich hinzufügen
Wesentliche
Wert
Name und Vorname
Kubernetes
Display Name
Kubernetes
Deaktivieren Sie die E-Mail-Bestätigung des Benutzers:
Client-Bereiche –> E-Mail –> Mapper –> E-Mail bestätigt (Löschen)
Wir haben einen Verbund eingerichtet, um Benutzer aus ActiveDirectory zu importieren. Ich werde unten Screenshots hinterlassen, ich denke, es wird klarer sein.
Benutzerverbund —> Anbieter hinzufügen… —> ldap
Föderations-Setup
Wenn alles in Ordnung ist, dann nach dem Drücken der Taste Synchronisieren Sie alle Benutzer Sie sehen eine Meldung über den erfolgreichen Import der Benutzer.
Als nächstes müssen wir unsere Gruppen zuordnen
Benutzerföderation -> ldap_localhost -> Mapper -> Erstellen
Einen Mapper erstellen
Client-Setup
Es ist notwendig, einen Client zu erstellen, im Sinne von Keycloak ist dies eine Anwendung, die von ihm autorisiert wird. Die wichtigen Punkte werde ich im Screenshot rot hervorheben.
Kunden —> Erstellen
Client-Setup
Lassen Sie uns eine Übersicht für Gruppen erstellen:
Client-Bereiche —> Erstellen
Spielraum schaffen
Und richten Sie einen Mapper für sie ein:
Client-Bereiche –> Gruppen –> Mapper –> Erstellen
Mapper
Fügen Sie die Zuordnung unserer Gruppen zu den Standard-Client-Bereichen hinzu:
Clients –> Kubernetes –> Client-Bereiche –> Standard-Client-Bereiche
wählen Gruppen в Verfügbare Client-Bereiche, Drücken Sie Auswahl hinzufügen
Wir erhalten das Geheimnis (und schreiben es in den Thread), das wir zur Autorisierung in Keycloak verwenden werden:
Clients –> Kubernetes –> Anmeldeinformationen –> Geheimnis
Damit ist die Einrichtung abgeschlossen, aber ich hatte einen Fehler, als ich nach erfolgreicher Autorisierung den Fehler 403 erhielt.
Fix:
Client-Bereiche –> Rollen –> Mapper –> Erstellen
Mapper
Skriptcode
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Kubernetes konfigurieren
Wir müssen angeben, wo sich unser Stammzertifikat der Site befindet und wo sich der OIDC-Anbieter befindet.
Bearbeiten Sie dazu die Datei /etc/kubernetes/manifests/kube-apiserver.yaml
kube-apiserver.yaml
...
spec:
containers:
- command:
- kube-apiserver
...
- --oidc-ca-file=/var/lib/minikube/certs/My_Root.crt
- --oidc-client-id=kubernetes
- --oidc-groups-claim=groups
- --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
- --oidc-username-claim=email
...
Kubeadm-Konfiguration im Cluster aktualisieren:
kubeadmconfig
kubectl edit -n kube-system configmaps kubeadm-config
...
data:
ClusterConfiguration: |
apiServer:
extraArgs:
oidc-ca-file: /var/lib/minikube/certs/My_Root.crt
oidc-client-id: kubernetes
oidc-groups-claim: groups
oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
oidc-username-claim: email
...
Authentifizierungs-Proxy festlegen
Sie können Keycloak Gatekeeper verwenden, um Ihre Webanwendung zu schützen. Zusätzlich zur Tatsache, dass dieser Reverse-Proxy den Benutzer autorisiert, bevor die Seite angezeigt wird, übermittelt er in den Headern auch Informationen über Sie an die Endanwendung. Wenn Ihre Anwendung also OpenID unterstützt, wird der Benutzer sofort autorisiert. Betrachten Sie das Beispiel des Kubernetes-Dashboards
Kubernetes-Dashboard installieren
helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml
Werte_dashboard.yaml
enableInsecureLogin: true
service:
externalPort: 80
rbac:
clusterAdminRole: true
create: true
serviceAccount:
create: true
name: 'dashboard-test'
Zugriffsrechte festlegen:
Erstellen wir eine ClusterRoleBinding, die Benutzern in der DataOPS-Gruppe Cluster-Administratorrechte (Standard-ClusterRole-Cluster-Administrator) gewährt.
kubectl apply -f rbac.yaml
rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dataops_group
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: DataOPS
Keycloak Gatekeeper installieren:
helm repo add gabibbo97 https://gabibbo97.github.io/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml
Werte_proxy.yaml
# Включаем ingress
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
path: /
hosts:
- kubernetes-dashboard.example.org
tls:
- secretName: tls-keycloak
hosts:
- kubernetes-dashboard.example.org
# Говорим где мы будем авторизовываться у OIDC провайдера
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
# Имя клиента которого мы создали в Keycloak
ClientID: "kubernetes"
# Secret который я просил записать
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Куда перенаправить в случае успешной авторизации. Формат <SCHEMA>://<SERVICE_NAME>.><NAMESAPCE>.<CLUSTER_NAME>
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
# Пропускаем проверку сертификата, если у нас самоподписанный
skipOpenidProviderTlsVerify: true
# Настройка прав доступа, пускаем на все path если мы в группе DataOPS
rules:
- "uri=/*|groups=DataOPS"
Danach, wenn Sie versuchen zu gehen
Gangway-Installation
Der Einfachheit halber können Sie eine Gangway hinzufügen, die eine Konfigurationsdatei für kubectl generiert, mit deren Hilfe wir unter unserem Benutzer in Kubernetes gelangen.
helm install --name gangway stable/gangway -f values_gangway.yaml
Werte_gangway.yaml
gangway:
# Произвольное имя кластера
clusterName: "my-k8s"
# Где у нас OIDC провайдер
authorizeURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/auth"
tokenURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/token"
audience: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/userinfo"
# Теоритически сюда можно добавить groups которые мы замапили
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Имя клиента
clientID: "kubernetes"
# Секрет
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Если оставить дефолтное значние, то за имя пользователя будет братья <b>Frist name</b> <b>Second name</b>, а при "sub" его логин
usernameClaim: "sub"
# Доменное имя или IP адресс API сервера
apiServerURL: "https://192.168.99.111:8443"
# Включаем Ingress
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
path: /
hosts:
- gangway.example.org
tls:
- secretName: tls-keycloak
hosts:
- gangway.example.org
# Если используем самоподписанный сертификат, то его(открытый корневой сертификат) надо указать.
trustedCACert: |-
-----BEGIN CERTIFICATE-----
MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzAwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
-----END CERTIFICATE-----
Sieht aus wie das. Ermöglicht Ihnen, die Konfigurationsdatei sofort herunterzuladen und mit einer Reihe von Befehlen zu generieren:
Source: habr.com