Käesolev artikkel on kirjutatud selleks, et laiendada juba , kuid räägib eriliselt Microsoft ActiveDirectory sidumise omadustest ning täiendab seda.
Selles artiklis räägin sellest, kuidas installida ja seadistada:
- Keycloak — see on avatud lähtekoodiga projekt, mis pakub rakendustele ühte sisenemispunkte. See töötab paljude protokollidega, sealhulgas LDAP ja OpenID, mis meid huvitavad.
- Keycloak gatekeeper — pöördpoksi rakendus, mis võimaldab integreerida autoriseerimist läbi Keycloak.
- Gangway — rakendus, mis genereerib konfiguratsiooni kubectl için, mille abil saab OpenID kaudu autoriseerida ja ühenduda Kubernetes API-ga.
Kuidas õigused Kuberneteses töötavad.
Kasutaja-/gruppide õiguste haldamiseks saame kasutada RBAC-i, selle kohta on juba palju artikleid kirjutatud, seega ei jää ma sellele pikemalt pidama. Probleem on selles, et saate RBAC-i kasutada, et piirata kasutaja õigusi, kuid Kubernetes ei tea kasutajatest midagi. Seetõttu on vajalik mehhanism, mis toob kasutaja Kubernetesesse. Selleks lisame Kuberntesesse OpenID pakkuja, mis kinnitab, et selline kasutaja tõepoolest eksisteerib, ja õigused annab juba Kubernetes ise.
Ettevalmistus
- Teil on vaja Kubernetes klastrit või minikube'i
- Active Directory
- Domeenid:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Domeenide sertifikaat või isehallatav sertifikaat
Ma ei jää detailsemalt peatuma isehallatavate sertifikaatide loomisel, on vaja luua 2 sertifikaati: juures sertifikaat (sertifitseerimiskeskus) ja wildcard-sertifikaat domeeni *.example.org jaoks.
Pärast seda, kui olete sertifikaadid saanud/väljastanud, peate klientsertifikaadi lisama Kubernetesesse, selleks loome selle jaoks salajase võtme:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pemJärgnevalt kasutame seda meie Ingress kontrolleris.
Keycloak'i paigaldamine
Otsustasin, et kõige lihtsam on kasutada selleks valmis lahendusi, nimelt helm chart'e.
Lisame repository ja uuendame selle:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo updateLoome faili keycloak.yml järgmise sisuga:
keycloak.yml
keycloak:
# Administraatori nimi
username: "test_admin"
# Administraatori parool
password: "admin"
# Need lipud on vajalikud, et lubada skriptide laadimist Keycloaki kaudu veebiliidese.
See on vajalik ühe vea parandamiseks, millest allpool.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Lubame ingress'i, määrame hosti nime ja tunnistuse, mille oleme eelnevalt salvestanud secrets'i
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 vajab oma tööks andmebaasi. Testimise eesmärgil seadistan PostgreSQL'i otse Kuberntes's, aga tootmises on see parem mitte teha!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: trueFöderatsiooni seadistamine
Seejärel siseneme veebiliidesesse
Vasakus nurgas klõpsame Lisa realm
Avaõigus
Väärtus
Nimi
kubernetes
Kuva nimi
Kubernetes
Keenuse kasutaja e-posti kinnitamise kontrollimine:
Kliendi ulatused —> E-post —> Mappijad —> E-post kinnitatud (Kustuta)
Seame üles föderatsiooni kasutajate importimiseks ActiveDirectory'ist, jätan allapoole ekraanipildid, mõtlen, et nii on arusaadavam.
Kasutaja föderatsioon —> Lisa pakkuja… —> ldap
Föderatsiooni seadistamine

Kui kõik on korras, siis pärast nupu vajutamist Sünkroniseeri kõik kasutajad näete kasutajate eduka importimise teadet.
Järgmiseks tuleb meie rühmad mingite seostega sobitada
Kasutaja föderatsioon —> ldap_localhost —> Mappijad —> Loo
Mappi loomine
Kliendi seadistus
Peame looma kliendi, Keycloak'i mõistes on see rakendus, mis kinnitust saab. Olulised punktid toon välja ekraanipildil punasega.
Kliendid —> Loo
Kliendi seadistus
Loo rühmade ulatus:
Kliendi ulatused —> Loo
Ulatused loomine
Ja seadistame kaardisti nende jaoks:
Kliendi ulatused —> groups —> Mappijad —> Loo
Mappi
Lisame meie rühmade sidumise Default Client Scopes-i:
Kliendid —> kubernetes —> Kliendi ulatused —> Default Client Scopes
Valime groups ühes Saadaval kliendi ulatused, klikkige Lisa valitud
Saame salajase (ja salvestame selle kuhugile), mida kasutame autoriseerimiseks Keycloak'is:
Kliendid —> kubernetes —> Krediteerimised —> Salajane
Sellega on seadistamine lõppenud, kuid mul tekkis viga, kui pärast eduka autoriseerimist sain 403 vea. .
Parandus:
Kliendi ulatused —> roles —> Mappijad —> 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();
Kubernetesi seadistamine
Peame näitama, kus asub meie saidi juursertifikaat 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 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
...
auth-proxy seadistamine
Teie veebirakenduse kaitsmiseks saab kasutada keycloak gatekeeperit. Lisaks sellele, et see pöördtöötleja autoriseerib kasutaja enne lehe kuvamist, edastab ta ka lõpprakendusele teavet teie kohta päistes. Kui teie rakendus toetab OpenID-d, autoriseeritakse kasutaja kohe. Vaatame näidet Kubernetes Dashboardist.
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'
Ligipääsuõiguste seadistamine:
Loome ClusterRoleBinding, mis annab administraatori õigused klastrile (standardne ClusterRole cluster-admin) DataOPS rühma kuuluvatele kasutajatele.
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 proovime siseneda , toimuvad suunamised Keycloaki ja eduka autentimise korral pääseme juba sisselogitud Dashboardi.
Gangway installimine
Mugavuse huvides võime lisada gangway, mis genereerib kubectl jaoks konfiguraafili, mille abil pääseme juba oma kasutajana Kubernetesesse.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# Klasteri eraldi 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"
# Teoreetiliselt saab siia lisada rühmad, mida oleme kaardistanud
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Klientnimi
clientID: "kubernetes"
# Salasõna
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Kui jätta vaikimisi väärtus, siis võetakse kasutajanimi <b>Eesnimi</b> <b>Perekonnanimi</b>, ja "sub" oma sisselogimise
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 enesetestitud sertifikaati, tuleb selle (avatud juursertifikaadi) 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 selline välja. Lubab nii koheselt alla laadida konfiguraafili kui ka genereerida selle käskude komplekti abil:

Allikas: habr.com
