Ky artikull është shkruar me qëllim që të zgjasë ekzistencën e tij tashmë , por përshkruan veçoritë e lidhjes pikërisht me Microsoft Active Directory, si dhe e plotëson atë.
Në këtë artikull do të tregoj se si të instaloni dhe konfiguroni:
- Keycloak — është një projekt me burim të hapur. Ai siguron një pikë të vetme hyrjeje për aplikacionet. Punon me shumë protokolle, përfshirë LDAP dhe OpenID të cilat na ενδιαjnë.
- Keycloak gatekeeper — një aplikacion proxy revers, i cili mundëson integrimin e autorizimit përmes Keycloak.
- Gangway — një aplikacion që gjeneron konfigurim për kubectl, me anë të të cilit përmes OpenID mund të autorizoheni dhe të lidhni me Kubernetes API.
Si funksionojnë të drejtat në Kubernetes.
Ne mund të menaxhojmë të drejtat e përdoruesit/grupeve përmes RBAC, për këtë janë krijuar shumë artikuj, nuk do të ndalem në detaje mbi këtë. Problemi është që, duke përdorur RBAC për të kufizuar të drejtat e përdoruesit, Kubernetes nuk di asgjë për përdoruesit. Pra, ne kemi nevojë për një mekanizëm për të dërguar përdoruesin në Kubernetes. Për këtë, do të shtojmë në Kubernetes një ofrues OpenID, i cili do të deklarojë se ky përdorues vërtet ekziston, ndërsa të drejtat do t'i jep vetë Kubernetes.
Përgatitja
- Ju nevojitet një klaster Kubernetes ose minikube
- Active Directory
- Domene:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Certifikatë për domenet ose një certifikatë vetë të nënshkruar
Nuk do të ndalem shumë në atë se si të krijoni certifikata të vetë-nënshkura, duhet të krijoni 2 certifikata, një rrënjë (Qendra e Certifikimit) dhe një wildcard klient për domenin *.example.org
Pasi të merrni/dhe që të shkruani certifikatat, certifikata klient duhet të shtohet në Kubernetes, për këtë krijojmë një sekret për të:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pemMë pas do ta përdorim për kontrolluesin tonë Ingress
Instalimi i Keycloak
Kam vendosur se ishte më lehtë të përdorja zgjidhje të gatshme për këtë, sidomos helm chart-et.
Instaloni depozitën dhe azhurnoni atë:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo updateKrijoni një skedar keycloak.yml me përmbajtjen e mëposhtme:
keycloak.yml
keycloak:
# Emri i Administratorit
username: "test_admin"
# Fjalëkalimi i administratorit
password: "admin"
# Këta flamuj nevojiten për të lejuar ngarkimin e skripteve në Keycloak direkt përmes ndërfaqes web. Kjo do na nevojitet për të riparuar një bug, për të cilin do flasim më poshtë.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Aktivizojmë ingress, specifikoni emrin e hostit dhe certifikatën që e kemi ruajtur paraprakisht në 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 kërkon një bazë të dhënash për funksionimin e tij, për qëllime testuese unë po vendos Postgresql direkt në Kubernetes, në prodhim është më mirë të mos bëni këtë!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: trueKonfigurimi i federatës
Pastaj hyjmë në ndërfaqen web
Klikojmë në këndin e majtë Shto realm
Çelësi
Vlera
Emri
kubernetes
Emri i Shfaqjes
Kubernetes
Çaktivizojmë verifikimin e emailit të përdoruesit:
Client scopes —> Email —> Mappers —> Email verified (Fshi)
Konfigurojmë federatën për importimin e përdoruesve nga ActiveDirectory, do lë më poshtë disa screenshot-e mendoj se do jetë më e qartë.
User federation —> Shto ofrues… —> ldap
Konfigurimi i federatës

Nëse gjithçka është në rregull, pas klikuar butonin Synchronize all users do të shihni mesazhin e suksesshëm për importimin e përdoruesve.
Pastaj duhet të mapojmë grupet tona
User federation —> ldap_localhost —> Mappers —> Krijo
Krijimi i mapper-it
Konfigurimi i klientit
Duhet të krijojmë një klient, në kuptimin e Keycloak ky është aplikacioni që do të autorizohet. Pikat e rëndësishme do i veçoj në screenshot në të kuqe.
Clients —> Krijo
Konfigurimi i klientit
Do të krijojmë scope për grupet:
Client Scopes —> Krijo
Krijimi i scope-it
Dhe do të konfiguroni mapper-in për to:
Client Scopes —> groups —> Mappers —> Krijo
Mapperi
Shtojmë mapimin e grupeve tona në Default Client Scopes:
Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Zgjidhni grupet në Shkallët e Klientit në Disponibël, klikojmë Shto të përzgjedhurat
Marrim secret-in (dhe e shkruajmë diku) të cilin do ta përdorim për autorizimin në Keycloak:
Clients —> kubernetes —> Credentials —> Secret
Kjo është përfundimi i konfigurimit, por unë kam hasur një gabim kur pas autorizimit të suksesshëm kam marrë gabimin 403. .
Fix:
Client Scopes —> roles —> Mappers —> Krijo
Mapper
Kodi i skriptës
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Konfigurimi i Kubernetes
Na nevojitet të specifikojmë ku ndodhet certifikata jonë rrënjore nga faqja, dhe ku ndodhet ofruesi OIDC.
Për këtë redaktojmë skedarin /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
...
Po përditësimin e konfiguracionit kubeadm në klaster:
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
...
Konfigurimi i auth-proxy
Për të mbrojtur aplikacionin tuaj web, mund të përdorni keycloak gatekeeper. Përveç faktit që ky reverse proxy do të autentifikojë përdoruesin përpara se të shfaqë faqen, ai do të dorëzojë informacionin tuaj në aplikacionin përfundimtar nëpërmjet titujve. Kështu, nëse aplikacioni juaj mbështet OpenID, përdoruesi do të autentifikohet menjëherë. Le të shohim një shembull me Kubernetes Dashboard.
Instalimi i 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'
Konfigurimi i të drejtave të aksesit:
Do të krijojmë një ClusterRoleBinding që do t'i japë të drejtat e administratorit të klasterit (ClusterRole standard cluster-admin) për përdoruesit e grupit 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
Instalimi i 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"
Pasi të ndodhi kjo, kur të provoni të hyni në , do të ndodhi një ridirection në Keycloak dhe në rastin e një autorizimi të suksesshëm, ne do të hynim në Dashboard tashmë të autentikuar.
Instalimi i gangway
Për lehtësinë tuaj, mund të shtoni gangway i cili do të gjenerojë skedarin e konfigurimit për kubectl, me të cilin ne do të hynim në Kubernetes me përdoruesin tonë.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# Emri i rastësishëm i grumbullit
clusterName: "my-k8s"
# Ku ndodhet ofruesi ynë 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"
# Teoretikisht, këtu mund të shtohen grupet që ne kemi hartuar
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Emri i klientit
clientID: "kubernetes"
# Sekreti
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Nëse lëvizni me vlerën e defoltë, bën që emri i përdoruesit të merret nga <b>Emri i parë</b> <b>Emri i dytë</b>, dhe me "sub" logini i tij
usernameClaim: "sub"
# Emri i domenit ose adresa IP e serverit API
apiServerURL: "https://192.168.99.111:8443"
# Aktivizoni 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
# Nëse përdorim një certifikat vetë-nënshkruar, atëherë duhet të specifikojmë atë (certifikata e hapur rrënjë).
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-----
Dukshëm kështu. Lejon si të shkarkoni skedarin e konfigurimit menjëherë, ashtu edhe ta formoni atë duke përdorur një grup komandash:

Burimi: habr.com
