Kami mempercepat otorisasi ActiveDirectory ke Kubernetes menggunakan Keycloak

Artikel ini telah ditulis untuk memperluas yang sudah ada yang ada, tetapi berbicara tentang fitur bundel dengan Microsoft ActiveDirectory, dan juga melengkapinya.

Pada artikel ini saya akan memberi tahu Anda cara menginstal dan mengkonfigurasi:

  • gantungan kunci adalah proyek sumber terbuka. Yang menyediakan satu titik masuk untuk aplikasi. Bekerja dengan berbagai protokol, termasuk LDAP dan OpenID yang kami minati.
  • penjaga gerbang jubah kunci - membalikkan aplikasi proxy yang memungkinkan Anda mengintegrasikan otorisasi melalui Keycloak.
  • Gang - aplikasi yang menghasilkan konfigurasi untuk kubectl yang dapat digunakan untuk masuk dan terhubung ke API Kubernetes melalui OpenID.

Cara kerja izin di Kubernetes.

Kami dapat mengelola hak pengguna / grup menggunakan RBAC, banyak artikel telah dibuat tentang ini, saya tidak akan membahasnya secara detail. Masalahnya adalah Anda dapat menggunakan RBAC untuk membatasi hak pengguna, tetapi Kubernetes tidak tahu apa-apa tentang pengguna. Ternyata kita membutuhkan mekanisme pengiriman pengguna di Kubernetes. Untuk melakukan ini, kami akan menambahkan penyedia ke OpenID Kuberntes, yang akan mengatakan bahwa pengguna seperti itu benar-benar ada, dan Kubernetes sendiri akan memberinya hak.

Latihan

  • Anda membutuhkan cluster Kubernetes atau minikube
  • Active Directory
  • Domain:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Sertifikat untuk domain atau sertifikat yang ditandatangani sendiri

Saya tidak akan memikirkan cara membuat sertifikat yang ditandatangani sendiri, Anda perlu membuat 2 sertifikat, ini adalah root (Otoritas Sertifikat) dan klien wildcard untuk domain *.example.org

Setelah Anda menerima / mengeluarkan sertifikat, klien harus ditambahkan ke Kubernetes, untuk ini kami membuat rahasia untuknya:

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

Selanjutnya, kita akan menggunakannya untuk pengontrol Ingress kita.

Instalasi Keycloak

Saya memutuskan bahwa cara termudah adalah dengan menggunakan solusi yang sudah jadi untuk ini, yaitu bagan helm.

Instal repositori dan perbarui:

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

Buat file keycloak.yml dengan konten berikut:

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

Pengaturan federasi

Selanjutnya, buka antarmuka web keycloak.example.org

Klik di sudut kiri Tambahkan ranah

kunci
Nilai

Nama
kubernet

Tampilan Nama
Kubernetes

Nonaktifkan verifikasi email pengguna:
Cakupan klien —> Email —> Pemeta —> Email terverifikasi (Hapus)

Kami menyiapkan federasi untuk mengimpor pengguna dari ActiveDirectory, saya akan meninggalkan tangkapan layar di bawah, menurut saya akan lebih jelas.

Federasi pengguna —> Tambah penyedia… —> ldap

Pengaturan federasiKami mempercepat otorisasi ActiveDirectory ke Kubernetes menggunakan Keycloak
Kami mempercepat otorisasi ActiveDirectory ke Kubernetes menggunakan Keycloak

Jika semuanya baik-baik saja, maka setelah menekan tombol Sinkronkan semua pengguna Anda akan melihat pesan tentang keberhasilan impor pengguna.

Selanjutnya kita perlu memetakan kelompok kita

Federasi pengguna --> ldap_localhost --> Mappers --> Buat

Membuat petaKami mempercepat otorisasi ActiveDirectory ke Kubernetes menggunakan Keycloak

Pengaturan klien

Perlu untuk membuat klien, dalam istilah Keycloak, ini adalah aplikasi yang akan diotorisasi darinya. Saya akan menyoroti poin-poin penting dalam tangkapan layar dengan warna merah.

Klien —> Buat

Pengaturan klienKami mempercepat otorisasi ActiveDirectory ke Kubernetes menggunakan Keycloak

Mari buat scoupe untuk grup:

Lingkup Klien —> Buat

Buat ruang lingkupKami mempercepat otorisasi ActiveDirectory ke Kubernetes menggunakan Keycloak

Dan siapkan mapper untuk mereka:

Cakupan Klien —> grup —> Pemeta —> Buat

PemetaKami mempercepat otorisasi ActiveDirectory ke Kubernetes menggunakan Keycloak

Tambahkan pemetaan grup kami ke Cakupan Klien Default:

Klien —> kubernetes —> Cakupan Klien —> Cakupan Klien Default
memilih kelompok в Lingkup Klien yang Tersediaklik Tambahkan yang dipilih

Kami mendapatkan rahasianya (dan menulisnya ke utas) yang akan kami gunakan untuk otorisasi di Keycloak:

Klien —> kubernetes —> Kredensial —> Rahasia
Ini menyelesaikan penyiapan, tetapi saya mengalami kesalahan ketika, setelah otorisasi berhasil, saya menerima kesalahan 403. Laporan bug.

Memperbaiki:

Cakupan Klien —> peran —> Pemeta —> Buat

Pembuat petaKami mempercepat otorisasi ActiveDirectory ke Kubernetes menggunakan Keycloak

Kode skrip

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

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

Mengonfigurasi Kubernet

Kami perlu menentukan di mana sertifikat root kami dari situs berada, dan di mana penyedia OIDC berada.
Untuk melakukannya, edit 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
...

Perbarui konfigurasi kubeadm di klaster:

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

Mengatur auth-proxy

Anda dapat menggunakan keycloak gatekeeper untuk melindungi aplikasi web Anda. Selain fakta bahwa proxy terbalik ini akan mengotorisasi pengguna sebelum menampilkan halaman, itu juga akan meneruskan informasi tentang Anda ke aplikasi akhir di header. Jadi, jika aplikasi Anda mendukung OpenID, maka pengguna langsung diotorisasi. Perhatikan contoh Dasbor Kubernetes

Memasang Dasbor Kubernetes


helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

nilai_dashboard.yaml

enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'

Mengatur hak akses:

Mari buat ClusterRoleBinding yang akan memberikan hak admin klaster (admin klaster ClusterRole standar) untuk pengguna di grup 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

Instal penjaga gerbang keycloak:


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

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

Setelah itu, ketika Anda mencoba untuk pergi ke kubernetes-dashboard.example.org, kami akan dialihkan ke Keycloak dan jika otorisasi berhasil, kami akan masuk ke Dasbor yang sudah masuk.

pemasangan gang

Untuk kenyamanan, Anda dapat menambahkan gangway yang akan menghasilkan file konfigurasi untuk kubectl, yang dengannya kami akan masuk ke Kubernetes di bawah pengguna kami.


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

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

Terlihat seperti ini. Memungkinkan Anda untuk segera mengunduh file konfigurasi dan membuatnya menggunakan serangkaian perintah:

Kami mempercepat otorisasi ActiveDirectory ke Kubernetes menggunakan Keycloak

Sumber: www.habr.com

Tambah komentar