Ang artikulong ito ay isinulat upang palawakin ang na
Sa artikulong ito sasabihin ko sa iyo kung paano i-install at i-configure:
- keycloak ay isang open source na proyekto. Na nagbibigay ng isang punto ng pagpasok para sa mga aplikasyon. Gumagana sa maraming protocol, kabilang ang LDAP at OpenID kung saan kami interesado.
- tagabantay ng keycloak - reverse proxy application na nagbibigay-daan sa iyo upang isama ang pahintulot sa pamamagitan ng Keycloak.
- Gangways - isang application na bumubuo ng config para sa kubectl kung saan maaari kang mag-log in at kumonekta sa Kubernetes API sa pamamagitan ng OpenID.
Paano gumagana ang mga pahintulot sa Kubernetes.
Maaari naming pamahalaan ang mga karapatan ng gumagamit / pangkat gamit ang RBAC, isang bungkos ng mga artikulo ang nalikha na tungkol dito, hindi ko ito tatalakayin nang detalyado. Ang problema ay maaari mong gamitin ang RBAC upang paghigpitan ang mga karapatan ng user, ngunit walang alam ang Kubernetes tungkol sa mga user. Lumalabas na kailangan namin ng mekanismo ng paghahatid ng user sa Kubernetes. Para magawa ito, magdaragdag kami ng provider sa Kuberntes OpenID, na magsasabi na talagang umiiral ang naturang user, at ang Kubernetes mismo ang magbibigay sa kanya ng mga karapatan.
Pagsasanay
- Kakailanganin mo ng Kubernetes cluster o minikube
- Active Directory
- Mga domain:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Certificate para sa mga domain o self-signed certificate
Hindi ako magtatagal kung paano gumawa ng self-signed certificate, kailangan mong gumawa ng 2 certificate, ito ang root (Certificate Authority) at ang wildcard client para sa *.example.org na domain
Pagkatapos mong makatanggap / mag-isyu ng mga sertipiko, ang kliyente ay dapat idagdag sa Kubernetes, para dito lumikha kami ng isang lihim para dito:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Susunod, gagamitin namin ito para sa aming Ingress controller.
Pag-install ng Keycloak
Napagpasyahan ko na ang pinakamadaling paraan ay ang paggamit ng mga handa na solusyon para dito, katulad ng mga chart ng timon.
I-install ang repositoryo at i-update ito:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Lumikha ng keycloak.yml file na may sumusunod na nilalaman:
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
Pag-setup ng Federation
Susunod, pumunta sa web interface
Mag-click sa kaliwang sulok Magdagdag ng kaharian
Key
halaga
Pangalan
Kubernetes
Display Name
Kubernetes
Huwag paganahin ang pag-verify ng email ng user:
Mga saklaw ng kliyente β> Email β> Mga Mapper β> Na-verify ang email (Tanggalin)
Nag-set up kami ng federation upang mag-import ng mga user mula sa ActiveDirectory, mag-iiwan ako ng mga screenshot sa ibaba, sa tingin ko ito ay magiging mas malinaw.
User federation β> Magdagdag ng provider... β> ldap
Pag-setup ng Federation
Kung maayos ang lahat, pagkatapos ay pagkatapos ng pagpindot sa pindutan I-synchronize ang lahat ng user makakakita ka ng mensahe tungkol sa matagumpay na pag-import ng mga user.
Susunod na kailangan naming i-map ang aming mga grupo
Pederasyon ng gumagamit --> ldap_localhost --> Mga Mapper --> Lumikha
Paglikha ng mapper
Setup ng kliyente
Ito ay kinakailangan upang lumikha ng isang kliyente, sa mga tuntunin ng Keycloak, ito ay isang application na papahintulutan mula sa kanya. I-highlight ko ang mga mahahalagang punto sa screenshot sa pula.
Mga Kliyente -> Lumikha
Setup ng kliyente
Gumawa tayo ng scoupe para sa mga grupo:
Mga Saklaw ng Kliyente β> Lumikha
Lumikha ng saklaw
At mag-set up ng mapper para sa kanila:
Mga Saklaw ng Kliyente β> mga pangkat β> Mga Mapper β> Lumikha
Mapper
Idagdag ang pagmamapa ng aming mga pangkat sa Default na Saklaw ng Kliyente:
Mga Kliyente β> kubernetes β> Mga Saklaw ng Kliyente β> Default na Saklaw ng Kliyente
piliin grupo Π² Magagamit na Saklaw ng Kliyentei-click Idagdag ang napili
Nakukuha namin ang lihim (at isulat ito sa thread) na gagamitin namin para sa awtorisasyon sa Keycloak:
Mga kliyente β> kubernetes β> Mga Kredensyal β> Lihim
Kinukumpleto nito ang pag-setup, ngunit nagkaroon ako ng error noong, pagkatapos ng matagumpay na awtorisasyon, nakatanggap ako ng error 403.
Ayusin:
Mga Saklaw ng Kliyente β> mga tungkulin β> Mga Mapper β> Lumikha
Mga Mapper
Code ng script
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Pag-configure ng Kubernetes
Kailangan naming tukuyin kung saan matatagpuan ang aming root certificate mula sa site, at kung saan matatagpuan ang OIDC provider.
Upang gawin ito, i-edit ang file /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
...
I-update ang kubeadm config sa 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
...
Pagtatakda ng auth-proxy
Maaari mong gamitin ang keycloak gatekeeper upang protektahan ang iyong web application. Bilang karagdagan sa katotohanan na ang reverse proxy na ito ay papahintulutan ang user bago ipakita ang page, ipapasa din nito ang impormasyon tungkol sa iyo sa end application sa mga header. Kaya, kung sinusuportahan ng iyong application ang OpenID, agad na pinahihintulutan ang user. Isaalang-alang ang halimbawa ng Kubernetes Dashboard
Pag-install ng 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'
Pagtatakda ng mga karapatan sa pag-access:
Gumawa tayo ng ClusterRoleBinding na magbibigay ng mga karapatan ng admin ng cluster (karaniwang ClusterRole cluster-admin) para sa mga user sa pangkat na 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
I-install ang 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"
Pagkatapos nito, kapag sinubukan mong pumunta sa
pag-install ng gangway
Para sa kaginhawahan, maaari kang magdagdag ng isang gangway na bubuo ng isang config file para sa kubectl, sa tulong kung saan kami ay makapasok sa Kubernetes sa ilalim ng aming user.
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-----
Parang ganito. Binibigyang-daan kang agad na i-download ang config file at buuin ito gamit ang isang hanay ng mga command:
Pinagmulan: www.habr.com