Integrăm autorizarea ActiveDirectory în Kubernetes folosind Keycloak

Această articol este scris cu scopul de a extinde deja existența, dar povestește despre particularitățile legăturii cu Microsoft Active Directory, precum și o completează.

În acest articol voi descrie cum să instalezi și să configurezi:

  • Keycloak — este un proiect cu sursă deschisă. Care asigură un singur punct de acces pentru aplicații. Funcționează cu o multitudine de protocoale, inclusiv LDAP și OpenID, care ne interesează.
  • Keycloak gatekeeper — aplicație de reverse proxy care permite integrarea autorizării prin Keycloak.
  • Gangway — aplicația care generează configurații pentru kubectl, prin care se poate autoriza și conecta la API-ul Kubernetes folosind OpenID.

Cum funcționează drepturile în Kubernetes.

Putem gestiona drepturile utilizatorilor/grupurilor folosind RBAC, despre care s-au scris deja o mulțime de articole, nu mă voi opri asupra acestuia în detaliu. Problema este că, deși poți folosi RBAC pentru a restricționa drepturile utilizatorului, Kubernetes nu știe nimic despre utilizatori. Deci, avem nevoie de un mecanism pentru a aduce utilizatorul în Kubernetes. Pentru aceasta, vom adăuga un provider OpenID în Kubernetes care va confirma că utilizatorul respectiv există, iar Kubernetes îi va atribui drepturile.

Pregătire

  • Veți avea nevoie de un cluster Kubernetes sau minikube
  • Active Directory
  • Domenii:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certificat pentru domenii sau certificat auto-semnat

Nu voi detalia cum să creezi un certificat auto-semnat, trebuie să creezi 2 certificate: unul rădăcină (Centru de certificare) și unul wildcard pentru domeniul *.example.org

După ce obțineți / emiteți certificatele, cheia clientului trebuie adăugată în Kubernetes, pentru aceasta creăm un secret pentru el:

kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem

Apoi vom folosi acest secret pentru controlerul nostru Ingress

Instalarea Keycloak

Am decis că cel mai simplu este să folosesc soluții existente, adică helm charts.

Instalăm depozitul și-l actualizăm:

helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update

Creăm fișierul keycloak.yml cu următorul conținut:

keycloak.yml

keycloak:
  # Numele administratorului
  username: "test_admin"
  # Parola administrator
  password: "admin"
  # Aceste flag-uri sunt necesare pentru a permite încărcarea scripturilor în Keycloak direct prin interfața web. Este necesar pentru a remedia un bug menționat mai jos.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
  # Activăm ingress, specificăm numele gazdei și certificatul pe care l-am salvat anterior în secrete
  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 necesită o bază de date pentru funcționare, în scopuri de testare, desfășor Postgresql direct în Kubernetes, în producție nu este recomandat!
  persistence:
    deployPostgres: true
    dbVendor: postgres

postgresql:
  postgresUser: keycloak
  postgresPassword: ""
  postgresDatabase: keycloak
  persistence:
    enabled: true

Configurarea federației

Apoi intrăm în interfața web keycloak.example.org

În colțul stâng facem clic pe Adaugă domeniu

Cheie
Value

Name
kubernetes

Numele afișat
Kubernetes

Dezactivăm verificarea confirmării email-ului utilizatorului:
Client scopes —> Email —> Mappers —> Email verified (Șterge)

Configurăm federația pentru importul utilizatorilor din ActiveDirectory, voi adăuga mai jos capturi de ecran pentru a fi mai clar.

User federation —> Adaugă furnizor… —> ldap

Configurarea federațieiIntegrăm autorizarea ActiveDirectory în Kubernetes folosind Keycloak
Integrăm autorizarea ActiveDirectory în Kubernetes folosind Keycloak

Dacă totul este bine, după apăsarea butonului Sincronizați toți utilizatorii veți vedea un mesaj de import reușit al utilizatorilor.

Apoi trebuie să mapăm grupurile noastre

User federation —> ldap_localhost —> Mappers —> Creare

Crearea mapperuluiIntegrăm autorizarea ActiveDirectory în Kubernetes folosind Keycloak

Configurarea clientului

Trebuie să creăm un client, în concepția Keycloak acesta este aplicația care se va autentifica. Punctele importante vor fi evidențiate în captura de ecran cu roșu.

Clients —> Creare

Configurarea clientuluiIntegrăm autorizarea ActiveDirectory în Kubernetes folosind Keycloak

Să creăm un scoup pentru grupuri:

Client Scopes —> Creare

Crearea scoup-uluiIntegrăm autorizarea ActiveDirectory în Kubernetes folosind Keycloak

Și să configurăm mapperul pentru ele:

Client Scopes —> groups —> Mappers —> Creare

MapperIntegrăm autorizarea ActiveDirectory în Kubernetes folosind Keycloak

Adăugăm mapping-ul grupurilor noastre în Default Client Scopes:

Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Alegem groups în Available Client Scopes, dăm clic pe Adaugă selecționate

Primiți secretul (și îl notăm undeva) pe care îl vom folosi pentru autentificarea în Keycloak:

Clients —> kubernetes —> Credentials —> Secret
Aceasta încheie configurarea, dar am avut o eroare când, după autentificarea reușită, primeam eroarea 403. Raport de bug.

Fix:

Client Scopes —> roles —> Mappers —> Creare

MapperIntegrăm autorizarea ActiveDirectory în Kubernetes folosind Keycloak

Codul scriptului

// add current client-id to token audience
token.addAudience(token.getIssuedFor());

// return token issuer as dummy result assigned to iss again
token.getIssuer();

Kubernetes Setup

Trebuie să specificăm unde se află certificatul nostru rădăcină de la site, și unde se află furnizorul OIDC.
Pentru aceasta, edităm fișierul \/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
...

Actualizăm configurația kubeadm în cluster:

configurația kubeadm

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
...

Configurarea auth-proxy

Pentru a proteja aplicația dvs. web, puteți folosi keycloak gatekeeper. Pe lângă faptul că acest proxy invers va autoriza utilizatorul înainte de a arăta pagina, va transmite, de asemenea, aplicației finale informații despre dvs. în antete. Astfel, dacă aplicația dvs. acceptă OpenID, utilizatorul se va autentifica imediat. Să analizăm prin exemplul Kubernetes Dashboard.

Instalarea 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'

Configurarea drepturilor de acces:

Vom crea un ClusterRoleBinding care va oferi drepturi de administrator al cluster-ului (standard ClusterRole cluster-admin) utilizatorilor care fac parte din grupul 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

Instalarea 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"

După aceasta, încercând să accesați kubernetes-dashboard.example.org, va avea loc o redirecționare către Keycloak și, în cazul unei autentificări reușite, vom ajunge în Dashboard deja autentificat.

Instalarea gangway

Pentru comoditate, puteți adăuga gangway, care va genera un fișier de configurare pentru kubectl, prin care, cu utilizatorul nostru, vom accesa Kubernetes.


helm install --name gangway stable/gangway -f values_gangway.yaml

values_gangway.yaml


gangway:
  # Numele personalizat al cluster-ului
  clusterName: "my-k8s"
  # URL-ul provider-ului 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"
  # Teoretic, putem adăuga grupurile pe care le-am mapat
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Numele clientului
  clientID: "kubernetes"
  # Secretul
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Dacă lăsați valoarea implicită, se va folosi numele utilizatorului <b>Prenume</b> <b>Nume</b>, iar pentru "sub" este logarea lui
  usernameClaim: "sub"
  # Numele de domeniu sau adresa IP a serverului API
  apiServerURL: "https://192.168.99.111:8443"

# Activăm 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

# Dacă folosim un certificat auto-semnat, trebuie să specificăm certificatul (certificatul de rădăcină public)
 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-----

Asta arată cam așa. Permite atât descărcarea imediată a fișierului de configurare, cât și generarea lui folosind un set de comenzi:

Integrăm autorizarea ActiveDirectory în Kubernetes folosind Keycloak

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster