See artikkel on kirjutatud juba selle laiendamiseks
Selles artiklis räägin teile, kuidas installida ja konfigureerida:
- võtmesärk on avatud lähtekoodiga projekt. Mis pakub rakenduste jaoks ühtset sisenemispunkti. Töötab paljude protokollidega, sealhulgas LDAP ja OpenID, millest oleme huvitatud.
- võtmekepp väravavaht - pöördpuhverserveri rakendus, mis võimaldab teil Keycloaki kaudu autoriseerimist integreerida.
- Vahekäik - rakendus, mis genereerib kubectli konfiguratsiooni, millega saate sisse logida ja OpenID kaudu Kubernetes API-ga ühenduse luua.
Kuidas load Kubernetesis töötavad.
Kasutajate / rühmade õigusi saame hallata RBAC-i abil, selle kohta on juba hunnik artikleid loodud, ma ei hakka sellel üksikasjalikult peatuma. Probleem on selles, et kasutajaõiguste piiramiseks saab kasutada RBAC-i, kuid Kubernetes ei tea kasutajatest midagi. Selgub, et vajame Kubernetesis kasutajate edastamise mehhanismi. Selleks lisame Kuberntes OpenID-le pakkuja, kes ütleb, et selline kasutaja on tõesti olemas ja Kubernetes ise annab talle õigused.
Koolitus
- Teil on vaja Kubernetese klastrit või minikube
- Active Directory
- Domeenid:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Domeenide sertifikaat või iseallkirjastatud sertifikaat
Ma ei peatu iseallkirjastatud sertifikaadi loomisel, peate looma 2 sertifikaati, see on domeeni *.example.org juur (sertifitseerimisasutus) ja metamärgi klient
Pärast sertifikaatide saamist / väljastamist tuleb klient Kubernetesesse lisada, selleks loome selle jaoks saladuse:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Järgmisena kasutame seda meie Ingressi kontrolleri jaoks.
Võtmekatte paigaldamine
Otsustasin, et kõige lihtsam on selleks kasutada valmislahendusi, nimelt tüürikaarte.
Installige hoidla ja värskendage seda:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Looge järgmise sisuga fail keycloak.yml:
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
Föderatsiooni seadistamine
Järgmisena minge veebiliidesele
Klõpsake vasakus nurgas Lisa valdkond
Võti
Väärtus
Nimi
kubernetes
Näita Nimi
Kubernetes
Keela kasutaja e-posti kinnitamine:
Kliendi ulatused —> E-post —> Kaardistajad —> E-post kinnitatud (Kustuta)
Seadistasime föderatsiooni, et importida kasutajaid ActiveDirectoryst, jätan alla ekraanipildid, arvan, et see on selgem.
Kasutajate liit —> Lisa pakkuja… —> ldap
Föderatsiooni seadistamine
Kui kõik on korras, siis pärast nupule vajutamist Sünkroonige kõik kasutajad näete teadet kasutajate eduka impordi kohta.
Järgmiseks peame oma rühmad kaardistama
Kasutajate liitmine --> ldap_localhost --> Kaardistajad --> Loo
Kaardistaja loomine
Kliendi seadistamine
Peate looma kliendi, Keycloaki osas on see rakendus, mis volitatakse temalt. Toon ekraanipildil punasega esile olulised punktid.
Kliendid —> Loo
Kliendi seadistamine
Loome rühmade jaoks skaala:
Kliendi ulatused —> Loo
Loo ulatus
Ja koostage neile kaardistaja:
Kliendi ulatused —> grupid —> Kaardistajad —> Loo
Kaardistaja
Lisage meie rühmade vastendamine kliendi vaikeulatustele:
Kliendid —> kubernetes —> Kliendi ulatused —> Kliendi vaikeulatused
valima rühmade в Saadaolevad kliendi ulatusedklõps Lisa valitud
Saame saladuse (ja kirjutame selle lõime), mida kasutame Keycloakis autoriseerimiseks:
Kliendid —> kubernetes —> Mandaat —> Saladus
See lõpetab seadistamise, kuid mul tekkis viga, kui pärast edukat autoriseerimist sain veateate 403.
Paranda:
Kliendi ulatused —> rollid —> Kaardistajad —> Loo
Kaardistaja
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();
Kubernetese konfigureerimine
Peame täpsustama, kus asub meie saidi juursertifikaat ja kus asub OIDC pakkuja.
Selleks muutke 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
...
Värskendage kubeadmi konfiguratsiooni klastris:
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-puhverserveri seadistamine
Saate oma veebirakenduse kaitsmiseks kasutada võtmeklapi väravahoidjat. Lisaks sellele, et see pöördpuhverserver volitab kasutajat enne lehe näitamist, edastab see teie kohta teavet ka päistes olevale lõpprakendusele. Seega, kui teie rakendus toetab OpenID-d, antakse kasutajale kohe luba. Mõelge Kubernetese armatuurlaua näitele
Kubernetese armatuurlaua 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'
Juurdepääsuõiguste määramine:
Loome ClusterRoleBindingi, mis annab DataOPS-rühma kasutajatele klastri administraatori õigused (standardne ClusterRole cluster-admin).
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
Installige võtmekatte 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
väärtused_puhverserver.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 minna
käigutee paigaldamine
Mugavuse huvides saate lisada käigutee, mis genereerib kubectli jaoks konfiguratsioonifaili, mille abil jõuame oma kasutaja alla Kubernetesesse.
helm install --name gangway stable/gangway -f values_gangway.yaml
väärtused_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-----
Näeb välja selline. Võimaldab kohe alla laadida konfiguratsioonifaili ja genereerida selle käsukomplekti abil:
Allikas: www.habr.com