Denne artikel er skrevet med det formål at udvide den eksisterende , men den beskriver særegenhederne ved integrationen med Microsoft ActiveDirectory, samt supplerer den.
I denne artikel vil jeg forklare, hvordan man installerer og konfigurerer:
- Keycloak — et projekt med åben kildekode, der giver en enkelt indgang til applikationer. Det fungerer med mange protokoller, herunder LDAP og OpenID, som vi er interesseret i.
- Keycloak gatekeeper — en reverse proxy-applikation, der muliggør integration af autorisation via Keycloak.
- Gangway — en applikation, der genererer konfigurationsfiler til kubectl, som gør det muligt at logge ind via OpenID og tilsluttes Kubernetes API.
Hvordan rettigheder fungerer i Kubernetes.
Vi kan styre bruger-/gruppeadgang ved hjælp af RBAC, der er allerede skrevet mange artikler om det, så jeg vil ikke uddybe dette nærmere. Problemet er, at selvom du bruger RBAC til at begrænse brugerrettigheder, ved Kubernetes ikke noget om brugerne. Det viser sig, at der er behov for en mekanisme til at bringe brugeren ind i Kubernetes. Til dette vil vi tilføje en OpenID-udbyder til Kubernetes, som vil bekræfte, at en sådan bruger faktisk eksisterer, mens Kubernetes selv vil tildele rettighederne.
Forberedelse
- Du skal bruge et Kubernetes-kluster eller minikube
- Active Directory
- Domæner:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Certifikat til domænerne eller et selvsigneret certifikat
Jeg vil ikke gå ind i detaljerne om, hvordan man opretter selvsignerede certifikater, men det er nødvendigt at oprette 2 certifikater; et rodcertifikat (Certificeringsmyndighed) og et wildcard-klientcertifikat for domænet *.example.org
Når du har modtaget/udstedt certifikaterne, skal klientcertifikatet tilføjes til Kubernetes, så vi opretter et secret til det:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pemDerefter vil vi bruge det til vores Ingress-controller
Installation af Keycloak
Jeg besluttede, at det ville være nemmest at bruge eksisterende løsninger, nemlig helm charts.
Tilføj repositories og opdater det:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo updateOpret en fil keycloak.yml med følgende indhold:
keycloak.yml
keycloak:
# Administrator navn
username: "test_admin"
# Administrator kodeord
password: "admin"
# Disse flags er nødvendige for at tillade upload af scripts direkte gennem Keycloak’s webgrænseflade. Dette vil være nødvendigt for at løse en fejl omtalt nedenfor.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Aktiverer ingress, angiver værtsnavn og certifikat, som vi har gemt i 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 kræver en database for at fungere, til testformål vil jeg implementere Postgresql direkte i Kubernetes, men det er ikke anbefalet i produktion!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: trueKonfiguration af federation
Derefter går vi ind i webgrænsefladen
Klik i nederste venstre hjørne Tilføj realm
Nøgle
Værdi
Navn
kubernetes
Visningsnavn
Kubernetes
Deaktiverer bekræftelse af brugerens email:
Client scopes —> Email —> Mappers —> Email verified (Slet)
Vi konfigurerer federation til import af brugere fra Active Directory, jeg vil vedlægge screenshots nedenfor, så det er lettere at forstå.
User federation —> Tilføj udbyder… —> ldap
Konfiguration af federation

Hvis alt er i orden, vil du efter at have klikket på knappen Synkroniser alle brugere se en meddelelse om vellykket import af brugere.
Derefter skal vi mappe vores grupper
User federation —> ldap_localhost —> Mappers —> Opret
Oprettelse af mapper
Klientkonfiguration
Vi skal oprette en klient, i Keycloak’s termer er dette en applikation, der vil autentificere sig. Vigtige punkter er markeret på screenshotet med rødt.
Clients —> Opret
Klientkonfiguration
Lad os oprette et scope for grupper:
Client Scopes —> Opret
Oprettelse af scope
Og vi konfigurerer mapper til dem:
Client Scopes —> groups —> Mappers —> Opret
Mapper
Vi tilføjer mapping af vores grupper til Default Client Scopes:
Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Vi vælger groups i Tilgængelige Client Scopes, klik på Tilføj valgte
Vi får en secret (og noterer det et sted), som vi vil bruge til autentificering i Keycloak:
Clients —> kubernetes —> Credentials —> Secret
Dette afslutter konfigurationen, men jeg oplevede en fejl, hvor jeg fik en 403-fejl efter en vellykket autentificering. .
Fix:
Client Scopes —> roles —> Mappers —> Opret
Mapper
Script kode
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Kubernetes konfiguration
Vi skal angive, hvor vores rod-certifikat fra webstedet ligger, og hvor OIDC-udbyderen befinder sig.
For at gøre dette redigerer 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
...
Opdaterer kubeadm-konfiguration i klyngen:
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
...
Konfiguration af auth-proxy
For at beskytte din webapplikation kan du bruge Keycloak Gatekeeper. Udover at denne omvendte proxy vil autentificere brugeren, før siden vises, vil den også sende information om dig til den endelige applikation i overskrifterne. Dermed, hvis din applikation understøtter OpenID, vil brugeren blive autentificeret med det samme. Lad os tage Kubernetes Dashboard som eksempel.
Installation af 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'
Konfiguration af adgangsrettigheder:
Vi opretter et ClusterRoleBinding, som giver admin-rettigheder til klyngen (standard ClusterRole cluster-admin) for brugere, der er medlem af 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 af 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 dette, når du forsøger at tilgå , sker der en omdirigering til Keycloak, og efter en succesfuld godkendelse vil vi få adgang til Dashboard som allerede indlogget.
Installation af Gangway
For nemheds skyld kan vi tilføje Gangway, som vil generere en konfiguraitonsfil til kubectl, hvormed vi under vores bruger kan få adgang til Kubernetes.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# Valgfrit cluster navn
clusterName: "my-k8s"
# Hvor vi har OIDC udbyderen
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"
# Teoretisk set kan vi her tilføje grupper, som vi har mappet
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Klientnavn
clientID: "kubernetes"
# Hemmelighed
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Hvis standardværdien efterlades, så vil brugernavnet blive hentet ud fra <b>Fornavn</b> <b>Efternavn</b>, og ved "sub" bliver hans login
usernameClaim: "sub"
# Domænenavn eller IP-adresse på API-serveren
apiServerURL: "https://192.168.99.111:8443"
# Aktiverer 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
# Hvis vi bruger et selvsigneret certifikat, skal det (det åbne rodcertifikat) angives.
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-----
Ser cirka sådan ud. Muliggør både at downloade konfigurationsfilen med det samme samt at generere den ved hjælp af et sæt kommandoer:

Kilde: habr.com
