Wir verbinden die ActiveDirectory-Autorisierung mit Keycloak mit Kubernetes

Dieser Artikel wurde geschrieben, um ein vorhandenes zu erweitern , behandelt jedoch die Funktionen des Bundles mit Microsoft ActiveDirectory und ergänzt es.

In diesem Artikel werde ich Ihnen erklären, wie Sie installieren und konfigurieren:

  • Keycloak ist ein Open Source Projekt. Dies bietet einen einzigen Einstiegspunkt für Anwendungen. Es funktioniert mit vielen Protokollen, einschließlich LDAP und OpenID, die uns interessieren.
  • Keycloak Gatekeeper - Reverse-Proxy-Anwendung, mit der Sie die Autorisierung über Keycloak integrieren können.
  • Gangway - die Anwendung, die eine Konfiguration für kubectl generiert, mit der Sie sich anmelden und über OpenID eine Verbindung zur Kubernetes-API herstellen können

Wie Rechte in Kubernetes funktionieren.


Wir können Benutzer- / Gruppenrechte mit RBAC verwalten. Es wurden bereits viele Artikel darüber erstellt. Darauf werde ich nicht näher eingehen. Das Problem ist, dass Sie RBAC verwenden können, um Benutzerrechte einzuschränken, aber Kubernetes weiß nichts über Benutzer. Es stellt sich heraus, dass Sie in Kubernetes einen Benutzerbereitstellungsmechanismus benötigen. Zu diesem Zweck fügen wir Kuberntes einen OpenID-Anbieter hinzu, der besagt, dass ein solcher Benutzer tatsächlich existiert, und Kubernetes selbst wird ihm Rechte einräumen.

Ausbildung

  • Sie benötigen einen Kubernetes-Cluster oder eine Minikube
  • Active Directory
  • Domänen:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Zertifikat für Domains oder selbstsigniertes Zertifikat

Ich werde nicht näher darauf eingehen, wie ein selbstsigniertes Zertifikat erstellt wird. Sie müssen zwei Zertifikate erstellen. Dies ist der Stamm- (Zertifizierungsstelle) und Platzhalter-Client für die Domain * .example.org.

Nachdem Sie die Zertifikate erhalten / geschrieben haben, muss der Client dazu zu Kubernetes hinzugefügt werden ein Geheimnis dafür schaffen:

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

Installieren Sie Keycloak


Ich entschied, dass der einfachste Weg, vorgefertigte Lösungen dafür zu verwenden, nämlich Steuerkarten.

Installieren Sie das Repository und aktualisieren Sie es:

helm repo add codecentric https://codecentric.imtqy.com/helm-charts
helm repo update

Erstellen Sie die Datei keycloak.yml mit den folgenden Inhalten:

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


Wechseln Sie als Nächstes zur Weboberfläche keycloak.example.org. Klicken Sie

in der linken Ecke auf Realm hinzufügen
SchlüsselWert
Namekubernetes
AnzeigenameKubernetes

Deaktivieren Sie die Überprüfung der Benutzer-E-Mail-Bestätigung:
Client-Bereiche -> E-Mail -> Mapper -> E-Mail überprüft (Löschen) Wir

konfigurieren den Verbund für den Import von Benutzern aus ActiveDirectory. Ich werde unten Screenshots hinterlassen. Ich denke, es wird klarer.

Benutzerverband -> Anbieter hinzufügen ... -> ldap

Föderations-Setup



Wenn alles in Ordnung ist, erhalten Sie nach dem Klicken auf die Schaltfläche Alle Benutzer synchronisieren eine Nachricht über den erfolgreichen Import von Benutzern.

Als nächstes müssen wir unsere Gruppen

Benutzerverbund -> ldap_localhost -> Mapper -> Erstellen zuordnen

Mapper-Erstellung


Client-Setup


Es ist notwendig, einen Kunden zu erstellen, in Bezug auf Keycloak ist eine Anwendung, die von ihm autorisiert wird. Ich werde die wichtigen Punkte im Screenshot rot hervorheben.

Kunden -> Erstellen

Client-Setup


Erstellen Sie eine Gruppe für Gruppen:

Client-Bereiche -> Erstellen

Scoupe machen


Und konfigurieren Sie den Mapper für sie:

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

Mapper


Fügen Sie die Zuordnung unserer Gruppen zu Standardclientbereichen hinzu:

Clients -> kubernetes -> Clientbereiche -> Standardclientbereiche
Wählen Sie Gruppen in Verfügbare Clientbereiche aus , klicken Sie auf Ausgewählte hinzufügen.

Wir erhalten ein Geheimnis (und schreiben es in den Thread), das wir für die Autorisierung verwenden in Keycloak:

Clients -> kubernetes -> Credentials -> Secret
Dies ist das Ende des Setups, aber ich habe einen Fehler erhalten, als ich nach einer erfolgreichen Autorisierung einen Fehler 403 erhalten habe . Fehlerbericht .

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();


Konfigurieren Sie Kubernetes


Wir müssen angeben, wo sich unser Stammzertifikat von 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
...


Aktualisieren Sie die kubeadm-Konfiguration im Cluster:

kubeadm config
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
...


Konfigurieren Sie den Auth-Proxy


Sie können Keycloak Gatekeeper verwenden, um Ihre Webanwendung zu schützen. Zusätzlich zu der Tatsache, dass dieser Reverse-Proxy den Benutzer vor dem Anzeigen der Seite autorisiert, überträgt er auch Informationen über Sie in den Kopfzeilen an die endgültige Anwendung. Wenn Ihre Anwendung OpenID unterstützt, meldet sich der Benutzer sofort an. Schauen wir uns das Beispiel des Kubernetes Dashboard an

Installieren Sie das Kubernetes Dashboard



helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

values_dashboard.yaml
enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'


Festlegen von Berechtigungen:


Erstellen Sie 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


Installieren Sie den Keycloak Gatekeeper:



helm repo add gabibbo97 https://gabibbo97.imtqy.com/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml

values_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"


Wenn Sie danach versuchen, zu kubernetes-dashboard.example.org zu wechseln , werden Sie zu Keycloak weitergeleitet. Wenn die Autorisierung erfolgreich ist, sind wir bereits bei Dashboard angemeldet.

Gangway-Installation


Der Einfachheit halber können Sie eine Gangway hinzufügen, die eine Konfigurationsdatei für kubectl generiert, mit der wir bereits unter unserem Benutzer in Kubernetes gelangen.


helm install --name gangway stable/gangway -f values_gangway.yaml

values_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-----


Es sieht ungefähr so ​​aus. Ermöglicht das sofortige Herunterladen der Konfigurationsdatei und deren Erstellung mit einer Reihe von Befehlen:


All Articles