Isu tinosimbisa ActiveDirectory mvumo kuKubernetes tichishandisa Keycloak

Ichi chinyorwa chakanyorwa kuti chiwedzere pane zvatove aripo, asi inotaura nezve maficha echisumbu neMicrosoft ActiveDirectory, uye zvakare inozadzisa iyo.

Muchikamu chino ini ndichakuudza nzira yekuisa uye kugadzirisa:

  • keycloak iri open source project. Iyo inopa imwe poindi yekupinda yezvikumbiro. Inoshanda nemaprotocol akawanda, anosanganisira LDAP uye OpenID yatiri kufarira.
  • keycloak murindi wepagedhi - reverse proxy application iyo inokutendera kuti ubatanidze mvumo kuburikidza neKeycloak.
  • gangway -chishandiso chinogadzira gadziriso yekubectl iyo iwe yaunogona kupinda nayo uye ubatanidze kuKubernetes API kuburikidza neOpenID.

Mashandisiro anoita mvumo muKubernetes.

Tinogona kubata kodzero dzevashandisi / boka tichishandisa RBAC, boka rezvinyorwa zvakatogadzirwa nezve izvi, ini handisi kuzogara pane izvi zvakadzama. Dambudziko nderekuti unogona kushandisa RBAC kudzora kodzero dzevashandisi, asi Kubernetes hapana chaanoziva nezvevashandisi. Zvinoitika kuti isu tinoda mushandisi wekutumira nzira muKubernetes. Kuti tiite izvi, tichawedzera mupi weKuberntes OpenID, iyo ichataura kuti mushandisi akadaro aripo, uye Kubernetes pachake achamupa kodzero.

Kugadzirira kwe

  • Iwe unozoda Kubernetes cluster kana minikube
  • Active Directory
  • Domains:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Chitupa chemadomasi kana chitupa chekuzvisaina

Ini handisi kuzogara pamusoro pekugadzira chitupa chekuzvisaina, iwe unofanirwa kugadzira zvitupa zviviri, uyu ndiwo mudzi (Chiremera Chiremera) uye mutengi wemusango we * .example.org domain

Mushure mekugamuchira / kuburitsa zvitupa, mutengi anofanira kuwedzerwa kuKubernetes, nekuda kweizvi isu tinozvigadzirira chakavanzika:

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

Tevere, isu tichaishandisa kune yedu Ingress controller.

Keycloak Installation

Ndakasarudza kuti nzira iri nyore ndeye kushandisa yakagadzirira-yakagadzirwa mhinduro kune iyi, iyo helm machati.

Isa repository uye uvandudze iyo:

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

Gadzira keycloak.yml faira ine zvinotevera zvirimo:

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

Zvadaro, enda kune web interface keycloak.example.org

Dzvanya mukona yekuruboshwe Add realm

Key
ukoshi

zita
kubernetes

Ratidza zita
Kubernetes

Dzima ongororo ye email yemushandisi:
Client scopes -> Email -> Mappers -> Email yakasimbiswa (Delete)

Isu takamisa mubatanidzwa kupinza vashandisi kubva kuActiveDirectory, ini ndichasiya zviratidziro pazasi, ndinofunga zvichave zvakajeka.

Mubatanidzwa wevashandisi -> Wedzera mupi… -> ldap

Federation setupIsu tinosimbisa ActiveDirectory mvumo kuKubernetes tichishandisa Keycloak
Isu tinosimbisa ActiveDirectory mvumo kuKubernetes tichishandisa Keycloak

Kana zvese zvakanaka, saka mushure mekudzvanya bhatani Batanidza vashandisi vese iwe uchaona meseji pamusoro pekubudirira kupinza kwevashandisi.

Tevere tinofanira kumepu mapoka edu

Mushandisi wemubatanidzwa --> ldap_localhost -> Mamepu -> Gadzira

Kugadzira mepuIsu tinosimbisa ActiveDirectory mvumo kuKubernetes tichishandisa Keycloak

Client setup

Izvo zvinodikanwa kugadzira mutengi, maererano neKeycloak, ichi chikumbiro chinozobvumidzwa kubva kwaari. Ini ndicharatidza zvakakosha mapoinzi mune iyo skrini mune tsvuku.

Vatengi -> Gadzira

Client setupIsu tinosimbisa ActiveDirectory mvumo kuKubernetes tichishandisa Keycloak

Ngatigadzire scoupe yemapoka:

Client Scopes -> Gadzira

Gadzira nzvimboIsu tinosimbisa ActiveDirectory mvumo kuKubernetes tichishandisa Keycloak

Uye uvagadzirire mepu:

Client Scopes β€”> mapoka β€”> Mappers β€”> Gadzira

MapperIsu tinosimbisa ActiveDirectory mvumo kuKubernetes tichishandisa Keycloak

Wedzera mamepu emapoka edu kune Default Client Scopes:

Vatengi -> kubernetes -> Client Scopes -> Default Client Scopes
Sarudza mapoka Π² Inowanikwa Client Scopes, Press Wedzera zvakasarudzwa

Isu tinotora chakavanzika (uye nyora kune iyo tambo) yatichashandisa kubvumidza muKeycloak:

Clients -> kubernetes -> Credentials -> Chakavanzika
Izvi zvinopedzisa kuseta, asi ndakakanganisa apo, mushure mekubudirira kwemvumo, ndakagamuchira kukanganisa 403. Bug report.

Gadzirisa:

Client Scopes β€”> mabasa β€”> Mappers β€”> Gadzira

MappersIsu tinosimbisa ActiveDirectory mvumo kuKubernetes tichishandisa Keycloak

Script kodhi

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

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

Kugadzirisa Kubernetes

Isu tinofanirwa kutsanangura kuti chitupa chedu chemidzi kubva kune saiti chiri papi, uye panowanikwa mupi weOIDC.
Kuti uite izvi, gadzirisa iyo faira /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
...

Gadziridza kubeadm config musumbu:

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

Kuseta auth-proxy

Iwe unogona kushandisa keycloak muchengeti wegedhi kuchengetedza yako webhu application. Pamusoro pekuti iyi reverse proxy inobvumidza mushandisi asati aratidza peji, inozopfuudza ruzivo nezvewe kune yekupedzisira application mumusoro. Saka, kana application yako ikatsigira OpenID, ipapo mushandisi anobva apihwa mvumo. Funga nezvemuenzaniso weKubernetes Dashboard

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

Kuseta kodzero dzekuwana:

Ngatigadzirei ClusterRoleBinding iyo inopa cluster admin kodzero (yakajairwa ClusterRole cluster-admin) yevashandisi muboka reDataOPS.


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

Isa keycloak gedhi:


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"

Mushure meizvozvo, paunoedza kuenda kubernetes-dashboard.example.org, isu tichaendeswa kuKeycloak uye kana ikabudirira mvumo tichasvika kuDashboard yatopinda.

gangway installation

Kuti zvive nyore, iwe unogona kuwedzera gangway iyo inogadzira iyo config faira ye kubectl, nerubatsiro rwatichapinda muKubernetes pasi pemushandisi wedu.


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

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

Zvinoita seizvi. Inokutendera iwe kurodha nekukurumidza config faira uye kuigadzira uchishandisa seti yemirairo:

Isu tinosimbisa ActiveDirectory mvumo kuKubernetes tichishandisa Keycloak

Source: www.habr.com

Voeg