Kami mempercepat otorisasi ActiveDirectory ke Kubernetes dengan Keycloak

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

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

  • Keycloak adalah proyek sumber terbuka. Yang menyediakan titik masuk tunggal untuk aplikasi. Ia bekerja dengan banyak protokol, termasuk LDAP dan OpenID yang menarik minat kami.
  • Gatekeeper Keycloak - aplikasi proxy terbalik yang memungkinkan Anda untuk mengintegrasikan otorisasi melalui Keycloak.
  • Gangway - aplikasi yang menghasilkan konfigurasi untuk kubectl yang dengannya Anda dapat login dan terhubung ke API Kubernetes via OpenID

Bagaimana hak bekerja di Kubernetes.


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

Latihan

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

Saya tidak akan membahas cara membuat sertifikat yang ditandatangani sendiri, Anda harus membuat 2 sertifikat, ini adalah root (Certificate Authority) dan wildcard client untuk domain * .example.org

Setelah Anda menerima / menulis sertifikat, klien harus ditambahkan ke Kubernetes, untuk ini buat rahasia untuk itu:

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

Selanjutnya kita akan menggunakannya untuk pengontrol Ingress kita

Instal Keycloak


Saya memutuskan bahwa cara termudah untuk menggunakan solusi siap pakai untuk ini, yaitu helm chart-s.

Instal repositori dan perbarui:

helm repo add codecentric https://codecentric.imtqy.com/helm-charts
helm repo update

Buat file keycloak.yml dengan konten 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


Pengaturan Federasi


Selanjutnya, buka antarmuka web keycloak.example.org

Di sudut kiri, klik Tambahkan ranah
KunciNilai
Namakubernet
Nama tampilanKubernetes

Kami mematikan verifikasi konfirmasi email pengguna: Ruang
lingkup klien -> Email -> Pemetaan -> Email diverifikasi (Hapus) Kami

mengkonfigurasi federasi untuk mengimpor pengguna dari ActiveDirectory, saya akan meninggalkan tangkapan layar di bawah, saya pikir itu akan menjadi lebih jelas.

Federasi pengguna -> Tambahkan penyedia ... -> ldap

Pengaturan Federasi



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

Selanjutnya, kita perlu memetakan grup kami

Federasi pengguna -> ldap_localhost -> Pemetaan -> Buat

Penciptaan Mapper


Pengaturan klien


Diperlukan untuk membuat klien, dalam hal Keycloak adalah aplikasi yang akan diotorisasi olehnya. Saya akan menyoroti poin-poin penting dalam tangkapan layar berwarna merah.

Klien -> Buat

Pengaturan klien


Buat pembesar untuk grup:

Lingkup Klien -> Buat

Membuat scoupe


Dan konfigurasikan mapper untuk mereka:

Lingkup Klien -> grup -> Pemetaan -> Buat

Mapper


Tambahkan pemetaan grup kami ke Cakupan Klien Default:

Klien -> kubernetes -> Cakupan Klien -> Cakupan Klien Default
Pilih grup dalam Cakupan Klien Yang Tersedia , klik Tambahkan yang dipilih.

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

Klien -> kubernetes -> Kredensial -> Rahasia
Ini adalah akhir dari pengaturan, tetapi saya mendapatkan kesalahan ketika setelah otorisasi yang berhasil saya mendapat kesalahan 403. Laporan bug .

Perbaiki:

Cakupan Klien -> peran -> Pemetaan -> Buat

Mapper


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();


Konfigurasikan Kubernet


Kami perlu menunjukkan di mana sertifikat root kami dari situs berada, dan di mana penyedia OIDC berada.
Untuk melakukan ini, 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 kubeadm config di cluster:

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


Konfigurasikan auth-proxy


Anda dapat menggunakan gatekeeper keycloak untuk melindungi aplikasi web Anda. Selain fakta bahwa proksi terbalik ini akan mengotorisasi pengguna sebelum menampilkan halaman, sehingga proksi juga akan mengirimkan informasi tentang Anda di header ke aplikasi terakhir. Dengan demikian, jika aplikasi Anda mendukung OpenID, maka pengguna segera masuk. Mari kita lihat contoh Dashboard Kubernetes

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


Pengaturan izin:


Buat ClusterRoleBinding yang akan memberikan hak admin cluster (standar ClusterRole cluster-admin) 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 keycloak gatekeeper:



helm repo add gabibbo97 https://gabibbo97.imtqy.com/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"


Setelah itu, ketika Anda mencoba membuka kubernetes-dashboard.example.org , Anda akan dialihkan ke Keycloak dan, jika otorisasi berhasil, kami sudah akan masuk ke Dashboard.

Instalasi gangway


Untuk kenyamanan, Anda dapat menambahkan gangway yang akan menghasilkan file config untuk kubectl, yang dengannya kita sudah 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-----


Itu terlihat seperti ini. Memungkinkan Anda untuk segera mengunduh file konfigurasi dan membuatnya menggunakan seperangkat perintah:


All Articles