Integrasi SSO Keycloak
Ikhtisar
Panduan ini menyediakan petunjuk langkah demi langkah untuk mengintegrasikan Keycloak Single Sign-On (SSO) dengan platform Glasswall Halo dalam lingkungan on-premises offline (air-gapped).
Panduan ini mengasumsikan Anda telah menerapkan platform Halo Single Node (misalnya, pada VM melalui Proxmox atau ESXi) dan sekarang ingin mengaktifkan SSO berbasis OIDC menggunakan Keycloak.
Anda akan mempelajari cara:
- Menyiapkan server Keycloak dengan HTTPS dalam lingkungan offline (menggunakan image container yang telah dimuat sebelumnya atau instalasi VM manual).
- Impor dan sesuaikan konfigurasi Keycloak
glasswall-realm.jsonyang disediakan. - Konfigurasikan sertifikat TLS dan resolusi DNS/host untuk Keycloak dan Halo.
- Deploy the Halo portal and related services:
cdrplatform-portalcdrplatform-portalaccesscdrplatform-api-access
Panduan Integrasi SSO Keycloak untuk Glasswall Halo
- Prasyarat
- Langkah 1 - Mengonfigurasi keycloak untuk Glasswall Halo SSO
- Langkah 2 - Sertifikat TLS dan pertimbangan DNS
- Langkah 3 - Menerapkan layanan Halo dengan Keycloak SSO (konfigurasi Helm)
- Langkah 4 - Validasi dan pengujian integrasi SSO
- Langkah 5 - Pemecahan masalah
Prasyarat
Persyaratan lingkungan
- Pengaturan ini ditujukan untuk lingkungan air-gapped atau on-premises yang sangat ketat.
- Cluster Halo Single Node harus sudah diterapkan.
- Resolusi DNS internal harus sudah tersedia, baik melalui server DNS lokal maupun secara manual melalui entri
/etc/hosts. - Keycloak harus diinstal secara lokal pada host atau mesin virtual. → Dokumentasi & instalasi Keycloak
Sumber daya yang diperlukan
- File realm yang telah dikonfigurasi sebelumnya (
glasswall-realm.json), disediakan oleh Glasswall Support. - Akses lokal ke chart Helm Halo untuk deployment di dalam cluster Single Node Halo.
Konfigurasi DNS/hosts
Pastikan hostname untuk server Keycloak Anda dapat di-resolve oleh mesin klien dan komponen platform Halo.
- Dengan DNS internal: buat record A untuk
keycloak.dev.localyang mengarah ke alamat IP server Keycloak. - Tanpa DNS internal: tambahkan entri berikut ke file
hostspada setiap mesin yang memerlukan akses:
Langkah 1 - Mengonfigurasi Keycloak untuk SSO Glasswall Halo
Glasswall menyediakan konfigurasi realm Keycloak (sebagai file JSON) yang mendefinisikan realm, client, role, dan scope yang diperlukan untuk SSO Halo.
Anda dapat mengimpor konfigurasi ini untuk menghindari penyiapan manual. Dalam penyiapan offline, lakukan ini melalui UI Admin Keycloak.
1.1 - Mengimpor konfigurasi realm Glasswall
A. Dapatkan ekspor realm: Anda seharusnya memiliki file bernama glasswall-realm.json. File ini berisi pengaturan realm untuk SSO Halo.
Ringkasan realm Glasswall
Realm Glasswall mencakup item yang telah dikonfigurasi sebelumnya berikut ini:
-
ID Realm: Glasswall
-
Klien
- Halo-portal-client
- Halo-API-access
- Halo-portal-access
-
Peran utama
- Tingkat realm: admin, user
- Tingkat klien: peran admin dan user klien Halo.
- Cakupan klien (sudah dikonfigurasi sebelumnya dengan mapper):
- Portaluserscope: klaim yang diperlukan (roles, email) ke token.
-
Masa berlaku token
- Batas waktu idle sesi SSO: 30 menit
-
Autentikasi: username/password standar.
B. Masuk ke Admin Keycloak
- Menggunakan browser web, buka Keycloak Admin Console di
https://<KEYCLOAK_HOST>:8443/dan masuk dengan akun master admin.

C. Impor realm.
- Di konsol admin, pilih dropdown yang saat ini menampilkan "Master" lalu klik Create realm.

- Dari layar Create realm, pilih Import, lalu unggah file
glasswall-realm.json.

- Keycloak will parse the file and populate the realm name (e.g.,
glasswall).- Konfirmasikan impor.

D. Verifikasi pengaturan realm
- After import, review key settings and ensure:
- Nama realm adalah
glasswall. - Realm diaktifkan.
- SSL required: kemungkinan disetel ke
external. - Clients should include:
halo-portal-clienthalo-portal-accesshalo-api-access
- Nama realm adalah

1.2 Menyesuaikan pengaturan client (hostname dan URI pengalihan)
Selanjutnya, untuk masing-masing client Halo, perbarui konfigurasi agar sesuai dengan environment Anda.
Halo-portal-client (frontend portal)

Valid redirect URIs: ganti domain placeholder dalam JSON realm dengan domain portal Anda yang sebenarnya. Konfigurasi contoh menggunakan domain uji (misalnya, https://pvetest.cdr.glasswall.dev/authentication/login-callback). Perbarui nilai ini agar sesuai dengan URL yang akan digunakan pengguna untuk mengakses portal Halo Anda.
Sebagai contoh, jika portal Halo Anda tersedia di https://halo.dev.local/ dan path callback login aplikasi adalah /authentication/login-callback, setel:
- Valid redirect URIs:
https://halo.dev.local/authentication/* - Web origins:
https://halo.dev.local - Root URL (opsional):
https://halo.dev.local - Valid post logout redirect URIs:
https://halo.dev.local/authentication/logout-callback

Halo-portal-access (backend portal)
- Valid redirect URIs: (e.g.,
https://pvetest.cdr.glasswall.dev/*)- Perbarui ke domain portal Anda.
- Web origins:
https://halo.dev.local
Halo-API-access
- Biarkan pengaturan redirect apa adanya, lalu simpan pengaturan setiap client.

1.3 Membuat pengguna dan menetapkan peran
Sekarang Anda akan membuat pengguna dan menetapkan peran Halo.

A. Di realm glasswall, buka Users → Add user.
B. Isi Username dan detailnya.
C. Di bagian Credentials, tetapkan kata sandi dan hapus centang "Temporary".
D. Di Role mappings, tetapkan:
- Realm roles:
AdminUser
- Client roles:
halo-portal-client[Admin, user]halo-api-access[Admin, user]halo-portal-access[Admin, user]

Pengguna Admin melihat:

Dan dapat mengelola:

Termasuk:

Langkah 2 - Sertifikat TLS dan pertimbangan DNS
Pastikan kepercayaan TLS dan DNS yang tepat untuk semua komponen.
2.1 Kepercayaan TLS
Layanan platform Halo (Portal, Portal-Access, API-Access) harus mempercayai sertifikat Keycloak.
2.2 DNS dan /etc/hosts
Pastikan:
- Hostname Keycloak dapat di-resolve untuk semua layanan dan pengguna
- Domain Halo juga dapat di-resolve
Langkah 3 - Mendeploy layanan Halo dengan Keycloak SSO (konfigurasi Helm)
Halo dideploy melalui Helm; lingkungan offline menggunakan chart yang dibundel dengan sistem.
Deploy portal Halo
portal_image_tag=$(k get deploy portal -o json | jq -r '.spec.template.spec.containers[0].image' | cut -d":" -f2)
portal_domain="glasswall.example.com"
keycloak_domain="keycloak.example.com"
helm upgrade --install cdrplatform-portal ./cdrplatform-portal \
--set image.tag="${portal_image_tag:?}" \
--set image.pullPolicy=IfNotPresent \
--set ingress.tls.enabled=true \
--set ingress.tls.domain="${portal_domain:?}" \
--set ingress.tls.secretName="tls-secret" \
--set configuration.BackendUrl="https://${portal_domain:?}" \
--set configuration.HaloVersion="2.12.0" \
--set configuration.EnabledPages="SystemSettings\,PolicySettings\,ValidationSettings" \
--set configuration.OIDC.ProviderOptions.Authority="https://${keycloak_domain:?}/realms/glasswall" \
--set configuration.OIDC.ProviderOptions.ClientId="halo-portal-client" \
--set configuration.OIDC.ProviderOptions.RedirectUri="https://${portal_domain:?}/authentication/login-callback" \
--set configuration.OIDC.ProviderOptions.PostLogoutRedirectUri="https://${portal_domain:?}/authentication/logout-callback" \
--set configuration.OIDC.ProviderOptions.Scope="openid profile api://cdrplatform-portal-access/PortalUserScope" \
--set configuration.OIDC.ProviderOptions.SilentCheckSsoRedirectUri="https://${portal_domain:?}/silent-check-sso.html" \
--set appenvironment.HTTP_CSP_FRAME_SRC="'self' https://${keycloak_domain:?} https://${portal_domain:?}/silent-check-sso.html" \
--set appenvironment.HTTP_CSP_CONNECT_SRC="'self' https://${keycloak_domain:?}" \
--set configuration.Authentication__Schemes__Bearer__RequireHttpsMetadata=true \
--set configuration.Authentication__Schemes__Bearer__MetadataAddress="https://${keycloak_domain:?}/realms/glasswall/.well-known/openid-configuration" \
--set configuration.Logging__LogLevel__Keycloak="Debug" \
--atomic
Deploy portal-access
image_tag=$(k get deploy portal-access -o json | jq -r '.spec.template.spec.containers[0].image' | cut -d":" -f2)
portal_domain="glasswall.example.com"
keycloak_domain="keycloak.example.com"
helm upgrade --install cdrplatform-portal-access ./cdrplatform-portal-access \
--set image.tag="${image_tag:?}" \
--set image.pullPolicy=IfNotPresent \
--set ingress.tls.domain="${portal_domain:?}" \
--set ingress.tls.enabled=true \
--set ingress.tls.secretName="tls-secret" \
--set configuration.AuthenticationScheme="Bearer" \
--set configuration.Authentication__Schemes__Bearer__ValidAudiences__0="api://cdrplatform-portal-access" \
--set configuration.Authentication__Schemes__Bearer__ValidIssuer="https://${keycloak_domain:?}/realms/glasswall" \
--set configuration.Authentication__Schemes__Bearer__Authority="https://${keycloak_domain:?}/realms/glasswall" \
--set configuration.Authentication__Schemes__Bearer__RequireHttpsMetadata=true \
--set configuration.Authentication__Schemes__Bearer__MetadataAddress="https://${keycloak_domain:?}/realms/glasswall/.well-known/openid-configuration" \
--set configuration.Authentication__Schemes__Bearer__JwksUri="https://${keycloak_domain:?}/realms/glasswall/protocol/openid-connect/certs" \
--atomic
Deploy API-access
api_access_image_tag=$(k get deploy api-access -o json | jq -r '.spec.template.spec.containers[0].image' | cut -d":" -f2)
portal_domain="test.cdr.glasswall.dev"
keycloak_domain="pbkc.cdr.glasswall.dev"
helm upgrade --install cdrplatform-api-access ./cdrplatform-api-access \
--set image.tag="${api_access_image_tag:?}" \
--set image.pullPolicy=IfNotPresent \
--set ingress.tls.enabled=true \
--set ingress.tls.secretName="tls-secret" \
--set ingress.tls.domain="${portal_domain:?}" \
--set configuration.AuthenticationScheme="Bearer" \
--set configuration.Authentication__Schemes__Bearer__ValidAudiences__0="api://cdrplatform-api-access" \
--set configuration.Authentication__Schemes__Bearer__ValidIssuer="https://${keycloak_domain:?}/realms/glasswall" \
--set configuration.Authentication__Schemes__Bearer__Authority="https://${keycloak_domain:?}/realms/glasswall" \
--set configuration.Authentication__Schemes__Bearer__RequireHttpsMetadata=true \
--set configuration.Authentication__Schemes__Bearer__MetadataAddress="https://${keycloak_domain:?}/realms/glasswall/.well-known/openid-configuration" \
--set configuration.Authentication__Schemes__Bearer__JwksUri="https://${keycloak_domain:?}/realms/glasswall/protocol/openid-connect/certs" \
--atomic
3.1 Daftar periksa pascadeployment
- Pastikan pod berjalan (tidak ada
CrashLoopBackOff). - Periksa juga bahwa log menampilkan konfigurasi OIDC Keycloak yang berhasil.

Langkah 4 - Validasi dan pengujian integrasi SSO

4.1 Uji login browser
A. Buka portal Halo. B. Anda akan diarahkan ke login Keycloak.

C. Masuk ke akun Anda.

D. Kembali ke Halo setelah berhasil diautentikasi.

Langkah 5 - Pemecahan masalah
Redirect URI salah konfigurasi
Periksa apakah URI cocok antara portal dan Keycloak.
Clock skew
Sinkronkan jam sistem.
Kesalahan kepercayaan TLS
Pastikan Halo memercayai sertifikat Keycloak.