Ons maak ActiveDirectory-magtiging aan Kubernetes vas met Keycloak

Hierdie artikel is geskryf met die doel om die reeds uit te brei bestaande, maar praat oor die kenmerke van die verbinding spesifiek met Microsoft ActiveDirectory, en vul dit ook aan.

In hierdie artikel sal ek jou vertel hoe om te installeer en op te stel:

  • Sleutelmantel is 'n oopbronprojek. Wat 'n enkele toegangspunt vir toepassings bied. Werk met baie protokolle, insluitend LDAP en OpenID, wat vir ons van belang is.
  • Sleutelmantel hekwagter - 'n omgekeerde proxy-toepassing waarmee u magtiging via Keycloak kan integreer.
  • Gangpad — 'n toepassing wat 'n konfigurasie vir kubectl genereer waarmee u via OpenID kan aanmeld en aan die Kubernetes API kan koppel.

Hoe toestemmings werk in Kubernetes.

Ons kan gebruikers-/groepregte bestuur deur RBAC te gebruik, 'n klomp artikels is reeds hieroor geskep, ek sal nie in detail hieroor uitwei nie. Die probleem is dat jy RBAC kan gebruik om gebruikersregte te beperk, maar Kubernetes weet niks van gebruikers nie. Dit blyk dat ons 'n gebruikersafleweringsmeganisme in Kubernetes benodig. Om dit te doen, sal ons 'n verskaffer by Kuberntes OpenID voeg, wat sal aandui dat so 'n gebruiker werklik bestaan, en Kubernetes self sal hom regte gee.

Opleiding

  • Jy sal 'n Kubernetes-kluster of minikube benodig
  • Active Directory
  • Domeine:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Sertifikaat vir domeine of self-ondertekende sertifikaat

Ek gaan nie in detail in oor hoe om 'n self-ondertekende sertifikaat te skep nie; jy moet 2 sertifikate skep, dit is die wortel (Sertifiseringsowerheid) en die kliënt-jokerteken vir die *.example.org-domein

Nadat u die sertifikate ontvang/uitgeskryf het, moet u die kliëntsertifikaat by Kubernetes voeg; om dit te doen, skep 'n geheim daarvoor:

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

Volgende sal ons dit gebruik vir ons Ingress-beheerder

Sleutelmantel installasie

Ek het besluit dat die maklikste manier is om gereedgemaakte oplossings hiervoor te gebruik, naamlik stuurkaarte.

Installeer die bewaarplek en werk dit op:

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

Skep 'n keycloak.yml-lêer met die volgende inhoud:

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

Federasie opstelling

Gaan dan na die webkoppelvlak keycloak.example.org

Klik in die linkerhoek Voeg ryk by

Sleutel
waarde

Naam
goewerneur

Display Naam
Kubernetes

Deaktiveer gebruiker-e-posbevestigingkontrole:
Kliëntomvang —> E-pos —> Mappers —> E-pos geverifieer (Vee uit)

Ons stig 'n federasie om gebruikers vanaf ActiveDirectory in te voer, ek sal skermkiekies hieronder laat, ek dink dit sal duideliker wees.

Gebruikersfederasie —> Voeg verskaffer by... —> ldap

Federasie opstellingOns maak ActiveDirectory-magtiging aan Kubernetes vas met Keycloak
Ons maak ActiveDirectory-magtiging aan Kubernetes vas met Keycloak

As alles in orde is, dan nadat u die knoppie gedruk het Sinkroniseer alle gebruikers Jy sal 'n boodskap sien wat die suksesvolle invoer van gebruikers aandui.

Volgende moet ons ons groepe karteer

Gebruikersfederasie -> ldap_localhost -> Mappers -> Skep

Die skep van 'n karteerderOns maak ActiveDirectory-magtiging aan Kubernetes vas met Keycloak

Kliënt opstelling

U moet 'n kliënt skep, in terme van Keycloak is dit 'n toepassing wat daardeur gemagtig sal word. Ek sal belangrike punte in rooi in die skermkiekie uitlig.

Kliënte -> Skep

Kliënt opstellingOns maak ActiveDirectory-magtiging aan Kubernetes vas met Keycloak

Kom ons skep 'n scoupe vir groepe:

Kliëntbestekke -> Skep

Die skep van 'n omvangOns maak ActiveDirectory-magtiging aan Kubernetes vas met Keycloak

En stel 'n karteerder vir hulle op:

Kliëntbestekke -> groepe -> Mappers -> Skep

MapperOns maak ActiveDirectory-magtiging aan Kubernetes vas met Keycloak

Ons voeg kartering van ons groepe by verstekkliëntbestekke:

Kliënte -> kubernetes -> Kliëntbestekke -> Standaardkliëntbestekke
Kies groepe в Beskikbare kliëntbestekke, pers Voeg geselekteerde by

Ons kry die geheim (en skryf dit iewers neer) wat ons sal gebruik vir magtiging in Keycloak:

Kliënte -> kubernetes -> Geloofsbriewe -> Geheim
Dit voltooi die opstelling, maar ek het 'n fout gehad toe ek, na suksesvolle magtiging, 'n 403-fout ontvang het. Fout verslag.

Maak reg:

Kliëntbestekke -> rolle -> Kaartmakers -> Skep

KaartmakerOns maak ActiveDirectory-magtiging aan Kubernetes vas met Keycloak

Skrip kode

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

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

Konfigureer Kubernetes

Ons moet aandui waar ons wortelsertifikaat vanaf die webwerf geleë is, en waar die OIDC-verskaffer geleë is.
Om dit te doen, wysig die lêer /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
...

Dateer kubeadm-opstelling in die groep op:

kubeadm konfigurasie

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

Stel magtiging-instaanbediener

Om jou webtoepassing te beskerm, kan jy keycloak-hekwagter gebruik. Benewens die feit dat hierdie omgekeerde instaanbediener die gebruiker sal magtig voordat die bladsy gewys word, sal dit ook inligting oor jou in die opskrifte na die eindtoepassing oordra. Dus, as jou toepassing OpenID ondersteun, word die gebruiker onmiddellik gemagtig. Kom ons kyk na die voorbeeld van Kubernetes Dashboard

Installeer Kubernetes Dashboard


helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

waardes_dashboard.yaml

enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'

Stel toegangsregte op:

Kom ons skep 'n ClusterRoleBinding wat cluster admin regte sal gee (standaard ClusterRole cluster-admin) vir gebruikers in die DataOPS groep.


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

Installeer keycloak hekwagter:


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

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

Daarna, wanneer jy probeer om aan te meld by kubernetes-dashboard.example.org, sal 'n herleiding na Keycloak plaasvind en as magtiging suksesvol is, sal ons na die Dashboard geneem word wat reeds aangemeld is.

Gangpad installasie

Gerieflikheidshalwe kan u 'n gang byvoeg wat 'n konfigurasielêer vir kubectl sal genereer, met behulp waarvan ons in Kubernetes onder ons gebruiker sal kom.


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

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

Dit lyk so iets. Laat jou toe om onmiddellik 'n konfigurasielêer af te laai en dit te genereer deur 'n stel opdragte te gebruik:

Ons maak ActiveDirectory-magtiging aan Kubernetes vas met Keycloak

Bron: will.com

Voeg 'n opmerking