Pina-fasten namin ang pahintulot ng ActiveDirectory sa Kubernetes gamit ang Keycloak

Ang artikulong ito ay isinulat upang palawakin ang na umiiral, ngunit pinag-uusapan ang mga tampok ng bundle sa Microsoft ActiveDirectory, at pinupunan din ito.

Sa artikulong ito sasabihin ko sa iyo kung paano i-install at i-configure:

  • keycloak ay isang open source na proyekto. Na nagbibigay ng isang punto ng pagpasok para sa mga aplikasyon. Gumagana sa maraming protocol, kabilang ang LDAP at OpenID kung saan kami interesado.
  • tagabantay ng keycloak - reverse proxy application na nagbibigay-daan sa iyo upang isama ang pahintulot sa pamamagitan ng Keycloak.
  • Gangways - isang application na bumubuo ng config para sa kubectl kung saan maaari kang mag-log in at kumonekta sa Kubernetes API sa pamamagitan ng OpenID.

Paano gumagana ang mga pahintulot sa Kubernetes.

Maaari naming pamahalaan ang mga karapatan ng gumagamit / pangkat gamit ang RBAC, isang bungkos ng mga artikulo ang nalikha na tungkol dito, hindi ko ito tatalakayin nang detalyado. Ang problema ay maaari mong gamitin ang RBAC upang paghigpitan ang mga karapatan ng user, ngunit walang alam ang Kubernetes tungkol sa mga user. Lumalabas na kailangan namin ng mekanismo ng paghahatid ng user sa Kubernetes. Para magawa ito, magdaragdag kami ng provider sa Kuberntes OpenID, na magsasabi na talagang umiiral ang naturang user, at ang Kubernetes mismo ang magbibigay sa kanya ng mga karapatan.

Pagsasanay

  • Kakailanganin mo ng Kubernetes cluster o minikube
  • Active Directory
  • Mga domain:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certificate para sa mga domain o self-signed certificate

Hindi ako magtatagal kung paano gumawa ng self-signed certificate, kailangan mong gumawa ng 2 certificate, ito ang root (Certificate Authority) at ang wildcard client para sa *.example.org na domain

Pagkatapos mong makatanggap / mag-isyu ng mga sertipiko, ang kliyente ay dapat idagdag sa Kubernetes, para dito lumikha kami ng isang lihim para dito:

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

Susunod, gagamitin namin ito para sa aming Ingress controller.

Pag-install ng Keycloak

Napagpasyahan ko na ang pinakamadaling paraan ay ang paggamit ng mga handa na solusyon para dito, katulad ng mga chart ng timon.

I-install ang repositoryo at i-update ito:

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

Lumikha ng keycloak.yml file na may sumusunod na nilalaman:

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

Pag-setup ng Federation

Susunod, pumunta sa web interface keycloak.example.org

Mag-click sa kaliwang sulok Magdagdag ng kaharian

Key
halaga

Pangalan
Kubernetes

Display Name
Kubernetes

Huwag paganahin ang pag-verify ng email ng user:
Mga saklaw ng kliyente β€”> Email β€”> Mga Mapper β€”> Na-verify ang email (Tanggalin)

Nag-set up kami ng federation upang mag-import ng mga user mula sa ActiveDirectory, mag-iiwan ako ng mga screenshot sa ibaba, sa tingin ko ito ay magiging mas malinaw.

User federation β€”> Magdagdag ng provider... β€”> ldap

Pag-setup ng FederationPina-fasten namin ang pahintulot ng ActiveDirectory sa Kubernetes gamit ang Keycloak
Pina-fasten namin ang pahintulot ng ActiveDirectory sa Kubernetes gamit ang Keycloak

Kung maayos ang lahat, pagkatapos ay pagkatapos ng pagpindot sa pindutan I-synchronize ang lahat ng user makakakita ka ng mensahe tungkol sa matagumpay na pag-import ng mga user.

Susunod na kailangan naming i-map ang aming mga grupo

Pederasyon ng gumagamit --> ldap_localhost --> Mga Mapper --> Lumikha

Paglikha ng mapperPina-fasten namin ang pahintulot ng ActiveDirectory sa Kubernetes gamit ang Keycloak

Setup ng kliyente

Ito ay kinakailangan upang lumikha ng isang kliyente, sa mga tuntunin ng Keycloak, ito ay isang application na papahintulutan mula sa kanya. I-highlight ko ang mga mahahalagang punto sa screenshot sa pula.

Mga Kliyente -> Lumikha

Setup ng kliyentePina-fasten namin ang pahintulot ng ActiveDirectory sa Kubernetes gamit ang Keycloak

Gumawa tayo ng scoupe para sa mga grupo:

Mga Saklaw ng Kliyente β€”> Lumikha

Lumikha ng saklawPina-fasten namin ang pahintulot ng ActiveDirectory sa Kubernetes gamit ang Keycloak

At mag-set up ng mapper para sa kanila:

Mga Saklaw ng Kliyente β€”> mga pangkat β€”> Mga Mapper β€”> Lumikha

MapperPina-fasten namin ang pahintulot ng ActiveDirectory sa Kubernetes gamit ang Keycloak

Idagdag ang pagmamapa ng aming mga pangkat sa Default na Saklaw ng Kliyente:

Mga Kliyente β€”> kubernetes β€”> Mga Saklaw ng Kliyente β€”> Default na Saklaw ng Kliyente
piliin grupo Π² Magagamit na Saklaw ng Kliyentei-click Idagdag ang napili

Nakukuha namin ang lihim (at isulat ito sa thread) na gagamitin namin para sa awtorisasyon sa Keycloak:

Mga kliyente β€”> kubernetes β€”> Mga Kredensyal β€”> Lihim
Kinukumpleto nito ang pag-setup, ngunit nagkaroon ako ng error noong, pagkatapos ng matagumpay na awtorisasyon, nakatanggap ako ng error 403. Ulat ng bug.

Ayusin:

Mga Saklaw ng Kliyente β€”> mga tungkulin β€”> Mga Mapper β€”> Lumikha

Mga MapperPina-fasten namin ang pahintulot ng ActiveDirectory sa Kubernetes gamit ang Keycloak

Code ng script

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

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

Pag-configure ng Kubernetes

Kailangan naming tukuyin kung saan matatagpuan ang aming root certificate mula sa site, at kung saan matatagpuan ang OIDC provider.
Upang gawin ito, i-edit ang file /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
...

I-update ang kubeadm config sa cluster:

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

Pagtatakda ng auth-proxy

Maaari mong gamitin ang keycloak gatekeeper upang protektahan ang iyong web application. Bilang karagdagan sa katotohanan na ang reverse proxy na ito ay papahintulutan ang user bago ipakita ang page, ipapasa din nito ang impormasyon tungkol sa iyo sa end application sa mga header. Kaya, kung sinusuportahan ng iyong application ang OpenID, agad na pinahihintulutan ang user. Isaalang-alang ang halimbawa ng Kubernetes Dashboard

Pag-install ng 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'

Pagtatakda ng mga karapatan sa pag-access:

Gumawa tayo ng ClusterRoleBinding na magbibigay ng mga karapatan ng admin ng cluster (karaniwang ClusterRole cluster-admin) para sa mga user sa pangkat na 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

I-install ang 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"

Pagkatapos nito, kapag sinubukan mong pumunta sa kubernetes-dashboard.example.org, ire-redirect tayo sa Keycloak at sa kaso ng matagumpay na awtorisasyon mapupunta tayo sa Dashboard na naka-log in na.

pag-install ng gangway

Para sa kaginhawahan, maaari kang magdagdag ng isang gangway na bubuo ng isang config file para sa kubectl, sa tulong kung saan kami ay makapasok sa Kubernetes sa ilalim ng aming user.


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

Parang ganito. Binibigyang-daan kang agad na i-download ang config file at buuin ito gamit ang isang hanay ng mga command:

Pina-fasten namin ang pahintulot ng ActiveDirectory sa Kubernetes gamit ang Keycloak

Pinagmulan: www.habr.com

Magdagdag ng komento