Tento článek byl napsán s cílem rozšířit již , 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.pemPoté 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 updateVytvoř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: trueNastavení federace
Dále se přihlaste do webového rozhraní
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í federace

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í mapperu
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í klienta
Vytvoříme scope pro skupiny:
Client Scopes —> Vytvořit
Vytvoření scope
A nastavíme pro ně mapper:
Client Scopes —> groups —> Mappers —> Vytvořit
Mapper
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. .
Oprava:
Client Scopes —> roles —> Mappers —> Vytvořit
Mapper
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 , 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ů:

Zdroj: habr.com
