Artikel ini telah ditulis untuk memperluas yang sudah ada
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
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 federasi
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 peta
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 klien
Mari buat scoupe untuk grup:
Lingkup Klien —> Buat
Buat ruang lingkup
Dan siapkan mapper untuk mereka:
Cakupan Klien —> grup —> Pemeta —> Buat
Pemeta
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.
Memperbaiki:
Cakupan Klien —> peran —> Pemeta —> Buat
Pembuat peta
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
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:
Sumber: www.habr.com