Dit artikel is skreaun mei it doel om it al út te wreidzjen
Yn dit artikel sil ik jo fertelle hoe't jo ynstallearje en konfigurearje:
- keycloak is in iepen boarne projekt. Wat jout ien yngong punt foar applikaasjes. Wurket mei in protte protokollen, ynklusyf LDAP en OpenID, dy't fan belang binne foar ús.
- Keycloak poartewachter - in omkearde proxy-applikaasje wêrmei jo autorisaasje kinne yntegrearje fia Keycloak.
- Gangway - in applikaasje dy't in konfiguraasje genereart foar kubectl wêrmei jo kinne oanmelde fia OpenID en ferbine mei de Kubernetes API.
Hoe tagongsrjochten wurkje yn Kubernetes.
Wy kinne brûker / groep rjochten beheare mei help fan RBAC, in boskje artikels binne al makke oer dit, ik sil net dwaen op dit yn detail. It probleem is dat jo RBAC brûke kinne om brûkersrjochten te beheinen, mar Kubernetes wit neat oer brûkers. It docht bliken dat wy in meganisme foar levering fan brûkers nedich hawwe yn Kubernetes. Om dit te dwaan, sille wy in provider tafoegje oan Kuberntes OpenID, wat sil oanjaan dat sa'n brûker echt bestiet, en Kubernetes sels sil him rjochten jaan.
Tarieding fan
- Jo sille in Kubernetes-kluster of minikube nedich wêze
- Active Directory
- Domeinen:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Sertifikaat foar domeinen of sels ûndertekene sertifikaat
Ik sil net yn detail yngean oer hoe't jo in sels-ûndertekene sertifikaat kinne oanmeitsje; jo moatte 2 sertifikaten oanmeitsje, dit is de root (sertifikaasjeautoriteit) en de client-wildcard foar it *.example.org-domein
Neidat jo de sertifikaten ûntfange/skriuwe, moatte jo it kliïntsertifikaat tafoegje oan Kubernetes; om dit te dwaan, meitsje der in geheim foar:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Folgjende sille wy it brûke foar ús Ingress-controller
Keycloak Ynstallaasje
Ik besleat dat de maklikste manier wie om hjir kleare oplossingen foar te brûken, nammentlik helmkaarten.
Ynstallearje it repository en aktualisearje it:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Meitsje in keycloak.yml-bestân mei de folgjende ynhâld:
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
Federaasje opset
Gean dan nei de webynterface
Klikje yn 'e linker hoeke Foegje ryk ta
Kaai
Wearde
namme
kubernetes
NAME OF TRANSLATORS
Kubernetes
Skeakelje kontrôle fan e-postbefêstiging fan brûkers út:
Klantbereiken -> E-post -> Mappers -> E-post ferifiearre (wiskje)
Wy sette in federaasje op om brûkers te ymportearjen fan ActiveDirectory, ik sil screenshots hjirûnder litte, ik tink dat it dúdliker sil wêze.
Brûkersfederaasje -> Provider tafoegje ... -> ldap
Federaasje opset
As alles goed is, dan nei it drukken op de knop Syngronisearje alle brûkers Jo sille in berjocht sjen dat de suksesfolle ymport fan brûkers oanjout.
Dêrnei moatte wy ús groepen yn kaart bringe
Brûkersfederaasje -> ldap_localhost -> Mappers -> Meitsje
It meitsjen fan in mapper
Client opset
Jo moatte in klant oanmeitsje, yn termen fan Keycloak is dit in applikaasje dy't der troch sil wurde autorisearre. Ik sil wichtige punten yn read markearje yn 'e skermprint.
Klanten -> Meitsje
Client opset
Litte wy in scoupe meitsje foar groepen:
Client Scopes -> Create
It meitsjen fan in omfang
En set in mapper foar har op:
Client Scopes -> groepen -> Mappers -> Create
Mapper
Wy foegje mapping fan ús groepen ta oan Standert Client Scopes:
Clients -> kubernetes -> Client Scopes -> Standert Client Scopes
Kies groepen в Beskikbere Client Scopes, drukke Taheakje selektearre
Wy krije it geheim (en skriuwe it earne op) dat wy sille brûke foar autorisaasje yn Keycloak:
Klanten -> kubernetes -> Credentials -> Geheim
Dit foltôget de opset, mar ik hie in flater doe't ik, nei suksesfolle autorisaasje, in 403-flater krige.
Meitsje:
Client Scopes -> rollen -> Mappers -> Create
Mappers
Skript koade
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Kubernetes konfigurearje
Wy moatte oanjaan wêr't ús root-sertifikaat fan 'e side leit, en wêr't de OIDC-provider sit.
Om dit te dwaan, bewurkje de triem /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 yn it kluster:
kubeadm konfiguraasje
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 ynstelle
Om jo webapplikaasje te beskermjen, kinne jo keycloak-poartewachter brûke. Neist it feit dat dizze omkearde proxy de brûker autorisearje sil foardat de side werjûn wurdt, sil it ek ynformaasje oer jo stjoere yn 'e kopteksten nei de einapplikaasje. Dus, as jo applikaasje OpenID stipet, wurdt de brûker fuortendaliks autorisearre. Litte wy nei it foarbyld fan Kubernetes Dashboard sjen
Ynstallaasje fan 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'
Tagongsrjochten ynstelle:
Litte wy in ClusterRoleBinding oanmeitsje dy't klusteradminrjochten sil jaan (standert ClusterRole cluster-admin) foar brûkers yn 'e DataOPS-groep.
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
Ynstallearje keycloak poartewachter:
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"
Dêrnei, as jo besykje oan te melden by
Gangway ynstallaasje
Foar gemak kinne jo in gangway tafoegje dy't in konfiguraasjetriem sil generearje foar kubectl, mei help wêrfan wy yn Kubernetes komme ûnder ús brûker.
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-----
It sjocht der sa út. Hjirmei kinne jo fuortendaliks in konfiguraasjetriem downloade en generearje mei in set kommando's:
Boarne: www.habr.com