Topik ini menjelaskan cara menggunakan instans Keycloak yang di-host sendiri sebagai penyedia identitas (IdP) untuk mengaktifkan single sign-on bagi aplikasi dalam service mesh Anda. Dengan mengonfigurasi Custom Authorization Service di ASM, Anda dapat menggunakan protokol OIDC untuk mendelegasikan otentikasi dan otorisasi ke Keycloak, sehingga menghilangkan kebutuhan agar setiap aplikasi menerapkan logika keamanannya sendiri. Setelah otorisasi berhasil, permintaan diteruskan ke aplikasi beserta informasi pengguna dari Keycloak.
Prasyarat
Instans ASM telah dibuat. Untuk informasi selengkapnya, lihat Create an ASM instance.
Kluster ACK yang dikelola telah dibuat. Untuk informasi selengkapnya, lihat Create an ACK managed cluster.
Anda telah mengaktifkan injeksi sidecar otomatis untuk namespace
default. Untuk informasi selengkapnya, lihat Enable automatic sidecar injection.
Konsep
|
Konsep |
Deskripsi |
|
IdP |
Identity provider (IdP) adalah layanan yang membuat, memelihara, dan mengelola identitas pengguna serta menyediakan layanan otentikasi. Misalnya, ketika Anda menggunakan akun Google untuk login ke aplikasi pihak ketiga, Google bertindak sebagai IdP. |
|
OIDC |
OpenID Connect (OIDC) adalah protokol otentikasi yang dibangun di atas kerangka OAuth 2.0. Untuk informasi selengkapnya, lihat OpenID Connect. |
|
Scope |
Dalam OIDC, scope menentukan atribut pengguna (seperti email dan informasi profil) yang boleh diakses oleh aplikasi. Selama proses otentikasi, IdP dapat meminta pengguna memberikan izin agar aplikasi mengakses scope tertentu dari data penggunanya. |
Prosedur
Langkah 1: Deploy aplikasi demo dan Keycloak
Gunakan manifes YAML berikut untuk mendeploy aplikasi httpbin ke namespace
defaultdi kluster ACK yang dikelola Anda. Jalankan perintahkubectl apply -n default -f xxx.yaml.Gunakan manifes YAML berikut untuk mendeploy aplikasi Keycloak ke namespace
defaultdi kluster ACK yang dikelola Anda. Jalankan perintahkubectl apply -n default -f xxx.yaml.
Langkah 2: Ekspos aplikasi dan Keycloak melalui gateway
Pada contoh ini, Anda mengakses aplikasi demo melalui HTTPS (port 443) dan konsol Keycloak melalui HTTP (port 80).
Buat sertifikat untuk layanan HTTPS dan beri nama
myexample-credential. Untuk informasi selengkapnya, lihat Enable Secure HTTPS Services by Using an ASM Ingress Gateway.Gunakan YAML berikut untuk membuat Gateway dan VirtualService di kluster ASM guna mengekspos Keycloak ke jaringan publik.
Di Konsol ASM, konfigurasikan Gateway untuk instans ASM yang sesuai. Untuk informasi selengkapnya, lihat Manage gateway rules.
Terapkan VirtualService berikut ke instans ASM. Untuk informasi selengkapnya, lihat Manage virtual services.
Di browser Anda, buka http://${ASM_INGRESS_GATEWAY_ADDRESS} untuk mengakses aplikasi Keycloak.
Klik Administration Console dan login dengan kredensial admin yang Anda konfigurasi saat deployment Keycloak.
Langkah 3: Konfigurasi Keycloak
Di panel navigasi kiri Keycloak, pilih Master dari daftar dropdown lalu klik Create Realm.
Di halaman konfigurasi realm baru, buat client. Di tab General Settings, atur Client type menjadi OpenID Connect dan Client ID menjadi oauth2proxy. Di tab Capability config, aktifkan Client authentication, nonaktifkan Authorization, dan di bagian Authentication flow, centang hanya kotak Standard flow dan Direct access grants.
Buat pengguna di realm tersebut. Atur Username menjadi asm-test dan aktifkan Email verified. Lalu, klik Save.
Di halaman User details, klik tab Credentials.
Atur kata sandi untuk pengguna tersebut. Atur Temporary menjadi Off lalu klik Save.
Buat role realm. Atur Role name menjadi test-role lalu klik Save.
Di halaman User details, pilih tab Role mapping.
Di halaman Role mapping, klik Assign role. Tetapkan role
test-rolekepada pengguna tersebut.Buat client scope. Atur Name menjadi test_scope dan Protocol menjadi OpenID Connect. Aktifkan Display on consent screen dan Include in token scope. Lalu, klik Save.
Di halaman Client Scope, klik tab Mappers lalu tambahkan mapper. Atur Mapper type menjadi Audience dan Name menjadi test-mapper. Untuk Included Client Audience, pilih oauth2proxy, dan aktifkan Add to access token. Lalu, klik Save.
Klik tab Scope, centang kotak di samping role
test-role, lalu klik Assign.Di halaman pengaturan client, klik tab Client scopes lalu tambahkan client scope
test_scopesebagai default scope.Tambahkan Valid redirect URIs untuk oauth2-proxy kluster. Di tab Settings, pada bagian Access settings, masukkan
https://${ASM ingress gateway address}/oauth2/callbackke dalam bidang Valid redirect URIs lalu klik Save.
Pada contoh ini, hanya layanan Keycloak yang menggunakan protokol HTTP. Semua layanan lain menggunakan HTTPS. Oleh karena itu, format redirect URI adalah https://${ASM_INGRESS_GATEWAY_ADDRESS}/oauth2/callback.
Keycloak kini telah dikonfigurasi. Catat informasi berikut:
ID realm baru: Test-oidc.
Client ID yang dibuat di realm: oauth2proxy.
client secret pada subtab Credentials di pengaturan client.
Langkah 4: Aktifkan otorisasi kustom dan SSO OIDC
-
Login ke ASM console. Di panel navigasi kiri, pilih .
-
Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
Di halaman External Authorization Service, klik Register External Authorization Service dan pilih OIDC Authz and Authn Service. Atur parameter untuk Layanan Otentikasi dan Otorisasi Identitas OIDC lalu klik Create.
Di panel Associate Custom Authorization Service, pilih OIDC Identity Authentication and Authorization Service sebagai tipe dan konfigurasikan parameternya.
Masukkan informasi dari client OIDC yang Anda buat di Keycloak. Anda dapat menggunakan ingress gateway ASM sebagai redirect URI untuk login. Untuk informasi lebih lanjut tentang cookie secret, lihat Generating a Cookie Secret.
IdP OIDC Issuer URL: http://${ASM_INGRESS_GATEWAY_ADDRESS}/realms/${REALM_NAME_IN_KEYCLOAK}.
ClientID dan Client Secret: Gunakan nilai yang telah Anda catat pada langkah sebelumnya.
Scopes:
OpenIDadalah scope wajib. Anda dapat menentukan scope lainnya.
Buat VirtualService menggunakan YAML berikut.
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: oauth2-vs namespace: istio-system spec: gateways: - ingressgateway hosts: - '*' http: - match: - uri: prefix: /oauth2 name: oauth2 route: - destination: host: asm-oauth2proxy-httpextauth-oidc.istio-system.svc.cluster.local port: number: 4180CatatanGanti nilai bidang
hostdi bagianroutedengan nama layanan oauth2-proxy di namespaceistio-systemkluster ACK Anda.Untuk mencegah konflik VirtualService, hindari memiliki VirtualService lain yang mencocokkan path dengan awalan /oauth2.
Langkah 5: Buat kebijakan otorisasi
-
Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
Di halaman AuthorizationPolicy, klik Create from YAML.
Di halaman Create, pilih Namespaces dan Scenario Template, konfigurasikan manifes YAML berikut, lalu klik Create.
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: oidc namespace: istio-system spec: action: CUSTOM provider: name: httpextauth-oidc rules: - to: - operation: notPorts: - '80' selector: matchLabels: istio: ingressgatewayCatatanAuthorizationPolicy ini menentukan bahwa semua permintaan ke port selain port 80 memerlukan otorisasi.
Untuk
provider.name, masukkan nama layanan otorisasi kustom terkait Anda. Anda dapat menemukan nama ini di daftar pada halaman Custom Authorization Service.
Langkah 6: Verifikasi integrasi
Di browser Anda, buka http://${ASM_INGRESS_GATEWAY_ADDRESS}:80.
Hasil yang diharapkan: Halaman login OAuth2 Proxy muncul dengan tombol Sign in with OpenID Connect, yang menunjukkan bahwa single sign-on telah diaktifkan.
Klik Sign in with OpenID Connect. Di halaman login Keycloak, masukkan kredensial pengguna uji yang dibuat pada Langkah 3 lalu klik Log In.
Hasil yang diharapkan: Setelah login, halaman httpbin.org ditampilkan. Halaman tersebut mencakup kategori API seperti HTTP Methods, Auth, Status codes, dan Request Inspection.
Klik Request inspection, lalu pilih .
Hasil yang diharapkan: Di bagian Server response, badan respons berisi informasi header permintaan, termasuk bidang Authorization: Bearer {JWT}. Hal ini menunjukkan bahwa permintaan membawa token JWT yang dikeluarkan oleh Keycloak.
Dekode token JWT dari langkah sebelumnya (string setelah
Bearer) menggunakan debugger JWT. Untuk informasi lebih lanjut tentang debugger JWT, lihat JWT debugger.Hasil yang diharapkan: Setelah token berhasil didekode, token yang didekode menunjukkan bahwa algoritma di HEADER adalah RS256 dan PAYLOAD berisi klaim seperti realm_access (informasi role), preferred_username (username), dan client_id (oauth2proxy). Hal ini mengonfirmasi bahwa JWT telah diverifikasi oleh ASM dan mencakup informasi pengguna yang disimpan di Keycloak.