Această articol este scris cu scopul de a extinde deja , dar povestește despre particularitățile legăturii cu Microsoft Active Directory, precum și o completează.
În acest articol voi descrie cum să instalezi și să configurezi:
- Keycloak — este un proiect cu sursă deschisă. Care asigură un singur punct de acces pentru aplicații. Funcționează cu o multitudine de protocoale, inclusiv LDAP și OpenID, care ne interesează.
- Keycloak gatekeeper — aplicație de reverse proxy care permite integrarea autorizării prin Keycloak.
- Gangway — aplicația care generează configurații pentru kubectl, prin care se poate autoriza și conecta la API-ul Kubernetes folosind OpenID.
Cum funcționează drepturile în Kubernetes.
Putem gestiona drepturile utilizatorilor/grupurilor folosind RBAC, despre care s-au scris deja o mulțime de articole, nu mă voi opri asupra acestuia în detaliu. Problema este că, deși poți folosi RBAC pentru a restricționa drepturile utilizatorului, Kubernetes nu știe nimic despre utilizatori. Deci, avem nevoie de un mecanism pentru a aduce utilizatorul în Kubernetes. Pentru aceasta, vom adăuga un provider OpenID în Kubernetes care va confirma că utilizatorul respectiv există, iar Kubernetes îi va atribui drepturile.
Pregătire
- Veți avea nevoie de un cluster Kubernetes sau minikube
- Active Directory
- Domenii:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Certificat pentru domenii sau certificat auto-semnat
Nu voi detalia cum să creezi un certificat auto-semnat, trebuie să creezi 2 certificate: unul rădăcină (Centru de certificare) și unul wildcard pentru domeniul *.example.org
După ce obțineți / emiteți certificatele, cheia clientului trebuie adăugată în Kubernetes, pentru aceasta creăm un secret pentru el:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pemApoi vom folosi acest secret pentru controlerul nostru Ingress
Instalarea Keycloak
Am decis că cel mai simplu este să folosesc soluții existente, adică helm charts.
Instalăm depozitul și-l actualizăm:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo updateCreăm fișierul keycloak.yml cu următorul conținut:
keycloak.yml
keycloak:
# Numele administratorului
username: "test_admin"
# Parola administrator
password: "admin"
# Aceste flag-uri sunt necesare pentru a permite încărcarea scripturilor în Keycloak direct prin interfața web. Este necesar pentru a remedia un bug menționat mai jos.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Activăm ingress, specificăm numele gazdei și certificatul pe care l-am salvat anterior în secrete
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 necesită o bază de date pentru funcționare, în scopuri de testare, desfășor Postgresql direct în Kubernetes, în producție nu este recomandat!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: trueConfigurarea federației
Apoi intrăm în interfața web
În colțul stâng facem clic pe Adaugă domeniu
Cheie
Value
Name
kubernetes
Numele afișat
Kubernetes
Dezactivăm verificarea confirmării email-ului utilizatorului:
Client scopes —> Email —> Mappers —> Email verified (Șterge)
Configurăm federația pentru importul utilizatorilor din ActiveDirectory, voi adăuga mai jos capturi de ecran pentru a fi mai clar.
User federation —> Adaugă furnizor… —> ldap
Configurarea federației

Dacă totul este bine, după apăsarea butonului Sincronizați toți utilizatorii veți vedea un mesaj de import reușit al utilizatorilor.
Apoi trebuie să mapăm grupurile noastre
User federation —> ldap_localhost —> Mappers —> Creare
Crearea mapperului
Configurarea clientului
Trebuie să creăm un client, în concepția Keycloak acesta este aplicația care se va autentifica. Punctele importante vor fi evidențiate în captura de ecran cu roșu.
Clients —> Creare
Configurarea clientului
Să creăm un scoup pentru grupuri:
Client Scopes —> Creare
Crearea scoup-ului
Și să configurăm mapperul pentru ele:
Client Scopes —> groups —> Mappers —> Creare
Mapper
Adăugăm mapping-ul grupurilor noastre în Default Client Scopes:
Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Alegem groups în Available Client Scopes, dăm clic pe Adaugă selecționate
Primiți secretul (și îl notăm undeva) pe care îl vom folosi pentru autentificarea în Keycloak:
Clients —> kubernetes —> Credentials —> Secret
Aceasta încheie configurarea, dar am avut o eroare când, după autentificarea reușită, primeam eroarea 403. .
Fix:
Client Scopes —> roles —> Mappers —> Creare
Mapper
Codul scriptului
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Kubernetes Setup
Trebuie să specificăm unde se află certificatul nostru rădăcină de la site, și unde se află furnizorul OIDC.
Pentru aceasta, edităm fișierul \/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
...
Actualizăm configurația kubeadm în cluster:
configurația kubeadm
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
...
Configurarea auth-proxy
Pentru a proteja aplicația dvs. web, puteți folosi keycloak gatekeeper. Pe lângă faptul că acest proxy invers va autoriza utilizatorul înainte de a arăta pagina, va transmite, de asemenea, aplicației finale informații despre dvs. în antete. Astfel, dacă aplicația dvs. acceptă OpenID, utilizatorul se va autentifica imediat. Să analizăm prin exemplul Kubernetes Dashboard.
Instalarea 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'
Configurarea drepturilor de acces:
Vom crea un ClusterRoleBinding care va oferi drepturi de administrator al cluster-ului (standard ClusterRole cluster-admin) utilizatorilor care fac parte din grupul 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
Instalarea 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"
După aceasta, încercând să accesați , va avea loc o redirecționare către Keycloak și, în cazul unei autentificări reușite, vom ajunge în Dashboard deja autentificat.
Instalarea gangway
Pentru comoditate, puteți adăuga gangway, care va genera un fișier de configurare pentru kubectl, prin care, cu utilizatorul nostru, vom accesa Kubernetes.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# Numele personalizat al cluster-ului
clusterName: "my-k8s"
# URL-ul provider-ului 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"
# Teoretic, putem adăuga grupurile pe care le-am mapat
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Numele clientului
clientID: "kubernetes"
# Secretul
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Dacă lăsați valoarea implicită, se va folosi numele utilizatorului <b>Prenume</b> <b>Nume</b>, iar pentru "sub" este logarea lui
usernameClaim: "sub"
# Numele de domeniu sau adresa IP a serverului API
apiServerURL: "https://192.168.99.111:8443"
# Activăm 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
# Dacă folosim un certificat auto-semnat, trebuie să specificăm certificatul (certificatul de rădăcină public)
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-----
Asta arată cam așa. Permite atât descărcarea imediată a fișierului de configurare, cât și generarea lui folosind un set de comenzi:

Sursa: habr.com
