Denna artikel är skriven för att utvidga den redan , men berättar om egenskaperna hos just integreringen med Microsoft ActiveDirectory, samt kompletterar den.
I denna artikel kommer jag att berätta hur man installerar och konfigurerar:
- Keycloak — ett projekt med öppen källkod. Det erbjuder en enhetlig åtkomstpunkt för applikationer. Det fungerar med många protokoll, inklusive LDAP och OpenID, som vi är intresserade av.
- Keycloak gatekeeper — en reverse proxy-applikation som möjliggör integration av autentisering via Keycloak.
- Gangway — en applikation som genererar konfigurationer för kubectl genom vilket man kan autentisera sig och ansluta till Kubernetes API via OpenID.
Hur rättigheter fungerar i Kubernetes.
Vi kan hantera användar- och gruppbehörigheter med hjälp av RBAC, det har redan skrivits en massa artiklar om detta, så jag kommer inte att gå in på detaljer. Problemet är att genom att använda RBAC för att begränsa en användares rättigheter, vet Kubernetes egentligen ingenting om användarna. Det betyder att vi behöver en mekanism för att introducera användaren till Kubernetes. För detta kommer vi att lägga till en OpenID-leverantör i Kubernetes som kommer att bekräfta att användaren verkligen existerar, och att rättigheterna kommer att tilldelas av Kubernetes själv.
Förberedelse
- Du behöver en Kubernetes-kluster eller minikube
- Active Directory
- Domäner:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Ett certifikat för domäner eller ett självsignerat certifikat
Jag kommer inte att gå in på hur man skapar ett självsignerat certifikat, men två certifikat behöver skapas: ett rotcertifikat (certifieringsmyndighet) och ett wildcard-klientcertifikat för domänen *.example.org
När du har mottagit/skrivit ut certifikaten måste klientcertifikatet läggas till i Kubernetes, för detta skapar vi en hemlighet för det:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pemDärefter kommer vi att använda det för vår Ingress-controller
Installation av Keycloak
Jag kom fram till att det var enklast att använda färdiga lösningar för detta, nämligen helm-diagram.
Vi installerar lagret och uppdaterar det:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo updateSkapa en fil keycloak.yml med följande innehåll:
keycloak.yml
keycloak:
# Administratörsnamn
username: "test_admin"
# Administratörslösenord
password: "admin"
# Dessa flaggor behövs för att möjliggöra att ladda upp skript till Keycloak direkt genom webgränssnittet. Detta kommer vi behöva för att åtgärda en bugg, som nämns nedan.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Aktivera ingress, ange värdnamn och certifikat som vi tidigare har sparat i sekretess
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 kräver en databas för sin funktion; för teständamål sätter jag upp Postgresql direkt i Kubernetes, men i produktionen är det bättre att inte göra så!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: trueKonfigurering av federation
Gå vidare till webbgränssnittet
Klicka på vänstra hörnet Lägg till realm
Nyckel
Värde
Namn
kubernetes
Visningsnamn
Kubernetes
Inaktivera e-postbekräftelse för användaren:
Klientomfång —> E-post —> Mappers —> E-post verifierad (Ta bort)
Vi konfigurerar federation för att importera användare från Active Directory, jag kommer lämna skärmdumpar nedan för tydlighet.
Användarfederation —> Lägg till leverantör… —> ldap
Konfigurering av federation

Om allt ser bra ut, tryck på knappen Synkronisera alla användare du kommer att se ett meddelande om att användarna har importerats framgångsrikt.
Nu måste vi mappa våra grupper
Användarfederation —> ldap_localhost —> Mappers —> Skapa
Skapa mappare
Konfigurera klienten
Du behöver skapa en klient, i Keycloak-terminologi är detta en applikation som kommer att autentisera sig. Viktiga punkter kommer jag att markera med rött i skärmdumpen.
Klienter —> Skapa
Konfigurera klienten
Vi skapar ett omfång för grupper:
Klientomfång —> Skapa
Skapa omfång
Och vi konfigurerar mappare för dem:
Klientomfång —> grupper —> Mappers —> Skapa
Mappare
Lägg till mappning av våra grupper i standard klientomfång:
Klienter —> kubernetes —> Klientomfång —> Standard klientomfång
Välj grupper på Tillgängliga klientomfång, tryck på Lägg till valda
Vi får ett hemligt (och antecknar det någonstans) som vi kommer att använda för autentisering i Keycloak:
Klienter —> kubernetes —> Credentials —> Secret
Med detta är konfigurationen klar, men jag stötte på ett fel när jag efter lyckad autentisering fick ett fel 403. .
Fix:
Klientomfång —> roller —> Mappers —> Skapa
Mapper
Skriptkod
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Konfigurering av Kubernetes
Vi behöver ange var vårt rotcertifikat för webbplatsen ligger och var OIDC-leverantören finns.
För detta redigerar vi filen /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
...
Uppdaterar kubeadm-konfig i klustret:
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
...
Inställningar för auth-proxy
För att skydda din webbapplikation kan du använda Keycloak Gatekeeper. Förutom att denna reverse proxy autentiserar användaren innan den visar sidan, kommer den också att vidarebefordra information om dig till den slutgiltiga applikationen i headers. Om din applikation stöder OpenID, loggar användaren in direkt. Låt oss titta på Kubernetes Dashboard som exempel.
Installation av 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'
Inställningar för åtkomsträttigheter:
Vi skapar en ClusterRoleBinding som ger administratörsbehörighet (standard ClusterRole cluster-admin) för användare som tillhör DataOPS-gruppen.
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
Installation av 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"
Efter detta, när du försöker logga in på , kommer du att omdirigeras till Keycloak och vid lyckad autentisering kommer vi att hamna i Dashboard redan inloggad.
Installation av Gangway
För bekvämlighet kan vi lägga till Gangway som kommer att generera en konfigurationsfil för kubectl, genom vilken vi kommer in i Kubernetes med vår användare.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# Valfritt kluster namn
clusterName: "my-k8s"
# Här har vi OIDC-leverantören
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"
# Teoretiskt kan vi lägga till grupper som vi har mappat här
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Klientens namn
clientID: "kubernetes"
# Hemlighet
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Om vi lämnar standardvärdet kommer användarnamnet att vara <b>Förnamn</b> <b>Efternamn</b>, och vid "sub" hans inloggning
usernameClaim: "sub"
# Domännamn eller IP-adress till API-servern
apiServerURL: "https://192.168.99.111:8443"
# Aktivera 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
# Om vi använder ett självsignerat certifikat, måste dess (öppna root certifikatet) anges.
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-----
Det ser ungefär ut så här. Det gör det möjligt att både ladda ner konfigurationsfilen direkt och skapa den med en uppsättning kommandon:

Källa: habr.com
