Dësen Artikel gouf geschriwwen op der schonn expandéieren
An dësem Artikel wäert ech Iech soen wéi Dir installéiert a konfiguréiert:
- keycloak ass en Open Source Projet. Wat en eenzegen Entrée fir Uwendungen ubitt. Schafft mat ville Protokoller, dorënner LDAP an OpenID déi mir interesséiert sinn.
- keycloak Gatekeeper - ëmgedréint Proxy Applikatioun déi Iech erlaabt Autorisatioun duerch Keycloak z'integréieren.
- gangway - eng Applikatioun déi eng Konfiguratioun fir kubectl generéiert, mat där Dir Iech aloggen an mat der Kubernetes API iwwer OpenID verbannen kënnt.
Wéi d'Permissiounen an Kubernetes funktionnéieren.
Mir kënnen d'Benotzer / Grupperechter mat RBAC verwalten, eng ganz Rëtsch Artikele si schonn iwwer dëst erstallt ginn, ech wäert net am Detail op dëst ophalen. De Problem ass datt Dir RBAC benotze kënnt fir Benotzerrechter ze beschränken, awer Kubernetes weess näischt iwwer Benotzer. Et stellt sech eraus datt mir e Benotzer Liwwerung Mechanismus an Kubernetes brauchen. Fir dëst ze maachen, addéiere mer e Provider op Kuberntes OpenID, dee seet datt esou e Benotzer wierklech existéiert, a Kubernetes selwer gëtt him d'Rechter.
Virbereedung
- Dir braucht e Kubernetes Cluster oder Minikube
- Active Directory
- Domains:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Zertifikat fir Domainen oder selbst ënnerschriwwenen Zertifikat
Ech wäert net ophalen wéi een e selbst ënnerschriwwenen Certificat erstellt, Dir musst 2 Certificaten erstellen, dëst ass de Root (Certificate Authority) a Wildcard Client fir den *.example.org Domain
Nodeems Dir Certificaten kritt / erausginn, muss de Client op Kubernetes bäigefüügt ginn, dofir kreéiere mir e Geheimnis dofir:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Als nächst wäerte mir et fir eisen Ingress Controller benotzen.
Keycloak Installatioun
Ech hunn décidéiert datt deen einfachste Wee ass fäerdeg Léisunge fir dëst ze benotzen, nämlech Helm Charts.
Installéiert de Repository an update et:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Erstellt eng keycloak.yml Datei mat dem folgenden Inhalt:
keycloak.yml
keycloak:
# Имя администратора
username: "test_admin"
# Пароль администратор
password: "admin"
# Эти флаги нужны что бы позволить загружать в Keycloak скрипты прямо через web морду. Это нам
понадобиться что бы починить один баг, о котором ниже.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Включаем ingress, указываем имя хоста и сертификат который мы предварительно сохранили в 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 для своей работы требует базу данных, в тестовых целях я разворачиваю Postgresql прямо в Kuberntes, в продакшене так лучше не делать!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: true
Federatioun Opstellung
Als nächst gitt op d'Webinterface
Klickt am lénksen Eck Füügt Räich
Schlëssel
Wäert
Numm
kubernetes
Unzeigenumm
Kubernetes
Benotzer E-Mail Verifizéierung auszeschalten:
Client Ëmfang —> E-Mail —> Mappers —> E-Mail verifizéiert (Läschen)
Mir hunn d'Federatioun opgeriicht fir Benotzer aus ActiveDirectory z'importéieren, ech loossen Screenshots hei drënner, ech mengen et wäert méi kloer sinn.
Benotzerfederatioun —> Provider dobäisetzen ... —> ldap
Federatioun Opstellung
Wann alles gutt ass, dann nodeems Dir de Knäppchen dréckt Synchroniséiert all Benotzer Dir gesitt e Message iwwer den erfollegräichen Import vun de Benotzer.
Als nächst musse mir eis Gruppen kartéieren
Benotzerfederatioun --> ldap_localhost --> Mappers --> Erstellt
E Mapper erstellen
Client Setup
Et ass néideg e Client ze kreéieren, wat Keycloak ugeet, dëst ass eng Applikatioun déi vun him autoriséiert gëtt. Ech markéieren déi wichteg Punkten am Screenshot rout.
Clienten —> Erstellen
Client Setup
Loosst eis Scoupe fir Gruppen erstellen:
Client Ëmfang —> Erstellen
Schafen Ëmfang
A setzt e Mapper fir si op:
Client Ëmfang —> Gruppen —> Mappers —> Erstellen
Mapper
Füügt d'Mapping vun eise Gruppen un d'Standard Client Scopes:
Clienten —> kubernetes —> Client Scopes —> Standard Client Scopes
Wielt Gruppen в Verfügbar Client Ëmfangklickt auszeschalten Add ausgewielt
Mir kréien d'Geheimnis (a schreiwen et op de Fuedem) dee mir fir Autorisatioun am Keycloak benotzen:
Clienten —> kubernetes —> Umeldungsinformatiounen —> Geheimnis
Dëst fäerdeg de Setup, awer ech hat e Feeler wann ech no erfollegräicher Autorisatioun e Feeler 403 krut.
Fixéieren:
Client Ëmfang —> Rollen —> Mappers —> Erstellen
Mappers
Skript Code
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Kubernetes konfiguréieren
Mir mussen spezifizéieren wou eise Rootzertifika vum Site läit, a wou den OIDC Provider läit.
Fir dëst ze maachen, ännert d'Datei /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
...
Update kubeadm Config am Cluster:
kubeadmconfig
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
...
Auth-Proxy astellen
Dir kënnt Keycloak Gatekeeper benotzen fir Är Webapplikatioun ze schützen. Zousätzlech zu der Tatsaach datt dëse Reverse Proxy de Benotzer autoriséiert ier Dir d'Säit weist, gëtt et och Informatioun iwwer Iech un d'Ennapplikatioun an den Header weiderginn. Also, wann Är Applikatioun OpenID ënnerstëtzt, da gëtt de Benotzer direkt autoriséiert. Betruecht d'Beispill vum Kubernetes Dashboard
Kubernetes Dashboard installéieren
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'
Astellungsrechter:
Loosst eis e ClusterRoleBinding erstellen deen Cluster Admin Rechter gëtt (Standard ClusterRole Cluster-admin) fir Benotzer an der DataOPS Grupp.
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
Installéiert 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"
Duerno, wann Dir probéiert ze goen
Gangway Installatioun
Fir d'Bequemlechkeet kënnt Dir e Gangway addéieren deen eng Configuratiounsdatei fir kubectl generéiert, mat der Hëllef vun där mir an Kubernetes ënner eisem Benotzer kommen.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# Произвольное имя кластера
clusterName: "my-k8s"
# Где у нас 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"
# Теоритически сюда можно добавить groups которые мы замапили
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Имя клиента
clientID: "kubernetes"
# Секрет
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Если оставить дефолтное значние, то за имя пользователя будет братья <b>Frist name</b> <b>Second name</b>, а при "sub" его логин
usernameClaim: "sub"
# Доменное имя или IP адресс API сервера
apiServerURL: "https://192.168.99.111:8443"
# Включаем 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
# Если используем самоподписанный сертификат, то его(открытый корневой сертификат) надо указать.
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-----
Gesäit esou aus. Erlaabt Iech direkt d'Configuratiounsdatei erofzelueden an se mat enger Rei vu Kommandoen ze generéieren:
Source: will.com