Questo articolo è stato scritto per espandere il già
In questo articolo ti dirò come installare e configurare:
- Mantello delle chiavi è un progetto open source. Che fornisce un unico punto di ingresso per le applicazioni. Funziona con molti protocolli, inclusi LDAP e OpenID a cui siamo interessati.
- custode del portachiavi - applicazione di proxy inverso che consente di integrare l'autorizzazione tramite Keycloak.
- Passerella - un'applicazione che genera una configurazione per kubectl con la quale è possibile accedere e connettersi all'API Kubernetes tramite OpenID.
Come funzionano le autorizzazioni in Kubernetes.
Possiamo gestire i diritti utente / gruppo utilizzando RBAC, sono già stati creati molti articoli su questo, non mi soffermerò su questo in dettaglio. Il problema è che puoi utilizzare RBAC per limitare i diritti degli utenti, ma Kubernetes non sa nulla degli utenti. Si scopre che abbiamo bisogno di un meccanismo di consegna degli utenti in Kubernetes. Per fare ciò, aggiungeremo un provider a Kuberntes OpenID, che dirà che tale utente esiste davvero e Kubernetes stesso gli darà i diritti.
Formazione
- Avrai bisogno di un cluster Kubernetes o minikube
- Active Directory
- Domini:
keycloak.esempio.org
kubernetes-dashboard.example.org
gangway.example.org - Certificato per domini o certificato autofirmato
Non mi soffermerò su come creare un certificato autofirmato, è necessario creare 2 certificati, questo è il client root (Certificate Authority) e jolly per il dominio *.example.org
Dopo aver ricevuto / emesso certificati, il client deve essere aggiunto a Kubernetes, per questo creiamo un segreto per esso:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Successivamente, lo useremo per il nostro controller Ingress.
Installazione del portachiavi
Ho deciso che il modo più semplice è utilizzare soluzioni già pronte per questo, vale a dire i grafici del timone.
Installa il repository e aggiornalo:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Crea un file keycloak.yml con il seguente contenuto:
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
Configurazione della federazione
Quindi, vai all'interfaccia web
Fare clic nell'angolo sinistro Aggiungi regno
Le
Valore
Nome
kubernetes
Display Nome
kubernetes
Disabilita la verifica dell'e-mail dell'utente:
Ambiti client —> Email —> Mapper —> Email verificata (Elimina)
Abbiamo impostato la federazione per importare gli utenti da ActiveDirectory, lascerò gli screenshot di seguito, penso che sarà più chiaro.
Federazione utenti —> Aggiungi provider… —> ldap
Configurazione della federazione
Se tutto va bene, dopo aver premuto il pulsante Sincronizza tutti gli utenti vedrai un messaggio sull'avvenuta importazione degli utenti.
Successivamente dobbiamo mappare i nostri gruppi
Federazione utenti --> ldap_localhost --> Mappatori --> Crea
Creazione di un mappatore
Configurazione del cliente
È necessario creare un client, in termini di Keycloak, questa è un'applicazione che sarà autorizzata da lui. Metterò in evidenza i punti importanti nello screenshot in rosso.
Clienti —> Crea
Configurazione del cliente
Creiamo scoupe per i gruppi:
Ambiti client —> Crea
Crea ambito
E imposta un mappatore per loro:
Ambiti client —> gruppi —> Mapper —> Crea
Mappatore
Aggiungi la mappatura dei nostri gruppi agli ambiti client predefiniti:
Clienti —> kubernetes —> Ambiti client —> Ambiti client predefiniti
selezionare gruppi в Ambiti client disponibili, stampa Aggiungi selezionato
Otteniamo il segreto (e lo scriviamo nel thread) che useremo per l'autorizzazione in Keycloak:
Clienti —> kubernetes —> Credenziali —> Segreto
Questo completa la configurazione, ma ho avuto un errore quando, dopo l'autorizzazione con successo, ho ricevuto un errore 403.
Aggiustare:
Ambiti client —> ruoli —> Mapper —> Crea
Mapper
Codice dello script
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Configurazione di Kubernetes
Dobbiamo specificare dove si trova il nostro certificato radice dal sito e dove si trova il provider OIDC.
Per fare ciò, modifica il 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
...
Aggiorna la configurazione di kubeadm nel 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
...
Impostazione del proxy di autenticazione
Puoi utilizzare keycloak gatekeeper per proteggere la tua applicazione web. Oltre al fatto che questo proxy inverso autorizzerà l'utente prima di mostrare la pagina, passerà anche informazioni su di te all'applicazione finale nelle intestazioni. Pertanto, se la tua applicazione supporta OpenID, l'utente viene immediatamente autorizzato. Considera l'esempio di Kubernetes Dashboard
Installazione di Kubernetes Dashboard
helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml
valori_dashboard.yaml
enableInsecureLogin: true
service:
externalPort: 80
rbac:
clusterAdminRole: true
create: true
serviceAccount:
create: true
name: 'dashboard-test'
Impostazione dei diritti di accesso:
Creiamo un ClusterRoleBinding che conferirà i diritti di amministratore del cluster (amministratore del cluster ClusterRole standard) per gli utenti nel gruppo 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
Installa 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
valori_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"
Dopodiché, quando provi ad andare a
installazione passerella
Per comodità, puoi aggiungere una passerella che genererà un file di configurazione per kubectl, con l'aiuto del quale entreremo in Kubernetes sotto il nostro utente.
helm install --name gangway stable/gangway -f values_gangway.yaml
valori_passerella.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-----
Somiglia a questo. Consente di scaricare immediatamente il file di configurazione e generarlo utilizzando una serie di comandi:
Fonte: habr.com