Wir befestigen die ActiveDirectory-Autorisierung mithilfe von Keycloak an Kubernetes

Dieser Artikel wurde geschrieben, um das bereits Bestehende zu erweitern bestehende, spricht aber über die Funktionen des Bundles mit Microsoft ActiveDirectory und ergänzt es auch.

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 keycloak.example.org

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-SetupWir befestigen die ActiveDirectory-Autorisierung mithilfe von Keycloak an Kubernetes
Wir befestigen die ActiveDirectory-Autorisierung mithilfe von Keycloak an Kubernetes

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 erstellenWir befestigen die ActiveDirectory-Autorisierung mithilfe von Keycloak an Kubernetes

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-SetupWir befestigen die ActiveDirectory-Autorisierung mithilfe von Keycloak an Kubernetes

Lassen Sie uns eine Übersicht für Gruppen erstellen:

Client-Bereiche —> Erstellen

Spielraum schaffenWir befestigen die ActiveDirectory-Autorisierung mithilfe von Keycloak an Kubernetes

Und richten Sie einen Mapper für sie ein:

Client-Bereiche –> Gruppen –> Mapper –> Erstellen

MapperWir befestigen die ActiveDirectory-Autorisierung mithilfe von Keycloak an Kubernetes

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. Fehlerbericht.

Fix:

Client-Bereiche –> Rollen –> Mapper –> Erstellen

MapperWir befestigen die ActiveDirectory-Autorisierung mithilfe von Keycloak an Kubernetes

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 kubernetes-dashboard.example.org, werden wir zu Keycloak weitergeleitet und gelangen bei erfolgreicher Autorisierung zum Dashboard, bei dem wir bereits eingeloggt sind.

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:

Wir befestigen die ActiveDirectory-Autorisierung mithilfe von Keycloak an Kubernetes

Source: habr.com

Kommentar hinzufügen