Připojujeme autentizaci ActiveDirectory k Kubernetes pomocí Keycloak

Tento článek byl napsán s cílem rozšířit již existující, ale popisuje zvláštnosti spojení právě s Microsoft ActiveDirectory, a také jej doplňuje.

V tomto článku vám ukážu, jak nainstalovat a nakonfigurovat:

  • Keycloak — to je projekt s otevřeným zdrojovým kódem. Který poskytuje jednotný vstup pro aplikace. Pracuje s mnoha protokoly, včetně LDAP a OpenID, které nás zajímají.
  • Keycloak gatekeeper — reverzní proxy aplikace, která umožňuje integraci autorizace přes Keycloak.
  • Gangway — aplikace, která generuje konfiguraci pro kubectl, s jejíž pomocí lze autorizovat a připojit se k API Kubernetes prostřednictvím OpenID.

Jak fungují oprávnění v Kubernetes.

Oprávnění uživatelů/skupin můžeme spravovat pomocí RBAC, o čemž už bylo napsáno mnoho článků, nebudu se zde do podrobností pouštět. Problém je v tom, že pomocí RBAC můžete omezit oprávnění uživatele, ale Kubernetes neví nic o uživatelích. To znamená, že potřebujeme mechanismus, který uživatele doručí do Kubernetes. K tomu přidáme do Kubernetes OpenID poskytovatele, který bude potvrzovat, že takový uživatel skutečně existuje, a oprávnění mu udělí již samotný Kubernetes.

Příprava

  • Budete potřebovat Kubernetes klastr nebo minikube
  • Active Directory
  • Domény:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certifikát pro domény nebo self-signed certifikát

Nebudu se podrobně zabývat tím, jak vytvářet self-signed certifikáty, je třeba vytvořit 2 certifikáty, a to kořenový (certifikační úřad) a wildcard klientský pro doménu *.example.org

Jakmile obdržíte/vyhotovíte certifikáty, klientský je třeba přidat do Kubernetes, k tomu vytvoříme pro něj secret:

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

Poté jej budeme používat pro náš Ingress controller

Instalace Keycloak

Rozhodl jsem se, že nejjednodušší bude použít hotová řešení, konkrétně helm chart-y.

Přidáváme repozitář a aktualizujeme jej:

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

Vytvořte soubor keycloak.yml s následujícím obsahem:

keycloak.yml

keycloak:
  # Jméno administrátora
  username: "test_admin"
  # Heslo administrátora  
  password: "admin"
  # Tato nastavení jsou nutná k tomu, aby umožnila nahrávat do Keycloak skripty přímo přes webové rozhraní. To budeme 
  potřebovat pro opravu jednoho chyby, o které se zmiňuji níže.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
  # Aktivujeme ingress, uvedeme název hostitele a certifikát, který jsme dříve uložili do tajných údajů
  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 pro svou činnost vyžaduje databázi, pro testovací účely spouštím Postgresql přímo v Kubernetes, v produkci to není dobrý nápad!
  persistence:
    deployPostgres: true
    dbVendor: postgres

postgresql:
  postgresUser: keycloak
  postgresPassword: ""
  postgresDatabase: keycloak
  persistence:
    enabled: true

Nastavení federace

Dále se přihlaste do webového rozhraní keycloak.example.org

V levém rohu klikněte na Přidat realm

Klíč
Hodnota

Název
kubernetes

Zobrazovaný název
Kubernetes

Deaktivujeme kontrolu potvrzení e-mailu uživatele:
Client scopes —> Email —> Mappers —> Email verified (Smazat)

Nastavujeme federaci pro import uživatelů z Active Directory, níže naleznete screenshoty, myslím, že to bude pochopitelné.

User federation —> Přidat poskytovatele… —> ldap

Nastavení federacePřipojujeme autentizaci ActiveDirectory k Kubernetes pomocí Keycloak
Připojujeme autentizaci ActiveDirectory k Kubernetes pomocí Keycloak

Pokud je vše v pořádku, po kliknutí na tlačítko Synchronizovat všechny uživatele uvidíte zprávu o úspěšném importu uživatelů.

Nyní je třeba mapovat naše skupiny

User federation —> ldap_localhost —> Mappers —> Vytvořit

Vytvoření mapperuPřipojujeme autentizaci ActiveDirectory k Kubernetes pomocí Keycloak

Nastavení klienta

Musíme vytvořit klienta, v pojmech Keycloak to je aplikace, která se bude autentizovat. Důležité body označím na screenshotu červeně.

Klienti —> Vytvořit

Nastavení klientaPřipojujeme autentizaci ActiveDirectory k Kubernetes pomocí Keycloak

Vytvoříme scope pro skupiny:

Client Scopes —> Vytvořit

Vytvoření scopePřipojujeme autentizaci ActiveDirectory k Kubernetes pomocí Keycloak

A nastavíme pro ně mapper:

Client Scopes —> groups —> Mappers —> Vytvořit

MapperPřipojujeme autentizaci ActiveDirectory k Kubernetes pomocí Keycloak

Přidáváme mapování našich skupin do Výchozích klientských scope:

Klienti —> kubernetes —> Client Scopes —> Výchozí klientské scope
Vyberte groups v Dostupné klientské rozsahy, klikněte na Přidat vybrané

Získáváme secret (a zapíšeme si ho někam), který budeme používat pro autorizaci v Keycloak:

Klienti —> kubernetes —> Credentials —> Secret
Na tomto nastavení je konec, ale objevil se mi problém, když po úspěšné autorizaci jsem dostával chybu 403. Bug report.

Oprava:

Client Scopes —> roles —> Mappers —> Vytvořit

MapperPřipojujeme autentizaci ActiveDirectory k Kubernetes pomocí Keycloak

Kód skriptu

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

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

Nastavení Kubernetes

Musíme uvést, kde je náš kořenový certifikát ze stránky a kde se nachází poskytovatel OIDC.
K tomu upravíme soubor /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
...

Aktualizujeme kubeadm konfiguraci v klastru:

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

Nastavení auth-proxy

Pro zabezpečení vaší webové aplikace můžete použít keycloak gatekeeper. Kromě toho, že tento reverzní proxy autorizuje uživatele před tím, než mu zobrazí stránku, předává také koncovému aplikaci informace o vás v záhlaví. Tím pádem, pokud vaše aplikace podporuje OpenID, se uživatel ihned autorizuje. Pojďme to prozkoumat na příkladu Kubernetes Dashboard.

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

Nastavení práv přístupu:

Vytvoříme ClusterRoleBinding, který udělí adminská práva (standardní ClusterRole cluster-admin) uživatelům, kteří jsou ve skupině DataOPS.


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

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

Po tomto pokusu o přístup na kubernetes-dashboard.example.org, dojde k přesměrování na Keycloak a v případě úspěšné autorizace se dostaneme do Dashboardu již přihlášeni.

Instalace gangway

Pro usnadnění můžete přidat gangway, který vygeneruje konfigurační soubor pro kubectl, pomocí kterého se už jako uživatel dostaneme do Kubernetes.


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

values_gangway.yaml


gangway:
  # Libovolný název clusteru
  clusterName: "my-k8s"
  # Kde máme OIDC poskytovatele
  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"
  # Teoreticky sem můžeme přidat skupiny, které jsme namapovali
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Název klienta
  clientID: "kubernetes"
  # Tajemství
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Pokud zanecháte výchozí hodnotu, pak se jako uživatelské jméno vezme <b>Jméno</b> <b>Příjmení</b>, a při "sub" jeho přihlašovací údaje
  usernameClaim: "sub"
  # Doménové jméno nebo IP adresa API serveru
  apiServerURL: "https://192.168.99.111:8443"

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

# Pokud používáme samo-podepsaný certifikát, musíme uvést jeho (otevřený kořenový certifikát).
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-----

Vypadá to přibližně takhle. Umožňuje jak ihned stáhnout konfigurační soubor, tak ho vytvořit pomocí sady příkazů:

Připojujeme autentizaci ActiveDirectory k Kubernetes pomocí Keycloak

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster