See artikkel on kirjutatud eesmärgiga laiendada juba , kuid räägib täpselt Microsoft Active Directory sidumise omadustest ja täiendab seda.
Selles artiklis räägin, kuidas installida ja seadistada:
- Keycloak on avatud lähtekoodiga projekt, mis tagab ühe sisselogimispunkti rakendustele. Töötab paljude protokollidega, sealhulgas LDAP ja OpenID, mis meid huvitavad.
- Keycloak gatekeeper on pöördproksi rakendus, mis võimaldab integreerida autolasutuse läbi Keycloak.
- Gangway on rakendus, mis genereerib kubectl-i konfi, mille abil saab OpenID kaudu autolasuda ja Kubernetes API-le ühenduda.
Kuidas töötavad õigused Kuberneteses.
Kasutaja/gruppide õigusi saame hallata RBAC-iga, mille kohta on kirjutatud juba palju artikleid, seega ei hakka ma sel teemal pikalt peatuma. Probleem seisneb selles, et saate RBAC-i kasutada kasutaja õiguste piiramiseks, kuid Kubernetes ei tunne kasutajaid. Seega on vajalik mehhanism, mis toob kasutaja Kubernetesesse. Selleks lisame Kubernetesesse OpenID pakkuja, mis tõendab, et antud kasutaja tõeliselt eksisteerib, ja õigused annab Kubernetes ise.
Ettevalmistus
- Vajate Kubernetes klastrit või minikube'i
- Active Directory
- Domeenid:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Domeenide sertifikaat või isekohandatud sertifikaat
Ei hakka detailselt seletama, kuidas luua isekohandatud sertifikaate, tuleb luua kaks sertifikaati, nimelt juuresoleku (sertifitseerimiskeskus) ja wildcard klientserdiaat domeeni *.example.org jaoks
Pärast sertifikaatide saamist/väljastamist peate kliendisertifikaadi lisama Kubernetesesse, selleks loome talle salajase:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pemEdasi kasutame seda meie ingressi kontrolleris
Keycloaki paigaldamine
Otsustasin, et kõige lihtsam on kasutada valmis lahendusi, nimelt helm chart'e.
Paigaldame repositooriumi ja uuendame seda:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo updateLoome faili keycloak.yml järgmise sisuga:
keycloak.yml
keycloak:
# Admini nime
username: "test_admin"
# Admini parool
password: "admin"
# Need flags to allow uploading scripts directly through the Keycloak web interface. This will be
necessary to fix a bug mentioned below.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Enable ingress, specify the hostname and the certificate that we have previously saved in 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 requires a database for operation, for testing purposes I deploy Postgresql directly in Kubernetes, which is not advisable in production!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: trueFöderatsiooni seadistamine
Seejärgmiseks logime veebiliidese.
Vasakus nurgas vajutame. Lisa realm
Ava
Väärtus
Nimi
kubernetes
Kuvamise nimi
Kubernetes
Kustutame kasutaja e-kirja kinnituse kontrolli:
Client scopes —> Email —> Mappers —> Email verified (Kustuta)
Seame üles föderatsiooni kasutajate importimiseks Active Directory-st, lisaks jätan alla ekraanipildid, nii on arusaadavam.
User federation —> Lisa pakkuja… —> ldap
Föderatsiooni seadistamine

Kui kõik läheb hästi, siis pärast nuppu vajutamist Synchronize all users näete te edukat kasutajate importimise teadet.
Seejärel peame meie rühmad kaardistama.
User federation —> ldap_localhost —> Mappers —> Loo
Kaardistaja loomine
Kliendi seadistamine
Peame looma kliendi, mis Keycloakis tähendab rakendust, mis selle kaudu autoriseerib. Tõstan olulisused punasega ekraanipildil esile.
Clients —> Loo
Kliendi seadistamine
Loome rühmade jaoks scoupe:
Client Scopes —> Loo
Scoupe loomine
Ja seadistame nende jaoks mappimise:
Client Scopes —> groups —> Mappers —> Loo
Kaardistaja
Lisame meie rühmade kaardistamise Default Client Scopes:
Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Valime groups ja Saadaval kliendi scoperid, klõpsake Lisa valitud
Saame salajase (ja salvestame selle kuhugi), mida me kasutame Keycloakis autoriseerimiseks:
Clients —> kubernetes —> Credentials —> Secret
Selle seadistamine on lõpetatud, kuid mul oli probleem, kuna pärast eduka autoriseerimise sain 403 vea. .
Parandus:
Client Scopes —> roles —> Mappers —> Loo
Mapper
Skripti kood
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Kubernetes'e seadistamine
Peame määrama, kus asub meie šifreeritud sertifikaat saidilt ja kus asub OIDC pakkuja.
Selleks redigeerime faili \/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
...
Uuendame kubeadm konfiguratsiooni klastris:
kubeadm konfig
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 seadistamine
Teie veebirakenduse kaitsmiseks saate kasutada Keycloak Gatekeeperi. Lisaks sellele, et see pöördproksi autoriseerib kasutaja enne lehe kuvamist, edastab ta ka lõpp-rakendusele teavet teie kohta päistes. Seega, kui teie rakendus toetab OpenID-d, autoriseeritakse kasutaja kohe. Vaatame näiteks Kubernetes Dashboardi.
Kubernetes Dashboardi installimine
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'
Omandiõiguste seadistamine:
Loome ClusterRoleBinding'i, mis annab klastrihalduri õigused (standardsed ClusterRole cluster-admin) kasutajatele, kes kuuluvad DataOPS rühma.
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
Keycloak Gatekeeperi installimine:
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"
Pärast seda, kui proovite siseneda , suunatakse teid Keycloak'i ja pärast eduka autoriseerimisega pääsete juba logitud Dashboardi.
Gangway installimine
Mugavuse huvides võite lisada Gangway'i, mis genereerib konfiguratsioonifaili kubectl jaoks, mille abil pääseme oma kasutajana Kubernetesesse.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# Klastri suvalnimi nimi
clusterName: "my-k8s"
# Meie OIDC pakkuja
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"
# Siia saab teoreetiliselt lisada grupid, mille oleme kaardistanud
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Kliendi nimi
clientID: "kubernetes"
# Saladus
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Kui jätta vaikimisi väärtus, kasutatakse kasutajanime määramiseks <b>Eesnimi</b> <b>Perenimi</b>, ja "sub" tema sisenimiseks
usernameClaim: "sub"
# API serveri domeeninimi või IP-aadress
apiServerURL: "https://192.168.99.111:8443"
# Lülitame sisse 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
# Kui kasutame iseeneslikku sertifikaati, siis tuleb selle (avatud juure sertifikaadi) näidata.
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-----
Näeb umbes välja selline. Lubab nii kohe allalaadida konfiguratsioonifaili kui ka selle genereerida kasutades käske:

Allikas: habr.com
