Si të integrohet autentifikimi ActiveDirectory me Kubernetes duke përdorur Keycloak

Ky artikull është shkruar me qëllim që të zgjasë ekzistencën e tij tashmë të, por përshkruan veçoritë e lidhjes pikërisht me Microsoft Active Directory, si dhe e plotëson atë.

Në këtë artikull do të tregoj se si të instaloni dhe konfiguroni:

  • Keycloak — është një projekt me burim të hapur. Ai siguron një pikë të vetme hyrjeje për aplikacionet. Punon me shumë protokolle, përfshirë LDAP dhe OpenID të cilat na ενδιαjnë.
  • Keycloak gatekeeper — një aplikacion proxy revers, i cili mundëson integrimin e autorizimit përmes Keycloak.
  • Gangway — një aplikacion që gjeneron konfigurim për kubectl, me anë të të cilit përmes OpenID mund të autorizoheni dhe të lidhni me Kubernetes API.

Si funksionojnë të drejtat në Kubernetes.

Ne mund të menaxhojmë të drejtat e përdoruesit/grupeve përmes RBAC, për këtë janë krijuar shumë artikuj, nuk do të ndalem në detaje mbi këtë. Problemi është që, duke përdorur RBAC për të kufizuar të drejtat e përdoruesit, Kubernetes nuk di asgjë për përdoruesit. Pra, ne kemi nevojë për një mekanizëm për të dërguar përdoruesin në Kubernetes. Për këtë, do të shtojmë në Kubernetes një ofrues OpenID, i cili do të deklarojë se ky përdorues vërtet ekziston, ndërsa të drejtat do t'i jep vetë Kubernetes.

Përgatitja

  • Ju nevojitet një klaster Kubernetes ose minikube
  • Active Directory
  • Domene:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certifikatë për domenet ose një certifikatë vetë të nënshkruar

Nuk do të ndalem shumë në atë se si të krijoni certifikata të vetë-nënshkura, duhet të krijoni 2 certifikata, një rrënjë (Qendra e Certifikimit) dhe një wildcard klient për domenin *.example.org

Pasi të merrni/dhe që të shkruani certifikatat, certifikata klient duhet të shtohet në Kubernetes, për këtë krijojmë një sekret për të:

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

Më pas do ta përdorim për kontrolluesin tonë Ingress

Instalimi i Keycloak

Kam vendosur se ishte më lehtë të përdorja zgjidhje të gatshme për këtë, sidomos helm chart-et.

Instaloni depozitën dhe azhurnoni atë:

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

Krijoni një skedar keycloak.yml me përmbajtjen e mëposhtme:

keycloak.yml

keycloak:
  # Emri i Administratorit
  username: "test_admin"
  # Fjalëkalimi i administratorit
  password: "admin"
  # Këta flamuj nevojiten për të lejuar ngarkimin e skripteve në Keycloak direkt përmes ndërfaqes web. Kjo do na nevojitet për të riparuar një bug, për të cilin do flasim më poshtë.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
  # Aktivizojmë ingress, specifikoni emrin e hostit dhe certifikatën që e kemi ruajtur paraprakisht në 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 kërkon një bazë të dhënash për funksionimin e tij, për qëllime testuese unë po vendos Postgresql direkt në Kubernetes, në prodhim është më mirë të mos bëni këtë!
  persistence:
    deployPostgres: true
    dbVendor: postgres

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

Konfigurimi i federatës

Pastaj hyjmë në ndërfaqen web keycloak.example.org

Klikojmë në këndin e majtë Shto realm

Çelësi
Vlera

Emri
kubernetes

Emri i Shfaqjes
Kubernetes

Çaktivizojmë verifikimin e emailit të përdoruesit:
Client scopes —> Email —> Mappers —> Email verified (Fshi)

Konfigurojmë federatën për importimin e përdoruesve nga ActiveDirectory, do lë më poshtë disa screenshot-e mendoj se do jetë më e qartë.

User federation —> Shto ofrues… —> ldap

Konfigurimi i federatësSi të integrohet autentifikimi ActiveDirectory me Kubernetes duke përdorur Keycloak
Si të integrohet autentifikimi ActiveDirectory me Kubernetes duke përdorur Keycloak

Nëse gjithçka është në rregull, pas klikuar butonin Synchronize all users do të shihni mesazhin e suksesshëm për importimin e përdoruesve.

Pastaj duhet të mapojmë grupet tona

User federation —> ldap_localhost —> Mappers —> Krijo

Krijimi i mapper-itSi të integrohet autentifikimi ActiveDirectory me Kubernetes duke përdorur Keycloak

Konfigurimi i klientit

Duhet të krijojmë një klient, në kuptimin e Keycloak ky është aplikacioni që do të autorizohet. Pikat e rëndësishme do i veçoj në screenshot në të kuqe.

Clients —> Krijo

Konfigurimi i klientitSi të integrohet autentifikimi ActiveDirectory me Kubernetes duke përdorur Keycloak

Do të krijojmë scope për grupet:

Client Scopes —> Krijo

Krijimi i scope-itSi të integrohet autentifikimi ActiveDirectory me Kubernetes duke përdorur Keycloak

Dhe do të konfiguroni mapper-in për to:

Client Scopes —> groups —> Mappers —> Krijo

MapperiSi të integrohet autentifikimi ActiveDirectory me Kubernetes duke përdorur Keycloak

Shtojmë mapimin e grupeve tona në Default Client Scopes:

Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Zgjidhni grupet në Shkallët e Klientit në Disponibël, klikojmë Shto të përzgjedhurat

Marrim secret-in (dhe e shkruajmë diku) të cilin do ta përdorim për autorizimin në Keycloak:

Clients —> kubernetes —> Credentials —> Secret
Kjo është përfundimi i konfigurimit, por unë kam hasur një gabim kur pas autorizimit të suksesshëm kam marrë gabimin 403. Bug report.

Fix:

Client Scopes —> roles —> Mappers —> Krijo

MapperSi të integrohet autentifikimi ActiveDirectory me Kubernetes duke përdorur Keycloak

Kodi i skriptës

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

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

Konfigurimi i Kubernetes

Na nevojitet të specifikojmë ku ndodhet certifikata jonë rrënjore nga faqja, dhe ku ndodhet ofruesi OIDC.
Për këtë redaktojmë skedarin /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
...

Po përditësimin e konfiguracionit kubeadm në klaster:

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

Konfigurimi i auth-proxy

Për të mbrojtur aplikacionin tuaj web, mund të përdorni keycloak gatekeeper. Përveç faktit që ky reverse proxy do të autentifikojë përdoruesin përpara se të shfaqë faqen, ai do të dorëzojë informacionin tuaj në aplikacionin përfundimtar nëpërmjet titujve. Kështu, nëse aplikacioni juaj mbështet OpenID, përdoruesi do të autentifikohet menjëherë. Le të shohim një shembull me Kubernetes Dashboard.

Instalimi i 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'

Konfigurimi i të drejtave të aksesit:

Do të krijojmë një ClusterRoleBinding që do t'i japë të drejtat e administratorit të klasterit (ClusterRole standard cluster-admin) për përdoruesit e grupit 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

Instalimi i 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"

Pasi të ndodhi kjo, kur të provoni të hyni në kubernetes-dashboard.example.org, do të ndodhi një ridirection në Keycloak dhe në rastin e një autorizimi të suksesshëm, ne do të hynim në Dashboard tashmë të autentikuar.

Instalimi i gangway

Për lehtësinë tuaj, mund të shtoni gangway i cili do të gjenerojë skedarin e konfigurimit për kubectl, me të cilin ne do të hynim në Kubernetes me përdoruesin tonë.


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

values_gangway.yaml


gangway:
  # Emri i rastësishëm i grumbullit
  clusterName: "my-k8s"
  # Ku ndodhet ofruesi ynë 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"
  # Teoretikisht, këtu mund të shtohen grupet që ne kemi hartuar
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Emri i klientit
  clientID: "kubernetes"
  # Sekreti
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Nëse lëvizni me vlerën e defoltë, bën që emri i përdoruesit të merret nga <b>Emri i parë</b> <b>Emri i dytë</b>, dhe me "sub" logini i tij
  usernameClaim: "sub"
  # Emri i domenit ose adresa IP e serverit API
  apiServerURL: "https://192.168.99.111:8443"

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

# Nëse përdorim një certifikat vetë-nënshkruar, atëherë duhet të specifikojmë atë (certifikata e hapur rrënjë). 
 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-----

Dukshëm kështu. Lejon si të shkarkoni skedarin e konfigurimit menjëherë, ashtu edhe ta formoni atë duke përdorur një grup komandash:

Si të integrohet autentifikimi ActiveDirectory me Kubernetes duke përdorur Keycloak

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster