Integrerer ActiveDirectory-godkendelse med Kubernetes ved hjælp af Keycloak

Denne artikel er skrevet med det formål at udvide den eksisterende eksisterende, men den beskriver særegenhederne ved integrationen med Microsoft ActiveDirectory, samt supplerer den.

I denne artikel vil jeg forklare, hvordan man installerer og konfigurerer:

  • Keycloak — et projekt med åben kildekode, der giver en enkelt indgang til applikationer. Det fungerer med mange protokoller, herunder LDAP og OpenID, som vi er interesseret i.
  • Keycloak gatekeeper — en reverse proxy-applikation, der muliggør integration af autorisation via Keycloak.
  • Gangway — en applikation, der genererer konfigurationsfiler til kubectl, som gør det muligt at logge ind via OpenID og tilsluttes Kubernetes API.

Hvordan rettigheder fungerer i Kubernetes.

Vi kan styre bruger-/gruppeadgang ved hjælp af RBAC, der er allerede skrevet mange artikler om det, så jeg vil ikke uddybe dette nærmere. Problemet er, at selvom du bruger RBAC til at begrænse brugerrettigheder, ved Kubernetes ikke noget om brugerne. Det viser sig, at der er behov for en mekanisme til at bringe brugeren ind i Kubernetes. Til dette vil vi tilføje en OpenID-udbyder til Kubernetes, som vil bekræfte, at en sådan bruger faktisk eksisterer, mens Kubernetes selv vil tildele rettighederne.

Forberedelse

  • Du skal bruge et Kubernetes-kluster eller minikube
  • Active Directory
  • Domæner:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certifikat til domænerne eller et selvsigneret certifikat

Jeg vil ikke gå ind i detaljerne om, hvordan man opretter selvsignerede certifikater, men det er nødvendigt at oprette 2 certifikater; et rodcertifikat (Certificeringsmyndighed) og et wildcard-klientcertifikat for domænet *.example.org

Når du har modtaget/udstedt certifikaterne, skal klientcertifikatet tilføjes til Kubernetes, så vi opretter et secret til det:

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

Derefter vil vi bruge det til vores Ingress-controller

Installation af Keycloak

Jeg besluttede, at det ville være nemmest at bruge eksisterende løsninger, nemlig helm charts.

Tilføj repositories og opdater det:

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

Opret en fil keycloak.yml med følgende indhold:

keycloak.yml

keycloak:
  # Administrator navn
  username: "test_admin"
  # Administrator kodeord
  password: "admin"
  # Disse flags er nødvendige for at tillade upload af scripts direkte gennem Keycloak’s webgrænseflade. Dette vil være nødvendigt for at løse en fejl omtalt nedenfor.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
  # Aktiverer ingress, angiver værtsnavn og certifikat, som vi har gemt i 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 kræver en database for at fungere, til testformål vil jeg implementere Postgresql direkte i Kubernetes, men det er ikke anbefalet i produktion!
  persistence:
    deployPostgres: true
    dbVendor: postgres

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

Konfiguration af federation

Derefter går vi ind i webgrænsefladen keycloak.example.org

Klik i nederste venstre hjørne Tilføj realm

Nøgle
Værdi

Navn
kubernetes

Visningsnavn
Kubernetes

Deaktiverer bekræftelse af brugerens email:
Client scopes —> Email —> Mappers —> Email verified (Slet)

Vi konfigurerer federation til import af brugere fra Active Directory, jeg vil vedlægge screenshots nedenfor, så det er lettere at forstå.

User federation —> Tilføj udbyder… —> ldap

Konfiguration af federationIntegrerer ActiveDirectory-godkendelse med Kubernetes ved hjælp af Keycloak
Integrerer ActiveDirectory-godkendelse med Kubernetes ved hjælp af Keycloak

Hvis alt er i orden, vil du efter at have klikket på knappen Synkroniser alle brugere se en meddelelse om vellykket import af brugere.

Derefter skal vi mappe vores grupper

User federation —> ldap_localhost —> Mappers —> Opret

Oprettelse af mapperIntegrerer ActiveDirectory-godkendelse med Kubernetes ved hjælp af Keycloak

Klientkonfiguration

Vi skal oprette en klient, i Keycloak’s termer er dette en applikation, der vil autentificere sig. Vigtige punkter er markeret på screenshotet med rødt.

Clients —> Opret

KlientkonfigurationIntegrerer ActiveDirectory-godkendelse med Kubernetes ved hjælp af Keycloak

Lad os oprette et scope for grupper:

Client Scopes —> Opret

Oprettelse af scopeIntegrerer ActiveDirectory-godkendelse med Kubernetes ved hjælp af Keycloak

Og vi konfigurerer mapper til dem:

Client Scopes —> groups —> Mappers —> Opret

MapperIntegrerer ActiveDirectory-godkendelse med Kubernetes ved hjælp af Keycloak

Vi tilføjer mapping af vores grupper til Default Client Scopes:

Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Vi vælger groups i Tilgængelige Client Scopes, klik på Tilføj valgte

Vi får en secret (og noterer det et sted), som vi vil bruge til autentificering i Keycloak:

Clients —> kubernetes —> Credentials —> Secret
Dette afslutter konfigurationen, men jeg oplevede en fejl, hvor jeg fik en 403-fejl efter en vellykket autentificering. Fejlrapport.

Fix:

Client Scopes —> roles —> Mappers —> Opret

MapperIntegrerer ActiveDirectory-godkendelse med Kubernetes ved hjælp af Keycloak

Script kode

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

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

Kubernetes konfiguration

Vi skal angive, hvor vores rod-certifikat fra webstedet ligger, og hvor OIDC-udbyderen befinder sig.
For at gøre dette redigerer vi filen /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
...

Opdaterer kubeadm-konfiguration i klyngen:

kubeadm config

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

Konfiguration af auth-proxy

For at beskytte din webapplikation kan du bruge Keycloak Gatekeeper. Udover at denne omvendte proxy vil autentificere brugeren, før siden vises, vil den også sende information om dig til den endelige applikation i overskrifterne. Dermed, hvis din applikation understøtter OpenID, vil brugeren blive autentificeret med det samme. Lad os tage Kubernetes Dashboard som eksempel.

Installation af 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'

Konfiguration af adgangsrettigheder:

Vi opretter et ClusterRoleBinding, som giver admin-rettigheder til klyngen (standard ClusterRole cluster-admin) for brugere, der er medlem af DataOPS-gruppen.


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

Installation af 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"

Efter dette, når du forsøger at tilgå kubernetes-dashboard.example.org, sker der en omdirigering til Keycloak, og efter en succesfuld godkendelse vil vi få adgang til Dashboard som allerede indlogget.

Installation af Gangway

For nemheds skyld kan vi tilføje Gangway, som vil generere en konfiguraitonsfil til kubectl, hvormed vi under vores bruger kan få adgang til Kubernetes.


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

values_gangway.yaml


gangway:
  # Valgfrit cluster navn
  clusterName: "my-k8s"
  # Hvor vi har OIDC udbyderen
  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"
  # Teoretisk set kan vi her tilføje grupper, som vi har mappet
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Klientnavn
  clientID: "kubernetes"
  # Hemmelighed
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Hvis standardværdien efterlades, så vil brugernavnet blive hentet ud fra <b>Fornavn</b> <b>Efternavn</b>, og ved "sub" bliver hans login
  usernameClaim: "sub"
  # Domænenavn eller IP-adresse på API-serveren
  apiServerURL: "https://192.168.99.111:8443"

# Aktiverer 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

# Hvis vi bruger et selvsigneret certifikat, skal det (det åbne rodcertifikat) angives.
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-----

Ser cirka sådan ud. Muliggør både at downloade konfigurationsfilen med det samme samt at generere den ved hjælp af et sæt kommandoer:

Integrerer ActiveDirectory-godkendelse med Kubernetes ved hjælp af Keycloak

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster