Timakhazikitsa chilolezo cha ActiveDirectory ku Kubernetes pogwiritsa ntchito Keycloak

Nkhaniyi yalembedwa kuti ionjezerepo kale alipo, koma amalankhula za mawonekedwe a mtolo ndi Microsoft ActiveDirectory, komanso amakwaniritsa.

M'nkhaniyi ndikuwuzani momwe mungayikitsire ndikusintha:

  • chikhomo ndi ntchito yotseguka. Zomwe zimapereka malo amodzi olowera pazofunsira. Imagwira ntchito ndi ma protocol ambiri, kuphatikiza LDAP ndi OpenID zomwe timakonda.
  • mlonda pachipata - sinthani pulogalamu ya proxy yomwe imakupatsani mwayi wophatikiza chilolezo kudzera ku Keycloak.
  • gulu - pulogalamu yomwe imapanga config ya kubectl yomwe mutha kulowamo ndikulumikizana ndi Kubernetes API kudzera pa OpenID.

Momwe zilolezo zimagwirira ntchito ku Kubernetes.

Titha kuyang'anira ufulu wa ogwiritsa ntchito / gulu pogwiritsa ntchito RBAC, zolemba zambiri zidapangidwa kale za izi, sindikhala pa izi mwatsatanetsatane. Vuto ndiloti mutha kugwiritsa ntchito RBAC kuletsa ufulu wa ogwiritsa ntchito, koma Kubernetes sadziwa chilichonse chokhudza ogwiritsa ntchito. Zikuwoneka kuti tikufuna njira yoperekera ogwiritsa ntchito ku Kubernetes. Kuti tichite izi, tidzawonjezera wothandizira ku Kuberntes OpenID, yomwe inganene kuti wogwiritsa ntchitoyo alipodi, ndipo Kubernetes mwiniyo adzamupatsa ufulu.

Kukonzekera

  • Mufunika gulu la Kubernetes kapena minikube
  • Active Directory
  • Madomeni:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Satifiketi ya madambwe kapena satifiketi yodzisainira

Sindidzangokhalira kuganizira za momwe mungapangire satifiketi yodzilembera nokha, muyenera kupanga ziphaso za 2, uwu ndiye muzu (Certificate Authority) ndi kasitomala waku wildcard wa *.example.org domain

Mukalandira / kupereka ziphaso, kasitomala ayenera kuwonjezeredwa ku Kubernetes, chifukwa cha izi timapanga chinsinsi chake:

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

Kenako, tidzagwiritsa ntchito ingress controller yathu.

Kuyika Keycloak

Ndinaganiza kuti njira yosavuta ndiyo kugwiritsa ntchito njira zokonzekera izi, zomwe ndi ma chart a helm.

Ikani chosungira ndikusintha:

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

Pangani fayilo ya keycloak.yml yokhala ndi izi:

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

Kupanga Federation

Kenako, pitani ku mawonekedwe a intaneti keycloak.example.org

Dinani kumanzere ngodya Onjezani dziko

Mfungulo
mtengo

dzina
kubernetes

Dzina lowonetsa
Kubernetes

Letsani kutsimikizira kwa imelo kwa ogwiritsa ntchito:
Makasitomala -> Imelo -> Mappers -> Imelo yotsimikizika (Chotsani)

Tidakhazikitsa bungwe kuti tilowetse ogwiritsa ntchito kuchokera ku ActiveDirectory, ndikusiya zithunzi pansipa, ndikuganiza kuti zimveka bwino.

Bungwe la ogwiritsa ntchito -> Onjezani wopereka… -> ldap

Kupanga FederationTimakhazikitsa chilolezo cha ActiveDirectory ku Kubernetes pogwiritsa ntchito Keycloak
Timakhazikitsa chilolezo cha ActiveDirectory ku Kubernetes pogwiritsa ntchito Keycloak

Ngati zonse zili bwino, ndiye pambuyo kukanikiza batani Lumikizani ogwiritsa ntchito onse mudzawona uthenga wokhudza kulowetsa bwino kwa ogwiritsa ntchito.

Kenako tiyenera kupanga mapu magulu athu

Bungwe la ogwiritsa ntchito -> ldap_localhost --> Mappers -> Pangani

Kupanga mapuTimakhazikitsa chilolezo cha ActiveDirectory ku Kubernetes pogwiritsa ntchito Keycloak

Kukonzekera kwa kasitomala

Ndikofunikira kupanga kasitomala, malinga ndi Keycloak, iyi ndi ntchito yomwe idzaloledwa kuchokera kwa iye. Ndidzawonetsa mfundo zofunika pazithunzi zofiira.

Makasitomala -> Pangani

Kukonzekera kwa kasitomalaTimakhazikitsa chilolezo cha ActiveDirectory ku Kubernetes pogwiritsa ntchito Keycloak

Tiyeni tipange scoupe kwa magulu:

Makasitomala -> Pangani

Pangani kuchulukaTimakhazikitsa chilolezo cha ActiveDirectory ku Kubernetes pogwiritsa ntchito Keycloak

Ndipo kuwakonzera mapu:

Makasitomala β€”> magulu β€”> Mappers β€”> Pangani

MapperTimakhazikitsa chilolezo cha ActiveDirectory ku Kubernetes pogwiritsa ntchito Keycloak

Onjezani mapu amagulu athu ku Default Client Scopes:

Makasitomala β€”> kubernetes β€”> Makasitomala β€”> Makasitomala a Makasitomala
Sankhani magulu Π² Kupezeka kwa Makasitomala, kanda Onjezani osankhidwa

Timapeza chinsinsi (ndikuchilembera ku ulusi) chomwe tidzagwiritsa ntchito chilolezo ku Keycloak:

Makasitomala -> kubernetes -> Zizindikiro -> Chinsinsi
Izi zimamaliza kukhazikitsidwa, koma ndinali ndi cholakwika pamene, nditavomerezedwa bwino, ndidalandira cholakwika 403. Ripoti la cholakwika.

Konzani:

Kuchuluka kwa Makasitomala -> maudindo -> Mapu -> Pangani

MapepalaTimakhazikitsa chilolezo cha ActiveDirectory ku Kubernetes pogwiritsa ntchito Keycloak

Script kodi

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

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

Kukonza Kubernetes

Tiyenera kufotokoza komwe chiphaso chathu chochokera patsambali chagona, komanso komwe operekera OIDC ali.
Kuti muchite izi, sinthani fayilo /etc/kubernetes/manifests/kube-apiserver.yaml

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

Sinthani kasinthidwe ka kubeadm mumagulu:

kukhalaadmconfig

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

kukhazikitsa kwa auth-proxy

Mutha kugwiritsa ntchito keycloak gatekeeper kuti muteteze pulogalamu yanu yapaintaneti. Kuphatikiza pa mfundo yakuti pulojekitiyi idzavomereza wogwiritsa ntchito musanawonetse tsambalo, idzaperekanso zambiri za inu kumapeto kwa ntchito pamutu. Chifukwa chake, ngati pulogalamu yanu imathandizira OpenID, ndiye kuti wogwiritsa ntchitoyo amaloledwa nthawi yomweyo. Taganizirani chitsanzo cha Kubernetes Dashboard

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

Kukhazikitsa maufulu olowa:

Tiyeni tipange ClusterRoleBinding yomwe idzapatse maufulu a admin cluster (standard ClusterRole cluster-admin) kwa ogwiritsa ntchito mugulu la 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

Ikani 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"

Pambuyo pake, pamene mukuyesera kupita kubernetes-dashboard.example.org, tidzatumizidwa ku Keycloak ndipo ngati tivomerezedwa bwino tidzafika ku Dashboard yomwe yalowetsedwa kale.

kukhazikitsa gangway

Kuti mumve mosavuta, mutha kuwonjezera gulu lachigawenga lomwe lingapange fayilo yosinthira kubectl, mothandizidwa ndi zomwe titha kulowa Kubernetes pansi pa ogwiritsa ntchito.


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

Zikuwoneka ngati izi. Imakulolani kuti mutsitse nthawi yomweyo fayilo ya config ndikuipanga pogwiritsa ntchito malamulo angapo:

Timakhazikitsa chilolezo cha ActiveDirectory ku Kubernetes pogwiritsa ntchito Keycloak

Source: www.habr.com

Kuwonjezera ndemanga