全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Integrasikan Keycloak dengan ASM untuk mengaktifkan single sign-on pada aplikasi mesh

更新时间:Dec 02, 2025

Topik ini menjelaskan cara menggunakan instans Keycloak yang dikelola sendiri sebagai penyedia identitas (IdP) untuk menyediakan layanan identitas dan mengaktifkan single sign-on (SSO) bagi aplikasi dalam service mesh. Aplikasi dalam service mesh tidak perlu mengimplementasikan logika autentikasi atau otorisasi sendiri. Anda dapat mengonfigurasi layanan otorisasi kustom ASM untuk menggunakan Keycloak dan protokol OpenID Connect (OIDC) guna menerapkan SSO. Setelah autentikasi, permintaan diteruskan ke aplikasi bersama informasi pengguna dari Keycloak.

Prasyarat

Konsep

Konsep

Deskripsi

IdP

IdP adalah sistem yang menyimpan dan memverifikasi identitas digital. Misalnya, Anda dapat menggunakan akun dan password untuk memverifikasi identitas Anda. Jika Anda menggunakan akun dan password Alipay untuk login ke Youku, maka Alipay berperan sebagai IdP.

OIDC

OIDC adalah protokol standar autentikasi identitas berbasis protokol OAuth 2.0. Untuk informasi selengkapnya, lihat situs resmi OpenID.

Scope

Scope adalah konsep dalam OIDC. Setiap IdP menyimpan berbagai jenis informasi pengguna, seperti alamat email. Setiap jenis tersebut berkorespondensi dengan satu scope. Saat Anda menggunakan IdP untuk memverifikasi identitas guna mengakses suatu aplikasi, aplikasi tersebut hanya diizinkan memperoleh jenis informasi yang telah ditentukan.

Prosedur

Langkah 1: Deploy aplikasi demo dan Keycloak

  1. Gunakan file YAML berikut dan jalankan perintah kubectl apply -n default -f <your_yaml_file>.yaml untuk mendeploy aplikasi httpbin ke namespace `default` kluster ACK Anda.

    Perluas untuk melihat YAML

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  2. Gunakan file YAML berikut dan jalankan perintah kubectl apply -n default -f <your_yaml_file>.yaml untuk mendeploy aplikasi Keycloak ke namespace `default` kluster ACK Anda.

    Perluas untuk melihat YAML

    apiVersion: v1
    kind: Service
    metadata:
      name: keycloak
      labels:
        app: keycloak
    spec:
      ports:
      - name: http
        port: 8080
        targetPort: 8080
      selector:
        app: keycloak
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: keycloak
      labels:
        app: keycloak
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: keycloak
      template:
        metadata:
          labels:
            app: keycloak
        spec:
          containers:
          - name: keycloak
            image: quay.io/keycloak/keycloak:latest
            args: ["start-dev"]
            env:
            - name: KEYCLOAK_ADMIN
              value: "admin"
            - name: KEYCLOAK_ADMIN_PASSWORD
              value: "admin"
            - name: KC_PROXY
              value: "edge"
            ports:
            - name: http
              containerPort: 8080
            readinessProbe:
              httpGet:
                path: /realms/master
                port: 8080

Langkah 2: Ekspos aplikasi demo dan Keycloak ke internet melalui gerbang ASM

Contoh ini menggunakan HTTPS pada port 443 untuk mengakses aplikasi demo dan HTTP pada port 80 untuk mengakses konsol Keycloak.

  1. Buat sertifikat bernama myexample-credential untuk layanan HTTPS. Untuk informasi selengkapnya, lihat Aktifkan layanan HTTPS aman menggunakan gerbang ASM.

  2. Gunakan file YAML berikut untuk membuat aturan gateway dan layanan virtual di instans ASM guna mengekspos Keycloak ke internet.

    1. Di Konsol ASM, gunakan file YAML berikut untuk mengonfigurasi aturan gateway pada instans ASM. Untuk informasi selengkapnya, lihat Kelola aturan gateway.

      Perluas untuk melihat YAML

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: ingressgateway
        namespace: istio-system
      spec:
        selector:
          app: istio-ingressgateway // Pastikan selector ini sesuai dengan gateway yang sudah ada.
        servers:
          - hosts:
              - '*'
            port:
              name: http-httpbin // Gunakan HTTPS pada port 443 untuk mengakses aplikasi demo.
              number: 443
              protocol: HTTPS
            tls:
              credentialName: myexample-credential
              mode: SIMPLE
          - hosts:
              - '*'
            port:
              name: keycloak // Gunakan HTTP pada port 80 untuk mengakses konsol Keycloak.
              number: 80
              protocol: HTTP
                                      
    2. Gunakan file YAML berikut untuk membuat layanan virtual untuk instans ASM. Untuk informasi selengkapnya, lihat Kelola layanan virtual.

      Perluas untuk melihat YAML

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: ingressgateway-vs
        namespace: istio-system
      spec:
        gateways:
          - ingressgateway
        hosts:
          - '*'
        http:
          - match:
              - port: 80
            name: keycloak
            route:
              - destination:
                  host: keycloak.default.svc.cluster.local
                  port:
                    number: 8080
          - name: httpbin
            route:
              - destination:
                  host: httpbin.default.svc.cluster.local
                  port:
                    number: 8000
  3. Di browser Anda, buka http://${ingress_gateway_address} untuk mengakses aplikasi Keycloak.3

  4. Klik Administration Console. Login dengan username dan password administrator yang Anda tentukan saat mendeploy Keycloak.

Langkah 3: Konfigurasi Keycloak

  1. Di panel navigasi kiri konsol Keycloak, klik Create Realm dari daftar drop-down Master.2

  2. Pada halaman konfigurasi realm baru, buat client seperti yang ditunjukkan pada gambar berikut.43

  3. Setelah client dibuat, buat pengguna di halaman Realm. Seperti yang ditunjukkan pada gambar berikut, klik Save.4

  4. Di halaman User details, klik tab Credentials.

  5. Di kotak dialog, tetapkan kata sandi logon dan klik Save.设置登录密码

  6. Buat realm role seperti yang ditunjukkan pada gambar berikut dan klik Save.Role

  7. Di halaman User details, klik tab Role mapping.

  8. Di halaman Role mapping, klik Assign role. Tetapkan role yang dibuat pada langkah 6 kepada pengguna saat ini.5

  9. Anda dapat membuat client scope seperti yang ditunjukkan pada gambar berikut. Klik Save.创建ClientScope

  10. Di halaman Client Scope, klik tab Mappers, tambahkan mapper seperti yang ditunjukkan pada gambar berikut, lalu klik Save.13

  11. Klik tab scope. Pilih kotak centang untuk role yang Anda buat pada Langkah 6, lalu klik Assign.8

  12. Di halaman pengaturan client, klik tab client scope dan tambahkan default scope.9

  13. Seperti yang ditunjukkan pada gambar berikut, di kotak Valid redirect URLs, tambahkan URL pengalihan untuk oauth2-proxy kluster. Klik Save.10

Catatan

Pada contoh ini, hanya layanan Keycloak yang menggunakan HTTP. Semua layanan lain menggunakan HTTPS. Oleh karena itu, format redirect URI adalah https://${your_ASM_gateway_address}/oauth2/callback.

Konfigurasi Keycloak telah selesai. Catat informasi berikut:

  • ID realm baru: Test-oidc.

  • ID client yang dibuat di realm: oauth2proxy.

  • client secret dari tab Credentials di halaman pengaturan client.

Langkah 4: Aktifkan otorisasi kustom ASM dan konfigurasikan single sign-on OIDC

  1. Login ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih Mesh Security Center > Custom Authorization Service.

  3. Di halaman Custom Authorization Service, klik Associate Custom Authorization Service, pilih OIDC Identity Authentication And Authorization Service, atur parameter layanan, lalu klik Create.

    关联外部授权服务

    Konfigurasikan parameter berdasarkan informasi aplikasi OpenID Connect (OIDC) yang telah Anda buat. Anda dapat menggunakan gerbang ASM sebagai alamat pengalihan login. Untuk informasi lebih lanjut tentang cookie secret, lihat Generating a Cookie Secret.

    • IdP OIDC Issuer URL: http://${ASM_gateway_address}/realms/${realm_created_in_Keycloak}.

    • ClientID dan Client Secret: Masukkan parameter yang dicatat pada langkah sebelumnya.

    • Scopes: Scope OpenID wajib disertakan. Anda dapat menambahkan scope lain sesuai kebutuhan.

  4. Buat layanan virtual menggunakan file 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: 4180
    Catatan
    • Di bidang route, ganti host dengan nama layanan Oauth2Proxy di namespace istio-system kluster ACK Anda.

    • Untuk mencegah konflik layanan virtual, pastikan tidak ada layanan virtual lain yang mencocokkan path dengan awalan /oauth2.

Langkah 5: Buat kebijakan otorisasi

  1. Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih Mesh Security Center > AuthorizationPolicy.

  2. Di halaman detail kebijakan otorisasi, klik Create With YAML.

  3. Di halaman Create, pilih Namespace dan Scenario Template, konfigurasikan file 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: ingressgateway
    Catatan
    • AuthorizationPolicy menentukan bahwa akses ke semua port kecuali port 80 memerlukan otorisasi.

    • Untuk nama penyedia, masukkan nama layanan otorisasi kustom yang telah Anda asosiasikan. Anda dapat menemukan nama tersebut di daftar layanan otorisasi kustom.

Langkah 6: Verifikasi

  1. Di browser, buka ${External_IP_of_ASM_gateway:80}.

    Hasil yang diharapkan: 1Halaman seperti pada gambar di atas muncul. Hal ini menunjukkan bahwa single sign-on (SSO) telah diaktifkan.

  2. Klik Sign in with OpenID Connect. Di halaman login Keycloak, masukkan akun uji coba dan kata sandi yang Anda buat pada Langkah 3, lalu klik Log On.

    Hasil yang diharapkan: httpbin

  3. Klik Request inspection, lalu pilih /headers > try it out > Execute.

    Hasil yang diharapkan: 11

  4. Di debugger JWT, uraikan Token Web JSON (JWT) dari permintaan pada langkah sebelumnya. Token tersebut adalah nilai setelah Bearer. Untuk informasi selengkapnya, lihat JWT Debugger.

    Hasil yang diharapkan: JWTSetelah token diurai, informasi pengguna dari Keycloak muncul. Hal ini menunjukkan bahwa ASM telah memverifikasi JWT tersebut.