Kami mengikat kebenaran ActiveDirectory kepada Kubernetes menggunakan Keycloak

Artikel ini telah ditulis untuk mengembangkan lagi sedia ada, tetapi bercakap tentang ciri berkas dengan Microsoft ActiveDirectory, dan juga melengkapkannya.

Dalam artikel ini saya akan memberitahu anda cara memasang dan mengkonfigurasi:

  • Jubah kunci ialah projek sumber terbuka. Yang menyediakan satu titik kemasukan untuk permohonan. Berfungsi dengan banyak protokol, termasuk LDAP dan OpenID yang kami minati.
  • penjaga pintu kunci - aplikasi proksi terbalik yang membolehkan anda menyepadukan kebenaran melalui Keycloak.
  • Gangway - aplikasi yang menjana konfigurasi untuk kubectl yang dengannya anda boleh log masuk dan menyambung ke API Kubernetes melalui OpenID.

Cara kebenaran berfungsi dalam Kubernetes.

Kami boleh menguruskan hak pengguna / kumpulan menggunakan RBAC, banyak artikel telah dibuat mengenai perkara ini, saya tidak akan membincangkan perkara ini secara terperinci. Masalahnya ialah anda boleh menggunakan RBAC untuk menyekat hak pengguna, tetapi Kubernetes tidak tahu apa-apa tentang pengguna. Ternyata kami memerlukan mekanisme penghantaran pengguna dalam Kubernetes. Untuk melakukan ini, kami akan menambah penyedia pada OpenID Kuberntes, yang akan mengatakan bahawa pengguna sedemikian benar-benar wujud, dan Kubernetes sendiri akan memberinya hak.

Latihan

  • Anda memerlukan kluster Kubernetes atau minikube
  • Active Directory
  • Domain:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Sijil untuk domain atau sijil yang ditandatangani sendiri

Saya tidak akan memikirkan cara membuat sijil yang ditandatangani sendiri, anda perlu mencipta 2 sijil, ini ialah akar (Pihak Berkuasa Sijil) dan klien kad bebas untuk domain *.example.org

Selepas anda menerima / mengeluarkan sijil, pelanggan mesti ditambahkan ke Kubernetes, untuk ini kami mencipta rahsia untuknya:

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

Seterusnya, kami akan menggunakannya untuk pengawal Ingress kami.

Pemasangan Keycloak

Saya memutuskan bahawa cara paling mudah ialah menggunakan penyelesaian sedia untuk ini, iaitu carta helm.

Pasang repositori dan kemas kini:

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

Buat fail keycloak.yml dengan kandungan berikut:

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

Persediaan Persekutuan

Seterusnya, pergi ke antara muka web keycloak.example.org

Klik di sudut kiri Tambah alam

Utama
nilai

Nama
Kubernetes

Nama Paparan
Kubernetes

Lumpuhkan pengesahan e-mel pengguna:
Skop pelanggan β€”> E-mel β€”> Pemeta β€”> E-mel disahkan (Padam)

Kami menyediakan persekutuan untuk mengimport pengguna dari ActiveDirectory, saya akan meninggalkan tangkapan skrin di bawah, saya fikir ia akan menjadi lebih jelas.

Persekutuan pengguna β€”> Tambah pembekal... β€”> ldap

Persediaan PersekutuanKami mengikat kebenaran ActiveDirectory kepada Kubernetes menggunakan Keycloak
Kami mengikat kebenaran ActiveDirectory kepada Kubernetes menggunakan Keycloak

Jika semuanya baik, maka selepas menekan butang Segerakkan semua pengguna anda akan melihat mesej tentang pengimportan pengguna yang berjaya.

Seterusnya kita perlu memetakan kumpulan kita

Persekutuan pengguna --> ldap_localhost --> Pemeta --> Cipta

Mencipta pemetaKami mengikat kebenaran ActiveDirectory kepada Kubernetes menggunakan Keycloak

Persediaan pelanggan

Ia adalah perlu untuk membuat pelanggan, dari segi Keycloak, ini adalah aplikasi yang akan diberi kuasa daripadanya. Saya akan menyerlahkan perkara penting dalam tangkapan skrin dengan warna merah.

Pelanggan -> Buat

Persediaan pelangganKami mengikat kebenaran ActiveDirectory kepada Kubernetes menggunakan Keycloak

Mari buat scoupe untuk kumpulan:

Skop Pelanggan -> Buat

Buat skopKami mengikat kebenaran ActiveDirectory kepada Kubernetes menggunakan Keycloak

Dan sediakan pemeta untuk mereka:

Skop Pelanggan β€”> kumpulan β€”> Pemeta β€”> Cipta

MapperKami mengikat kebenaran ActiveDirectory kepada Kubernetes menggunakan Keycloak

Tambahkan pemetaan kumpulan kami pada Skop Pelanggan Lalai:

Pelanggan β€”> kubernetes β€”> Skop Pelanggan β€”> Skop Pelanggan Lalai
pilih kumpulan Π² Skop Pelanggan Tersedia, tekan Tambah yang dipilih

Kami mendapat rahsia (dan menulisnya ke benang) yang akan kami gunakan untuk kebenaran dalam Keycloak:

Pelanggan β€”> kubernetes β€”> Bukti kelayakan β€”> Rahsia
Ini melengkapkan persediaan, tetapi saya mengalami ralat apabila, selepas kebenaran berjaya, saya menerima ralat 403. Laporan pepijat.

Menetapkan:

Skop Pelanggan β€”> peranan β€”> Pemeta β€”> Cipta

PemetaanKami mengikat kebenaran ActiveDirectory kepada Kubernetes menggunakan Keycloak

Kod skrip

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

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

Mengkonfigurasi Kubernetes

Kami perlu menentukan di mana sijil akar kami dari tapak terletak, dan lokasi penyedia OIDC berada.
Untuk melakukan ini, edit fail /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
...

Kemas kini konfigurasi kubeadm dalam kluster:

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

Menetapkan proksi pengesahan

Anda boleh menggunakan penjaga pintu kunci untuk melindungi aplikasi web anda. Sebagai tambahan kepada fakta bahawa proksi terbalik ini akan membenarkan pengguna sebelum memaparkan halaman, ia juga akan menghantar maklumat tentang anda kepada aplikasi akhir dalam pengepala. Oleh itu, jika aplikasi anda menyokong OpenID, maka pengguna diberi kuasa serta-merta. Pertimbangkan contoh Papan Pemuka Kubernetes

Memasang Papan Pemuka Kubernetes


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'

Menetapkan hak akses:

Mari buat ClusterRoleBinding yang akan memberikan hak pentadbir kluster (pentadbir kluster ClusterRole standard) untuk pengguna dalam kumpulan 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

Pasang penjaga pintu kunci:


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"

Selepas itu, apabila anda cuba pergi ke kubernetes-dashboard.example.org, kami akan diubah hala ke Keycloak dan sekiranya kebenaran berjaya kami akan sampai ke Papan Pemuka yang telah dilog masuk.

pemasangan gangway

Untuk kemudahan, anda boleh menambah gangway yang akan menjana fail konfigurasi untuk kubectl, dengan bantuan yang kami akan masuk ke Kubernetes di bawah pengguna kami.


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

Nampak macam ni. Membolehkan anda memuat turun fail konfigurasi dengan segera dan menjananya menggunakan satu set arahan:

Kami mengikat kebenaran ActiveDirectory kepada Kubernetes menggunakan Keycloak

Sumber: www.habr.com

Tambah komen