We koppelen ActiveDirectory-autorisatie aan Kubernetes met behulp van Keycloak

Dit artikel is geschreven om het al uit te breiden bestaande, maar vertelt over de kenmerken van de bundel met Microsoft ActiveDirectory, en vult deze ook aan.

In dit artikel zal ik je vertellen hoe je installeert en configureert:

  • Sleutelmantel is een open source-project. Dat biedt een enkel toegangspunt voor applicaties. Werkt met veel protocollen, waaronder LDAP en OpenID waarin we geïnteresseerd zijn.
  • sleutelmantel poortwachter - reverse proxy-applicatie waarmee u autorisatie via Keycloak kunt integreren.
  • Loopplank - een applicatie die een configuratie genereert voor kubectl waarmee u kunt inloggen en verbinding kunt maken met de Kubernetes API via OpenID.

Hoe machtigingen werken in Kubernetes.

We kunnen gebruikers-/groepsrechten beheren met behulp van RBAC, hierover zijn al een aantal artikelen gemaakt, ik zal hier niet in detail op ingaan. Het probleem is dat je RBAC kunt gebruiken om gebruikersrechten te beperken, maar Kubernetes weet niets van gebruikers. Het blijkt dat we een gebruikersleveringsmechanisme nodig hebben in Kubernetes. Om dit te doen, zullen we een provider toevoegen aan Kuberntes OpenID, die zal zeggen dat zo'n gebruiker echt bestaat, en Kubernetes zelf zal hem de rechten geven.

Opleiding

  • U hebt een Kubernetes-cluster of minikube nodig
  • Active Directory
  • Domeinen:
    sleutelmantel.voorbeeld.org
    kubernetes-dashboard.example.org
    loopbrug.voorbeeld.org
  • Certificaat voor domeinen of zelfondertekend certificaat

Ik zal niet uitweiden over het maken van een zelfondertekend certificaat, u moet 2 certificaten maken, dit is de root- (Certificate Authority) en wildcard-client voor het *.example.org-domein

Nadat je certificaten hebt ontvangen/uitgegeven moet de client worden toegevoegd aan Kubernetes, hiervoor maken we een secret voor aan:

kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem

Vervolgens zullen we het gebruiken voor onze Ingress-controller.

Keycloak-installatie

Ik besloot dat de makkelijkste manier is om hiervoor kant-en-klare oplossingen te gebruiken, namelijk roerkaarten.

Installeer de repository en werk deze bij:

helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update

Maak een keycloak.yml-bestand met de volgende inhoud:

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

Federatie instellen

Ga vervolgens naar de webinterface sleutelmantel.voorbeeld.org

Klik in de linkerhoek Rijk toevoegen

sleutel
Waarde

Naam
kubernetes

Weergavenaam
Kubernetes

E-mailverificatie van gebruiker uitschakelen:
Clientbereiken —> E-mail —> Mappers —> E-mail geverifieerd (Verwijderen)

We hebben een federatie opgezet om gebruikers uit ActiveDirectory te importeren, ik zal hieronder screenshots achterlaten, ik denk dat het duidelijker zal zijn.

Gebruikersfederatie —> Provider toevoegen... —> ldap

Federatie instellenWe koppelen ActiveDirectory-autorisatie aan Kubernetes met behulp van Keycloak
We koppelen ActiveDirectory-autorisatie aan Kubernetes met behulp van Keycloak

Als het goed is, dan na het indrukken van de knop Synchroniseer alle gebruikers u ziet een bericht over de succesvolle import van gebruikers.

Vervolgens moeten we onze groepen in kaart brengen

Gebruikersfederatie --> ldap_localhost --> Mappers --> Maken

Een kaartenmaker makenWe koppelen ActiveDirectory-autorisatie aan Kubernetes met behulp van Keycloak

Cliënt instellen

Het is noodzakelijk om een ​​klant aan te maken, in termen van Keycloak, dit is een applicatie die door hem wordt geautoriseerd. Ik zal de belangrijke punten in de schermafbeelding in rood markeren.

Klanten -> Maken

Cliënt instellenWe koppelen ActiveDirectory-autorisatie aan Kubernetes met behulp van Keycloak

Laten we een scoupe voor groepen maken:

Klantbereiken -> Maken

Bereik creërenWe koppelen ActiveDirectory-autorisatie aan Kubernetes met behulp van Keycloak

En stel een mapper voor ze in:

Clientbereiken —> groepen —> Mappers —> Maken

MapperWe koppelen ActiveDirectory-autorisatie aan Kubernetes met behulp van Keycloak

Voeg de toewijzing van onze groepen toe aan de standaard klantbereiken:

Clients -> kubernetes -> Clientbereiken -> Standaard clientbereiken
kiezen groepen в Beschikbare klantbereiken, druk op Voeg geselecteerde toe

We krijgen het geheim (en schrijven het naar de thread) dat we zullen gebruiken voor autorisatie in Keycloak:

Clients —> kubernetes —> Inloggegevens —> Geheim
Hiermee is de installatie voltooid, maar ik kreeg een foutmelding toen ik na succesvolle autorisatie een fout 403 ontving. Bug report.

Repareren:

Clientbereiken —> rollen —> Mappers —> Maken

MapperWe koppelen ActiveDirectory-autorisatie aan Kubernetes met behulp van Keycloak

Scriptcode

// add current client-id to token audience
token.addAudience(token.getIssuedFor());

// return token issuer as dummy result assigned to iss again
token.getIssuer();

Kubernetes configureren

We moeten specificeren waar ons rootcertificaat van de site ligt en waar de OIDC-provider zich bevindt.
Bewerk hiervoor het bestand /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
...

Update kubeadm-configuratie in het cluster:

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

auth-proxy instellen

U kunt keycloak-gatekeeper gebruiken om uw webtoepassing te beschermen. Naast het feit dat deze reverse proxy de gebruiker autoriseert voordat de pagina wordt weergegeven, geeft het ook informatie over u door aan de eindtoepassing in de headers. Dus als uw applicatie OpenID ondersteunt, is de gebruiker direct geautoriseerd. Neem het voorbeeld van Kubernetes Dashboard

Kubernetes-dashboard installeren


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

waarden_dashboard.yaml

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

Toegangsrechten instellen:

Laten we een ClusterRoleBinding maken die clusterbeheerdersrechten geeft (standaard ClusterRole clusterbeheerder) voor gebruikers in de DataOPS-groep.


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 installeren:


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

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

Daarna, wanneer u probeert te gaan naar kubernetes-dashboard.example.org, worden we doorgestuurd naar Keycloak en in het geval van succesvolle autorisatie komen we terecht op het Dashboard dat al is ingelogd.

loopplank installatie

Voor het gemak kunt u een gangway toevoegen die een configuratiebestand voor kubectl genereert, met behulp waarvan we onder onze gebruiker in Kubernetes komen.


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

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

Het lijkt hierop. Hiermee kunt u het configuratiebestand onmiddellijk downloaden en genereren met behulp van een reeks opdrachten:

We koppelen ActiveDirectory-autorisatie aan Kubernetes met behulp van Keycloak

Bron: www.habr.com

Voeg een reactie