Vi fäster ActiveDirectory-auktorisering till Kubernetes med Keycloak

Denna artikel har skrivits för att utöka det redan existerande, men pratar om funktionerna i paketet med Microsoft ActiveDirectory och kompletterar det också.

I den här artikeln kommer jag att berätta hur du installerar och konfigurerar:

  • nyckelmantel är ett projekt med öppen källkod. Vilket ger en enda ingångspunkt för applikationer. Fungerar med många protokoll, inklusive LDAP och OpenID som vi är intresserade av.
  • nyckelmantel grindvakt - Omvänd proxyapplikation som låter dig integrera auktorisering genom Keycloak.
  • Landgång - en applikation som genererar en konfiguration för kubectl med vilken du kan logga in och ansluta till Kubernetes API via OpenID.

Hur behörigheter fungerar i Kubernetes.

Vi kan hantera användar-/grupprättigheter med hjälp av RBAC, ett gäng artiklar har redan skapats om detta, jag kommer inte att uppehålla mig vid detta i detalj. Problemet är att du kan använda RBAC för att begränsa användarrättigheter, men Kubernetes vet ingenting om användare. Det visar sig att vi behöver en användarleveransmekanism i Kubernetes. För att göra detta kommer vi att lägga till en leverantör till Kuberntes OpenID, som kommer att säga att en sådan användare verkligen existerar, och Kubernetes själv kommer att ge honom rättigheterna.

Utbildning

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

Jag kommer inte att uppehålla mig vid hur man skapar ett självsignerat certifikat, du måste skapa 2 certifikat, detta är roten (Certificate Authority) och jokerteckenklienten för *.example.org-domänen

Efter att du har tagit emot / utfärdat certifikat måste klienten läggas till i Kubernetes, för detta skapar vi en hemlighet för den:

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

Därefter kommer vi att använda den för vår Ingress-kontroller.

Keycloak installation

Jag bestämde mig för att det enklaste sättet är att använda färdiga lösningar för detta, nämligen styrdiagram.

Installera arkivet och uppdatera det:

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

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

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

Federation setup

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

Klicka i det vänstra hörnet Lägg till rike

Nyckel
Värde

Namn
Kubernetes

Visningsnamn
Kubernetes

Inaktivera användarens e-postverifiering:
Klientomfång —> E-post —> Kartläggare —> E-post verifierad (Ta bort)

Vi satte upp federation för att importera användare från ActiveDirectory, jag lämnar skärmdumpar nedan, jag tror att det blir tydligare.

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

Federation setupVi fäster ActiveDirectory-auktorisering till Kubernetes med Keycloak
Vi fäster ActiveDirectory-auktorisering till Kubernetes med Keycloak

Om allt är bra, efter att ha tryckt på knappen Synkronisera alla användare du kommer att se ett meddelande om framgångsrik import av användare.

Därefter måste vi kartlägga våra grupper

Användarfederation --> ldap_localhost --> Mappers --> Skapa

Skapar en kartläggareVi fäster ActiveDirectory-auktorisering till Kubernetes med Keycloak

Klientinställningar

Det är nödvändigt att skapa en klient, när det gäller Keycloak, detta är en applikation som kommer att godkännas av honom. Jag kommer att markera de viktiga punkterna i skärmdumpen i rött.

Klienter —> Skapa

KlientinställningarVi fäster ActiveDirectory-auktorisering till Kubernetes med Keycloak

Låt oss skapa scoupe för grupper:

Klientomfång —> Skapa

Skapa omfattningVi fäster ActiveDirectory-auktorisering till Kubernetes med Keycloak

Och ställ in en kartläggare för dem:

Klientomfång —> grupper —> Kartläggare —> Skapa

KartläggareVi fäster ActiveDirectory-auktorisering till Kubernetes med Keycloak

Lägg till kartläggningen av våra grupper till Standard Client Scopes:

Klienter —> kubernetes —> Client Scopes —> Standard Client Scopes
Välj grupper в Tillgängliga klientomfattningar, Tryck Lägg till valda

Vi får hemligheten (och skriver den till tråden) som vi kommer att använda för auktorisering i Keycloak:

Klienter —> kubernetes —> Inloggningsuppgifter —> Hemlighet
Detta slutför installationen, men jag fick ett fel när jag, efter lyckad auktorisering, fick ett fel 403. Buggrapport.

Fixera:

Klientomfång —> roller —> Kartläggare —> Skapa

mapperVi fäster ActiveDirectory-auktorisering till Kubernetes med 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();

Konfigurera Kubernetes

Vi måste ange var vårt rotcertifikat från webbplatsen ligger och var OIDC-leverantören finns.
För att göra detta, redigera 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
...

Uppdatera kubeadm config i klustret:

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

Ställa in auth-proxy

Du kan använda keycloak gatekeeper för att skydda din webbapplikation. Förutom det faktum att denna omvända proxy kommer att auktorisera användaren innan sidan visas, kommer den också att skicka information om dig till slutapplikationen i rubrikerna. Således, om din applikation stöder OpenID, är användaren omedelbart auktoriserad. Tänk på exemplet med Kubernetes Dashboard

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

Ställa in åtkomsträttigheter:

Låt oss skapa en ClusterRoleBinding som ger klusteradminrättigheter (standard ClusterRole cluster-admin) för användare i 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

Installera 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

värden_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 det, när du försöker gå till kubernetes-dashboard.example.org, kommer vi att omdirigeras till Keycloak och i händelse av framgångsrik auktorisering kommer vi till Dashboard som redan är inloggad.

installation av landgång

För enkelhetens skull kan du lägga till en landgång som genererar en konfigurationsfil för kubectl, med hjälp av vilken vi kommer in i Kubernetes under vår användare.


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

värden_gångväg.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-----

Ser ut så här. Låter dig omedelbart ladda ner konfigurationsfilen och generera den med en uppsättning kommandon:

Vi fäster ActiveDirectory-auktorisering till Kubernetes med Keycloak

Källa: will.com

Lägg en kommentar