Tento článok je napísaný s cieľom rozšíriť už , ale rozpráva o špecifikách tejto väzby práve s Microsoft ActiveDirectory a taktiež ju dopĺňa.
V tomto článku vám poviem, ako nainštalovať a nastaviť:
- Keycloak — to je projekt s otvoreným zdrojovým kódom. Poskytuje jednotný prístupový bod pre aplikácie. Funguje s množstvom protokolov, vrátane LDAP a OpenID, ktoré nás zaujímajú.
- Keycloak gatekeeper — reverzný proxy aplikácia, ktorá umožňuje integrovať autorizáciu cez Keycloak.
- Gangway — aplikácia, ktorá generuje konfiguráciu pre kubectl, pomocou ktorej sa cez OpenID môžete autorizovať a pripojiť sa k Kubernetes API.
Ako fungujú práva v Kubernetes.
Spravovať práva používateľov/skupín môžeme pomocou RBAC, o čom bolo už vytvorených množstvo článkov, nebudem sa tým podrobne zaoberať. Problém je v tom, že môžete použiť RBAC na obmedzenie práv používateľa, ale Kubernetes nevie nič o používateľoch. Výsledkom je, že potrebujeme mechanizmus doručenia používateľa do Kubernetes. Na tento účel pridáme do Kubernetes OpenID poskytovateľa, ktorý potvrdí existenciu používateľa, a práva mu už pridelí Kubernetes sám.
Príprava
- Budete potrebovať Kubernetes klaster alebo minikube.
- Active Directory
- Domény:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Certifikát pre domény alebo samopodpisaný certifikát
Nepotrebujem podrobne rozoberať, ako vytvoriť samopodpisaný certifikát, musíte vytvoriť 2 certifikáty, jeden koreňový (Certifikačná autorita) a wildcard klientsky pre doménu *.example.org.
Po obdržaní/vypísaní certifikátov treba pridať klientsky certifikát do Kubernetes, na toto vytvoríme preň tajomstvo:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pemĎalej ho budeme používať pre náš Ingress kontrolér.
Inštalácia Keycloak
Rozhodol som sa, že najjednoduchšie je použiť hotové riešenia, a to presne helm chart-y.
Nainštalujeme repozitár a aktualizujeme ho:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo updateVytvoríme súbor keycloak.yml s nasledujúcim obsahom:
keycloak.yml
keycloak:
# Meno administrátora
username: "test_admin"
# Heslo administrátora
password: "admin"
# Tieto flagy sú potrebné na to, aby sa dali načítavať skripty do Keycloak priamo prostredníctvom webového rozhrania. To budeme
potrebovať na opravu jedného problému, o ktorom bude reč nižšie.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Aktivujeme ingress, uvedieme meno hostiteľa a certifikát, ktorý sme predtým uložili v 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 pre svoju činnosť potrebuje databázu. Na testovacie účely spúšťam Postgresql priamo v Kubernetese, v produkcii je to lepšie nerobiť!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: trueNastavenie federácie
Ďalej vstupujeme do webového rozhrania
V ľavom rohu klikneme na Pridať realm
Kľúč
Hodnota
Názov
kubernetes
Zobrazované meno
Kubernetes
Vypneme preverovanie potvrdzovania e-mailu používateľa:
Client scopes —> Email —> Mappers —> Email verified (Odstrániť)
Nastavujeme federáciu na import používateľov z ActiveDirectory, nižšie zanechám obrázky, aby to bolo jasnejšie.
User federation —> Pridať poskytovateľa… —> ldap
Nastavenie federácie

Ak všetko prebehne v poriadku, po stlačení tlačidla Synchronizovať všetkých používateľov uvidíte správu o úspešnom importe používateľov.
Ďalej musíme zmapovať naše skupiny
User federation —> ldap_localhost —> Mappers —> Vytvoriť
Vytvorenie mappera
Nastavenie klienta
Musíme vytvoriť klienta, v pojmoch Keycloak to je aplikácia, ktorá sa bude autentifikovať. Dôležité body zvýrazním na obrázku červenou farbou.
Clients —> Vytvoriť
Nastavenie klienta
Vytvoríme scoupe pre skupiny:
Client Scopes —> Vytvoriť
Vytvorenie scoupe
A nastavíme mapper pre nich:
Client Scopes —> groups —> Mappers —> Vytvoriť
Mapper
Pridávame mapovanie našich skupín do Default Client Scopes:
Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Vyberáme groups v Dostupné Client Scopes, klikneme na Pridať vybrané
Získame secret (a zapíšeme si ho niekam), ktorý budeme používať na autentifikáciu v Keycloak:
Clients —> kubernetes —> Credentials —> Secret
Na tomto nastavení končí, ale mal som chybu, keď som po úspešnej autentifikácii dostal chybu 403. .
Oprava:
Client Scopes —> roles —> Mappers —> Vytvoriť
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();
Nastavenie Kubernetes
Musíme uviesť, kde sa nachádza náš koreňový certifikát od webovej stránky a kde sa nachádza poskytovateľ OIDC.
Na to editujeme súbor /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 konfiguráciu v klastri:
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
...
Nastavenie auth-proxy
Na ochranu vašich webových aplikácií môžete použiť keycloak gatekeeper. Okrem toho, že tento reverzný proxy server autentifikuje užívateľa predtým, než mu zobrazí stránku, tak tiež predáva konečnej aplikácii informácie o vás v hlavičkách. Týmto spôsobom, ak vaša aplikácia podporuje OpenID, sa užívateľ okamžite autentifikuje. Pozrieme sa na príklade Kubernetes Dashboard.
Inštalácia 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'
Nastavenie prístupových práv:
Vytvoríme ClusterRoleBinding, ktorý poskytne administrátorské práva (štandardná ClusterRole cluster-admin) pre užívateľov, ktorí sú v skupine 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
Inštalácia 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, pri pokuse o prístup na , dôjde k presmerovaniu na Keycloak a v prípade úspešnej autentifikácie sa dostaneme do Dashboardu už prihlásený.
Inštalácia gangway
Pre pohodlie môžete pridať gangway, ktorý vygeneruje konfiguračný súbor pre kubectl, pomocou ktorého sa už pod naším užívateľom dostaneme do Kubernetes.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# Názov clusteru
clusterName: "my-k8s"
# Kde je náš OIDC provider
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 tu môžeme pridať skupiny, ktoré sme mapovali
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Názov klienta
clientID: "kubernetes"
# Tajný kľúč
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Ak necháte predvolené hodnoty, vezme meno používateľa z <b>Krstné meno</b> <b>Priezvisko</b>, a pri "sub" jeho prihlásenie
usernameClaim: "sub"
# Doménové meno alebo IP adresa API servera
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
# Ak používame samopodpisaný certifikát, musíme uviesť jeho (otvorený koreňový 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-----
Vyzerá približne takto. Umožňuje jednak okamžite stiahnuť konfiguračný súbor, tak aj ho vytvoriť pomocou sady príkazov:

Zdroj: habr.com
