Dit artikel is geschreven om het al uit te breiden
In dit artikel zal ik je vertellen hoe je installeert en configureert:
- Sleutelmantel is een open source-project. Dat biedt een enkel toegangspunt voor applicaties. Werkt met veel protocollen, waaronder LDAP en OpenID waarin we geïnteresseerd zijn.
- sleutelmantel poortwachter - reverse proxy-applicatie waarmee u autorisatie via Keycloak kunt integreren.
- Loopplank - een applicatie die een configuratie genereert voor kubectl waarmee u kunt inloggen en verbinding kunt maken met de Kubernetes API via OpenID.
Hoe machtigingen werken in Kubernetes.
We kunnen gebruikers-/groepsrechten beheren met behulp van RBAC, hierover zijn al een aantal artikelen gemaakt, ik zal hier niet in detail op ingaan. Het probleem is dat je RBAC kunt gebruiken om gebruikersrechten te beperken, maar Kubernetes weet niets van gebruikers. Het blijkt dat we een gebruikersleveringsmechanisme nodig hebben in Kubernetes. Om dit te doen, zullen we een provider toevoegen aan Kuberntes OpenID, die zal zeggen dat zo'n gebruiker echt bestaat, en Kubernetes zelf zal hem de rechten geven.
Opleiding
- U hebt een Kubernetes-cluster of minikube nodig
- Active Directory
- Domeinen:
sleutelmantel.voorbeeld.org
kubernetes-dashboard.example.org
loopbrug.voorbeeld.org - Certificaat voor domeinen of zelfondertekend certificaat
Ik zal niet uitweiden over het maken van een zelfondertekend certificaat, u moet 2 certificaten maken, dit is de root- (Certificate Authority) en wildcard-client voor het *.example.org-domein
Nadat je certificaten hebt ontvangen/uitgegeven moet de client worden toegevoegd aan Kubernetes, hiervoor maken we een secret voor aan:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Vervolgens zullen we het gebruiken voor onze Ingress-controller.
Keycloak-installatie
Ik besloot dat de makkelijkste manier is om hiervoor kant-en-klare oplossingen te gebruiken, namelijk roerkaarten.
Installeer de repository en werk deze bij:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Maak een keycloak.yml-bestand met de volgende inhoud:
sleutelmantel.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
Federatie instellen
Ga vervolgens naar de webinterface
Klik in de linkerhoek Rijk toevoegen
sleutel
Waarde
Naam
kubernetes
Weergavenaam
Kubernetes
E-mailverificatie van gebruiker uitschakelen:
Clientbereiken —> E-mail —> Mappers —> E-mail geverifieerd (Verwijderen)
We hebben een federatie opgezet om gebruikers uit ActiveDirectory te importeren, ik zal hieronder screenshots achterlaten, ik denk dat het duidelijker zal zijn.
Gebruikersfederatie —> Provider toevoegen... —> ldap
Federatie instellen
Als het goed is, dan na het indrukken van de knop Synchroniseer alle gebruikers u ziet een bericht over de succesvolle import van gebruikers.
Vervolgens moeten we onze groepen in kaart brengen
Gebruikersfederatie --> ldap_localhost --> Mappers --> Maken
Een kaartenmaker maken
Cliënt instellen
Het is noodzakelijk om een klant aan te maken, in termen van Keycloak, dit is een applicatie die door hem wordt geautoriseerd. Ik zal de belangrijke punten in de schermafbeelding in rood markeren.
Klanten -> Maken
Cliënt instellen
Laten we een scoupe voor groepen maken:
Klantbereiken -> Maken
Bereik creëren
En stel een mapper voor ze in:
Clientbereiken —> groepen —> Mappers —> Maken
Mapper
Voeg de toewijzing van onze groepen toe aan de standaard klantbereiken:
Clients -> kubernetes -> Clientbereiken -> Standaard clientbereiken
kiezen groepen в Beschikbare klantbereiken, druk op Voeg geselecteerde toe
We krijgen het geheim (en schrijven het naar de thread) dat we zullen gebruiken voor autorisatie in Keycloak:
Clients —> kubernetes —> Inloggegevens —> Geheim
Hiermee is de installatie voltooid, maar ik kreeg een foutmelding toen ik na succesvolle autorisatie een fout 403 ontving.
Repareren:
Clientbereiken —> rollen —> Mappers —> Maken
Mapper
Scriptcode
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Kubernetes configureren
We moeten specificeren waar ons rootcertificaat van de site ligt en waar de OIDC-provider zich bevindt.
Bewerk hiervoor het bestand /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-configuratie in het 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
...
auth-proxy instellen
U kunt keycloak-gatekeeper gebruiken om uw webtoepassing te beschermen. Naast het feit dat deze reverse proxy de gebruiker autoriseert voordat de pagina wordt weergegeven, geeft het ook informatie over u door aan de eindtoepassing in de headers. Dus als uw applicatie OpenID ondersteunt, is de gebruiker direct geautoriseerd. Neem het voorbeeld van Kubernetes Dashboard
Kubernetes-dashboard installeren
helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml
waarden_dashboard.yaml
enableInsecureLogin: true
service:
externalPort: 80
rbac:
clusterAdminRole: true
create: true
serviceAccount:
create: true
name: 'dashboard-test'
Toegangsrechten instellen:
Laten we een ClusterRoleBinding maken die clusterbeheerdersrechten geeft (standaard ClusterRole clusterbeheerder) voor gebruikers in de 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
Keycloak-gatekeeper installeren:
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
waarden_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"
Daarna, wanneer u probeert te gaan naar
loopplank installatie
Voor het gemak kunt u een gangway toevoegen die een configuratiebestand voor kubectl genereert, met behulp waarvan we onder onze gebruiker in Kubernetes komen.
helm install --name gangway stable/gangway -f values_gangway.yaml
waarden_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-----
Het lijkt hierop. Hiermee kunt u het configuratiebestand onmiddellijk downloaden en genereren met behulp van een reeks opdrachten:
Bron: www.habr.com