Fissiamo l'autorizzazione di ActiveDirectory a Kubernetes utilizzando Keycloak

Questo articolo è stato scritto per espandere il già l'esistente, ma parla delle funzionalità del pacchetto con Microsoft ActiveDirectory e lo integra.

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 keycloak.esempio.org

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 federazioneFissiamo l'autorizzazione di ActiveDirectory a Kubernetes utilizzando Keycloak
Fissiamo l'autorizzazione di ActiveDirectory a Kubernetes utilizzando Keycloak

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 mappatoreFissiamo l'autorizzazione di ActiveDirectory a Kubernetes utilizzando Keycloak

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 clienteFissiamo l'autorizzazione di ActiveDirectory a Kubernetes utilizzando Keycloak

Creiamo scoupe per i gruppi:

Ambiti client —> Crea

Crea ambitoFissiamo l'autorizzazione di ActiveDirectory a Kubernetes utilizzando Keycloak

E imposta un mappatore per loro:

Ambiti client —> gruppi —> Mapper —> Crea

MappatoreFissiamo l'autorizzazione di ActiveDirectory a Kubernetes utilizzando Keycloak

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. Riportare un errore.

Aggiustare:

Ambiti client —> ruoli —> Mapper —> Crea

MapperFissiamo l'autorizzazione di ActiveDirectory a Kubernetes utilizzando Keycloak

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 kubernetes-dashboard.example.org, verremo reindirizzati su Keycloak e in caso di autorizzazione andata a buon fine arriveremo alla Dashboard già loggati.

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:

Fissiamo l'autorizzazione di ActiveDirectory a Kubernetes utilizzando Keycloak

Fonte: habr.com

Aggiungi un commento