Vi kopplar ActiveDirectory-autentisering till Kubernetes med hjälp av Keycloak

Denna artikel är skriven för att utvidga den redan befintliga, men berättar om egenskaperna hos just integreringen med Microsoft ActiveDirectory, samt kompletterar den.

I denna artikel kommer jag att berätta hur man installerar och konfigurerar:

  • Keycloak — ett projekt med öppen källkod. Det erbjuder en enhetlig åtkomstpunkt för applikationer. Det fungerar med många protokoll, inklusive LDAP och OpenID, som vi är intresserade av.
  • Keycloak gatekeeper — en reverse proxy-applikation som möjliggör integration av autentisering via Keycloak.
  • Gangway — en applikation som genererar konfigurationer för kubectl genom vilket man kan autentisera sig och ansluta till Kubernetes API via OpenID.

Hur rättigheter fungerar i Kubernetes.

Vi kan hantera användar- och gruppbehörigheter med hjälp av RBAC, det har redan skrivits en massa artiklar om detta, så jag kommer inte att gå in på detaljer. Problemet är att genom att använda RBAC för att begränsa en användares rättigheter, vet Kubernetes egentligen ingenting om användarna. Det betyder att vi behöver en mekanism för att introducera användaren till Kubernetes. För detta kommer vi att lägga till en OpenID-leverantör i Kubernetes som kommer att bekräfta att användaren verkligen existerar, och att rättigheterna kommer att tilldelas av Kubernetes själv.

Förberedelse

  • Du behöver en Kubernetes-kluster eller minikube
  • Active Directory
  • Domäner:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Ett certifikat för domäner eller ett självsignerat certifikat

Jag kommer inte att gå in på hur man skapar ett självsignerat certifikat, men två certifikat behöver skapas: ett rotcertifikat (certifieringsmyndighet) och ett wildcard-klientcertifikat för domänen *.example.org

När du har mottagit/skrivit ut certifikaten måste klientcertifikatet läggas till i Kubernetes, för detta skapar vi en hemlighet för det:

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

Därefter kommer vi att använda det för vår Ingress-controller

Installation av Keycloak

Jag kom fram till att det var enklast att använda färdiga lösningar för detta, nämligen helm-diagram.

Vi installerar lagret och uppdaterar det:

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

Skapa en fil keycloak.yml med följande innehåll:

keycloak.yml

keycloak:
  # Administratörsnamn
  username: "test_admin"
  # Administratörslösenord  
  password: "admin"
  # Dessa flaggor behövs för att möjliggöra att ladda upp skript till Keycloak direkt genom webgränssnittet. Detta kommer vi behöva för att åtgärda en bugg, som nämns nedan.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled" 
  # Aktivera ingress, ange värdnamn och certifikat som vi tidigare har sparat i sekretess
  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 databas för sin funktion; för teständamål sätter jag upp Postgresql direkt i Kubernetes, men i produktionen är det bättre att inte göra så!
  persistence:
    deployPostgres: true
    dbVendor: postgres

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

Konfigurering av federation

Gå vidare till webbgränssnittet keycloak.example.org

Klicka på vänstra hörnet Lägg till realm

Nyckel
Värde

Namn
kubernetes

Visningsnamn
Kubernetes

Inaktivera e-postbekräftelse för användaren:
Klientomfång —> E-post —> Mappers —> E-post verifierad (Ta bort)

Vi konfigurerar federation för att importera användare från Active Directory, jag kommer lämna skärmdumpar nedan för tydlighet.

Användarfederation —> Lägg till leverantör… —> ldap

Konfigurering av federationVi kopplar ActiveDirectory-autentisering till Kubernetes med hjälp av Keycloak
Vi kopplar ActiveDirectory-autentisering till Kubernetes med hjälp av Keycloak

Om allt ser bra ut, tryck på knappen Synkronisera alla användare du kommer att se ett meddelande om att användarna har importerats framgångsrikt.

Nu måste vi mappa våra grupper

Användarfederation —> ldap_localhost —> Mappers —> Skapa

Skapa mappareVi kopplar ActiveDirectory-autentisering till Kubernetes med hjälp av Keycloak

Konfigurera klienten

Du behöver skapa en klient, i Keycloak-terminologi är detta en applikation som kommer att autentisera sig. Viktiga punkter kommer jag att markera med rött i skärmdumpen.

Klienter —> Skapa

Konfigurera klientenVi kopplar ActiveDirectory-autentisering till Kubernetes med hjälp av Keycloak

Vi skapar ett omfång för grupper:

Klientomfång —> Skapa

Skapa omfångVi kopplar ActiveDirectory-autentisering till Kubernetes med hjälp av Keycloak

Och vi konfigurerar mappare för dem:

Klientomfång —> grupper —> Mappers —> Skapa

MappareVi kopplar ActiveDirectory-autentisering till Kubernetes med hjälp av Keycloak

Lägg till mappning av våra grupper i standard klientomfång:

Klienter —> kubernetes —> Klientomfång —> Standard klientomfång
Välj grupper på Tillgängliga klientomfång, tryck på Lägg till valda

Vi får ett hemligt (och antecknar det någonstans) som vi kommer att använda för autentisering i Keycloak:

Klienter —> kubernetes —> Credentials —> Secret
Med detta är konfigurationen klar, men jag stötte på ett fel när jag efter lyckad autentisering fick ett fel 403. Buggrapport.

Fix:

Klientomfång —> roller —> Mappers —> Skapa

MapperVi kopplar ActiveDirectory-autentisering till Kubernetes med hjälp av Keycloak

Skriptkod

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

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

Konfigurering av Kubernetes

Vi behöver ange var vårt rotcertifikat för webbplatsen ligger och var OIDC-leverantören finns.
För detta redigerar 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
...

Uppdaterar kubeadm-konfig i klustret:

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

Inställningar för auth-proxy

För att skydda din webbapplikation kan du använda Keycloak Gatekeeper. Förutom att denna reverse proxy autentiserar användaren innan den visar sidan, kommer den också att vidarebefordra information om dig till den slutgiltiga applikationen i headers. Om din applikation stöder OpenID, loggar användaren in direkt. Låt oss titta på Kubernetes Dashboard som exempel.

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

Inställningar för åtkomsträttigheter:

Vi skapar en ClusterRoleBinding som ger administratörsbehörighet (standard ClusterRole cluster-admin) för användare som tillhör 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 av 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 detta, när du försöker logga in på kubernetes-dashboard.example.org, kommer du att omdirigeras till Keycloak och vid lyckad autentisering kommer vi att hamna i Dashboard redan inloggad.

Installation av Gangway

För bekvämlighet kan vi lägga till Gangway som kommer att generera en konfigurationsfil för kubectl, genom vilken vi kommer in i Kubernetes med vår användare.


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

values_gangway.yaml


gangway:
  # Valfritt kluster namn
  clusterName: "my-k8s"
  # Här har vi OIDC-leverantören
  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"
  # Teoretiskt kan vi lägga till grupper som vi har mappat här
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Klientens namn
  clientID: "kubernetes"
  # Hemlighet
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Om vi lämnar standardvärdet kommer användarnamnet att vara <b>Förnamn</b> <b>Efternamn</b>, och vid "sub" hans inloggning
  usernameClaim: "sub"
  # Domännamn eller IP-adress till API-servern
  apiServerURL: "https://192.168.99.111:8443"

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

# Om vi använder ett självsignerat certifikat, måste dess (öppna root certifikatet) anges.
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-----

Det ser ungefär ut så här. Det gör det möjligt att både ladda ner konfigurationsfilen direkt och skapa den med en uppsättning kommandon:

Vi kopplar ActiveDirectory-autentisering till Kubernetes med hjälp av Keycloak

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster