Mir befestigen ActiveDirectory Autorisatioun op Kubernetes mat Keycloak

Dësen Artikel gouf geschriwwen op der schonn expandéieren bestehend, awer schwätzt iwwer d'Features vum Bündel mat Microsoft ActiveDirectory, an ergänzt et och.

An dësem Artikel wäert ech Iech soen wéi Dir installéiert a konfiguréiert:

  • keycloak ass en Open Source Projet. Wat en eenzegen Entrée fir Uwendungen ubitt. Schafft mat ville Protokoller, dorënner LDAP an OpenID déi mir interesséiert sinn.
  • keycloak Gatekeeper - ëmgedréint Proxy Applikatioun déi Iech erlaabt Autorisatioun duerch Keycloak z'integréieren.
  • gangway - eng Applikatioun déi eng Konfiguratioun fir kubectl generéiert, mat där Dir Iech aloggen an mat der Kubernetes API iwwer OpenID verbannen kënnt.

Wéi d'Permissiounen an Kubernetes funktionnéieren.

Mir kënnen d'Benotzer / Grupperechter mat RBAC verwalten, eng ganz Rëtsch Artikele si schonn iwwer dëst erstallt ginn, ech wäert net am Detail op dëst ophalen. De Problem ass datt Dir RBAC benotze kënnt fir Benotzerrechter ze beschränken, awer Kubernetes weess näischt iwwer Benotzer. Et stellt sech eraus datt mir e Benotzer Liwwerung Mechanismus an Kubernetes brauchen. Fir dëst ze maachen, addéiere mer e Provider op Kuberntes OpenID, dee seet datt esou e Benotzer wierklech existéiert, a Kubernetes selwer gëtt him d'Rechter.

Virbereedung

  • Dir braucht e Kubernetes Cluster oder Minikube
  • Active Directory
  • Domains:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Zertifikat fir Domainen oder selbst ënnerschriwwenen Zertifikat

Ech wäert net ophalen wéi een e selbst ënnerschriwwenen Certificat erstellt, Dir musst 2 Certificaten erstellen, dëst ass de Root (Certificate Authority) a Wildcard Client fir den *.example.org Domain

Nodeems Dir Certificaten kritt / erausginn, muss de Client op Kubernetes bäigefüügt ginn, dofir kreéiere mir e Geheimnis dofir:

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

Als nächst wäerte mir et fir eisen Ingress Controller benotzen.

Keycloak Installatioun

Ech hunn décidéiert datt deen einfachste Wee ass fäerdeg Léisunge fir dëst ze benotzen, nämlech Helm Charts.

Installéiert de Repository an update et:

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

Erstellt eng keycloak.yml Datei mat dem folgenden 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

Federatioun Opstellung

Als nächst gitt op d'Webinterface keycloak.example.org

Klickt am lénksen Eck Füügt Räich

Schlëssel
Wäert

Numm
kubernetes

Unzeigenumm
Kubernetes

Benotzer E-Mail Verifizéierung auszeschalten:
Client Ëmfang —> E-Mail —> Mappers —> E-Mail verifizéiert (Läschen)

Mir hunn d'Federatioun opgeriicht fir Benotzer aus ActiveDirectory z'importéieren, ech loossen Screenshots hei drënner, ech mengen et wäert méi kloer sinn.

Benotzerfederatioun —> Provider dobäisetzen ... —> ldap

Federatioun OpstellungMir befestigen ActiveDirectory Autorisatioun op Kubernetes mat Keycloak
Mir befestigen ActiveDirectory Autorisatioun op Kubernetes mat Keycloak

Wann alles gutt ass, dann nodeems Dir de Knäppchen dréckt Synchroniséiert all Benotzer Dir gesitt e Message iwwer den erfollegräichen Import vun de Benotzer.

Als nächst musse mir eis Gruppen kartéieren

Benotzerfederatioun --> ldap_localhost --> Mappers --> Erstellt

E Mapper erstellenMir befestigen ActiveDirectory Autorisatioun op Kubernetes mat Keycloak

Client Setup

Et ass néideg e Client ze kreéieren, wat Keycloak ugeet, dëst ass eng Applikatioun déi vun him autoriséiert gëtt. Ech markéieren déi wichteg Punkten am Screenshot rout.

Clienten —> Erstellen

Client SetupMir befestigen ActiveDirectory Autorisatioun op Kubernetes mat Keycloak

Loosst eis Scoupe fir Gruppen erstellen:

Client Ëmfang —> Erstellen

Schafen ËmfangMir befestigen ActiveDirectory Autorisatioun op Kubernetes mat Keycloak

A setzt e Mapper fir si op:

Client Ëmfang —> Gruppen —> Mappers —> Erstellen

MapperMir befestigen ActiveDirectory Autorisatioun op Kubernetes mat Keycloak

Füügt d'Mapping vun eise Gruppen un d'Standard Client Scopes:

Clienten —> kubernetes —> Client Scopes —> Standard Client Scopes
Wielt Gruppen в Verfügbar Client Ëmfangklickt auszeschalten Add ausgewielt

Mir kréien d'Geheimnis (a schreiwen et op de Fuedem) dee mir fir Autorisatioun am Keycloak benotzen:

Clienten —> kubernetes —> Umeldungsinformatiounen —> Geheimnis
Dëst fäerdeg de Setup, awer ech hat e Feeler wann ech no erfollegräicher Autorisatioun e Feeler 403 krut. Bug Bericht.

Fixéieren:

Client Ëmfang —> Rollen —> Mappers —> Erstellen

MappersMir befestigen ActiveDirectory Autorisatioun op Kubernetes mat Keycloak

Skript Code

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

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

Kubernetes konfiguréieren

Mir mussen spezifizéieren wou eise Rootzertifika vum Site läit, a wou den OIDC Provider läit.
Fir dëst ze maachen, ännert d'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
...

Update kubeadm Config am 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 astellen

Dir kënnt Keycloak Gatekeeper benotzen fir Är Webapplikatioun ze schützen. Zousätzlech zu der Tatsaach datt dëse Reverse Proxy de Benotzer autoriséiert ier Dir d'Säit weist, gëtt et och Informatioun iwwer Iech un d'Ennapplikatioun an den Header weiderginn. Also, wann Är Applikatioun OpenID ënnerstëtzt, da gëtt de Benotzer direkt autoriséiert. Betruecht d'Beispill vum Kubernetes Dashboard

Kubernetes Dashboard installéieren


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'

Astellungsrechter:

Loosst eis e ClusterRoleBinding erstellen deen Cluster Admin Rechter gëtt (Standard ClusterRole Cluster-admin) fir Benotzer an der DataOPS Grupp.


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

Installéiert Keycloak Gatekeeper:


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

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"

Duerno, wann Dir probéiert ze goen kubernetes-dashboard.example.org, mir ginn op Keycloak ëmgeleet an am Fall vun enger erfollegräicher Autorisatioun komme mir op d'Dashboard schonn ageloggt.

Gangway Installatioun

Fir d'Bequemlechkeet kënnt Dir e Gangway addéieren deen eng Configuratiounsdatei fir kubectl generéiert, mat der Hëllef vun där mir an Kubernetes ënner eisem Benotzer kommen.


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

Gesäit esou aus. Erlaabt Iech direkt d'Configuratiounsdatei erofzelueden an se mat enger Rei vu Kommandoen ze generéieren:

Mir befestigen ActiveDirectory Autorisatioun op Kubernetes mat Keycloak

Source: will.com

Setzt e Commentaire