All Products
Search
Document Center

Alibaba Cloud Service Mesh:Konfigurasikan autentikasi JWT untuk gerbang masuk di ASM

Last Updated:Mar 11, 2026

Saat lalu lintas eksternal memasuki service mesh melalui gerbang masuk, Anda perlu memverifikasi bahwa setiap permintaan berasal dari Pengguna sah. Service Mesh (ASM) mendukung autentikasi JSON Web Token (JWT) di gerbang masuk sehingga identitas pengguna akhir dapat divalidasi sebelum permintaan mencapai layanan backend.

Autentikasi JWT di ASM mengandalkan dua resource keamanan Istio:

  • RequestAuthentication — Menentukan cara memvalidasi JWT (issuer dan kunci penandatanganan). Menolak permintaan yang membawa token *tidak valid*, tetapi tetap mengizinkan permintaan yang *tidak memiliki* token.

  • AuthorizationPolicy — Menerapkan aturan akses berdasarkan keberadaan atau klaim JWT. Pasangkan dengan RequestAuthentication untuk memblokir permintaan tanpa token valid.

Penting

Kebijakan RequestAuthentication saja tidak menolak permintaan tanpa token. Untuk mewajibkan JWT valid pada setiap permintaan, Anda juga harus membuat AuthorizationPolicy seperti yang dijelaskan dalam Terapkan persyaratan JWT dengan kebijakan otorisasi.

Panduan ini menjelaskan contoh lengkap: terapkan layanan sampel, buat kebijakan RequestAuthentication, verifikasi validasi token, lalu tambahkan aturan AuthorizationPolicy untuk menerapkan persyaratan token.

Prasyarat

Terapkan layanan uji httpbin

Bagian ini menyebarkan layanan httpbin di belakang gerbang masuk ASM. Jika Anda telah memiliki layanan yang terpapar melalui gerbang tersebut, lanjutkan ke Buat Kebijakan Otentikasi Permintaan.

Aktifkan injeksi sidecar otomatis

  1. Masuk ke Konsol ASM.

  2. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  3. Di halaman detail instans ASM, pilih ASM Instance > Global Namespace di panel navigasi kiri.

  4. Di halaman Global Namespace, temukan namespace default dan klik Enable Automatic Sidecar Proxy Injection di kolom Automatic Sidecar Injection.

  5. Pada pesan Submit, klik OK.

Terapkan httpbin

  1. Sambungkan ke kluster Container Service for Kubernetes (ACK) menggunakan kubectl. Untuk informasi selengkapnya, lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk menyambung ke kluster.

  2. Buat file httpbin.yaml dengan konten berikut:

       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
  3. Terapkan layanan:

       kubectl apply -f httpbin.yaml -n default

Buat gateway Istio dan layanan virtual

  1. Masuk 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 ASM Gateway > Gateway. Di halaman yang muncul, klik Create from YAML.

  3. Pilih default dari daftar drop-down Namespace, tempel YAML berikut ke editor kode, lalu klik Create.

       apiVersion: networking.istio.io/v1beta1
       kind: Gateway
       metadata:
         name: httpbin-gateway
         namespace: default
       spec:
         selector:
           istio: ingressgateway
         servers:
           - hosts:
               - '*'
             port:
               name: http
               number: 80
               protocol: HTTP
  4. Di halaman detail instans ASM, pilih Traffic Management Center > VirtualService di panel navigasi kiri. Klik Create from YAML.

  5. Pilih default dari daftar drop-down Namespace, tempel YAML berikut ke editor kode, lalu klik Create.

       apiVersion: networking.istio.io/v1beta1
       kind: VirtualService
       metadata:
         name: httpbin
         namespace: default
       spec:
         gateways:
           - httpbin-gateway
         hosts:
           - '*'
         http:
           - route:
               - destination:
                   host: httpbin
                   port:
                     number: 8000

Buat kebijakan autentikasi permintaan

Untuk membuat kebijakan RequestAuthentication, pertama-tama hasilkan JSON Web Key (JWK) untuk verifikasi tanda tangan, lalu konfigurasikan kebijakan di Konsol ASM.

Hasilkan JWK

  1. Hasilkan kunci privat RSA 2048-bit dengan OpenSSL:

       openssl genrsa -out rsa-private-key.pem 2048
  2. Ekstrak kunci publik:

       openssl rsa -in rsa-private-key.pem -pubout -out rsa-public-key.pem
  3. Konversi kunci publik ke format JWK. Buka alat online JWK to PEM Convertor, pilih PEM-to-JWK (RSA Only), tempel isi file rsa-public-key.pem ke editor kode, lalu klik submit. Alat ini menghasilkan JWK seperti berikut: Simpan JWK ini untuk langkah berikutnya.

       {
         "kty": "RSA",
         "e": "AQAB",
         "kid": "59399e22-7a9a-45ed-8c76-7add7863915c",
         "n": "2dnwOlDKEwII9Cyh9w7o59a5y3RS2gWUKYC3HSBJL1FhYIZa7sjTCKxwEuG-vCRQkR6augWxYWseSDfgtyivzi3CxxkF8WnQbECOCGm5xAYKmMcXeOpv0zsJTHN122Tt_tsd6K2OC3yGwKtmp7m-MOpHagqWRqFtvyEOm_1JW1-t0n1VsGSeWww8dvcmnJPKAKHbAU40jdV1hMn9AA3RfSpDY6nfrUkpXA5-aQ6rJRjMn36DatZ5ykVL4LKPOUxZdfK_yNIPkCnwIKesqiOpr4s-iCM8pMiZuejDZ1qoX-uBjggESf4G9_L-laDSeoDmXeOZ9kzN3Jw8ay69ihIFEQ"
       }

Konfigurasikan kebijakan RequestAuthentication

  1. Masuk ke Konsol ASM.

  2. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  3. Di halaman Mesh Management, temukan instans ASM dan klik namanya atau klik Manage di kolom Actions.

  4. Pilih Mesh Security Center > RequestAuthentication di panel navigasi kiri. Klik Create.

  5. Konfigurasikan parameter berikut dan klik Create.

    ParameterValue
    NamespacePilih istio-system.
    NameMasukkan nama untuk kebijakan.
    Matching LabelKlik Add Matching Label. Atur Name menjadi istio dan Value menjadi ingressgateway.
    JWT Rule SetKlik Add dan konfigurasikan bidang seperti pada tabel berikut.

    Bidang JWT Rule Set:

    BidangDeskripsiContoh nilai
    issuerIdentifier penerbit JWT.testing@asm.test.io
    audiencesLayanan yang diizinkan menggunakan JWT. Biarkan kosong untuk mengizinkan semua layanan.(kosong)
    jwksKunci penandatanganan dalam format {"keys":[<your-JWK>]}.{"keys":[{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add786****"}]}

    Create request authentication policy

Verifikasi kebijakan autentikasi permintaan

Hasilkan JWT uji

Gunakan alat JWT untuk mengenkripsi token uji coba. Pada bagian Decoded, konfigurasikan bidang-bidang berikut:

  • HEADER: Atur alg menjadi RS256, kid menjadi ID kunci dari JWK Anda, dan typ menjadi JWT.

  • PAYLOAD: Atur iss menjadi testing@asm.test.io. Tambahkan klaim lain sesuai kebutuhan.

  • VERIFY SIGNATURE: Tempel kunci publik dan kunci privat yang dihasilkan di Hasilkan JWK.

JWT encoding tool

Salin string JWT dari bagian Encoded dan simpan dalam variabel lingkungan TOKEN untuk pengujian berikutnya.

Uji kebijakan

Jalankan perintah berikut, ganti <ingress-gateway-ip> dengan alamat IP gerbang masuk Anda.

Permintaan dengan JWT valid:

curl -I -H "Authorization: Bearer $TOKEN" http://<ingress-gateway-ip>/

Tanggapan yang diharapkan:

HTTP/1.1 200 OK
server: istio-envoy
date: Fri, 18 Mar 2022 07:27:54 GMT

Permintaan dengan JWT tidak valid:

curl -I -H "Authorization: Bearer invalidToken" http://<ingress-gateway-ip>/

Tanggapan yang diharapkan:

HTTP/1.1 401 Unauthorized
www-authenticate: Bearer realm="http://<ingress-gateway-ip>/", error="invalid_token"
content-length: 79
content-type: text/plain
date: Fri, 18 Mar 2022 07:59:00 GMT
server: istio-envoy

Permintaan tanpa JWT:

curl -I http://<ingress-gateway-ip>/

Tanggapan yang diharapkan:

HTTP/1.1 200 OK
server: istio-envoy
date: Fri, 18 Mar 2022 07:27:54 GMT

Hasil ini mengonfirmasi bahwa kebijakan RequestAuthentication bekerja dengan benar:

Jenis permintaanHasil yang diharapkanAlasan
JWT valid200 OKToken lolos validasi tanda tangan dan issuer.
JWT tidak valid401 UnauthorizedToken gagal validasi tanda tangan.
Tanpa JWT200 OKRequestAuthentication tidak menolak permintaan tanpa token.
Permintaan tanpa token masih berhasil pada tahap ini. Untuk mewajibkan JWT valid pada setiap permintaan, buat AuthorizationPolicy seperti yang dijelaskan di bagian berikutnya.

Terapkan persyaratan JWT dengan kebijakan otorisasi

Wajibkan JWT valid untuk semua permintaan

AuthorizationPolicy ini menolak permintaan apa pun yang tidak membawa JWT valid.

  1. Masuk ke Konsol ASM.

  2. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  3. Klik nama instans ASM atau klik Manage di kolom Actions.

  4. Pilih Mesh Security Center > AuthorizationPolicy di panel navigasi kiri. Klik Create.

  5. Konfigurasikan parameter berikut dan klik Create. Mengatur RequestPrincipals menjadi * akan mencocokkan semua principal terotentikasi, yang mewajibkan JWT valid pada setiap permintaan.

    ParameterValue
    NameMasukkan nama untuk kebijakan.
    Policy TypePilih ALLOW.
    Gateway ScopeDi tab Gateway Scope, atur ASM Gateway menjadi ingressgateway. Di bagian Add Request Source, aktifkan RequestPrincipals dan masukkan *.

    Create authorization policy -- require valid JWT

Verifikasi

Permintaan tanpa token (sekarang diblokir):

curl -I http://<ingress-gateway-ip>/

Tanggapan yang diharapkan:

HTTP/1.1 401 Unauthorized
www-authenticate: Bearer realm="http://<ingress-gateway-ip>/", error="invalid_token"
content-length: 79
content-type: text/plain
date: Fri, 18 Mar 2022 07:59:00 GMT
server: istio-envoy

Permintaan dengan token valid (tetap diizinkan):

curl -I -H "Authorization: Bearer $TOKEN" http://<ingress-gateway-ip>/

Tanggapan yang diharapkan:

HTTP/1.1 200 OK
server: istio-envoy
date: Fri, 18 Mar 2022 07:27:54 GMT

Permintaan tanpa token sekarang mengembalikan 401 Unauthorized, yang mengonfirmasi bahwa AuthorizationPolicy menerapkan persyaratan JWT.

Batasi akses ke issuer dan subject tertentu

AuthorizationPolicy ini hanya mengizinkan permintaan yang JWT-nya berisi klaim issuer *dan* subject tertentu. Format principal yang diharapkan adalah <issuer>/<subject>.

Dalam contoh ini, hanya JWT dengan iss: testing@asm.test.io dan sub: demo@asm.test.io yang diterima.

  1. Masuk ke Konsol ASM.

  2. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  3. Klik nama instans ASM atau klik Manage di kolom Actions.

  4. Pilih Mesh Security Center > AuthorizationPolicy di panel navigasi kiri. Klik Create.

  5. Konfigurasikan parameter berikut dan klik Create.

    ParameterValue
    NameMasukkan nama untuk kebijakan.
    Policy TypePilih ALLOW.
    Gateway ScopeDi tab Gateway Scope, atur ASM Gateway menjadi ingressgateway. Di bagian Add Request Source, aktifkan RequestPrincipals dan atur nilainya menjadi testing@asm.test.io/demo@asm.test.io.

    Create authorization policy -- specific issuer

Verifikasi

Permintaan dengan JWT asli (hanya iss, tanpa sub) — ditolak:

curl -I -H "Authorization: Bearer $TOKEN" http://<ingress-gateway-ip>/

Tanggapan yang diharapkan:

HTTP/1.1 401 Unauthorized
www-authenticate: Bearer realm="http://<ingress-gateway-ip>/", error="invalid_token"
content-length: 79
content-type: text/plain
date: Fri, 18 Mar 2022 07:59:00 GMT
server: istio-envoy

Kebijakan ini mewajibkan principal testing@asm.test.io/demo@asm.test.io, tetapi JWT asli hanya berisi iss: testing@asm.test.io tanpa klaim sub, sehingga permintaan ditolak.

Hasilkan JWT baru dengan issuer dan subject:

Di alat JWT, perbarui bagian PAYLOAD:

{
  "iss": "testing@asm.test.io",
  "sub": "demo@asm.test.io"
}

Pertahankan semua pengaturan lain seperti sebelumnya.

JWT tool with issuer and subject

Permintaan dengan JWT baru — diizinkan:

curl -I -H "Authorization: Bearer $TOKEN" http://<ingress-gateway-ip>/

Tanggapan yang diharapkan:

HTTP/1.1 200 OK
server: istio-envoy
date: Fri, 18 Mar 2022 07:27:54 GMT

Hanya JWT yang cocok persis dengan principal <issuer>/<subject> yang lolos pemeriksaan otorisasi.

Praktik terbaik

Gunakan jwksUri untuk rotasi kunci

Panduan ini menggunakan jwks inline dengan bahan kunci yang disematkan langsung di kebijakan. Untuk penerapan produksi, gunakan bidang jwksUri untuk mengarah ke titik akhir JSON Web Key Set (JWKS) remote:

  • Mendukung rotasi kunci otomatis tanpa memperbarui resource RequestAuthentication.

  • Mengikuti pola penemuan OpenID Connect (OIDC) standar.

  • Menjaga konfigurasi kebijakan tetap bersih dan mudah dibaca.

Terapkan sikap penolakan default

Selalu pasangkan RequestAuthentication dengan AuthorizationPolicy. RequestAuthentication saja tidak memblokir permintaan tanpa token—hanya menolak token *tidak valid*. Buat kebijakan ALLOW dengan RequestPrincipals: * untuk mewajibkan JWT valid pada setiap permintaan.

Kecualikan jalur pemeriksaan kesehatan

Tidak semua jalur memerlukan autentikasi JWT. Gunakan bidang to.operation.paths di AuthorizationPolicy untuk mengecualikan jalur seperti /healthz atau /readyz dari persyaratan token sambil melindungi titik akhir aplikasi.

Pemecahan masalah

Permintaan mengembalikan 401 meskipun dengan token valid

Kemungkinan penyebabSolusi
Token kedaluwarsaPeriksa klaim exp di muatan JWT. Hasilkan token baru jika sudah kedaluwarsa.
Ketidaksesuaian issuerPastikan klaim iss cocok dengan nilai issuer di kebijakan RequestAuthentication.
Ketidaksesuaian kunciVerifikasi bahwa JWK di kebijakan cocok dengan pasangan kunci yang digunakan untuk menandatangani token. Hasilkan ulang keduanya jika diperlukan.
Selisih waktu jamPastikan jam node kluster tersinkronisasi. Validasi JWT sensitif terhadap perbedaan waktu.

Permintaan mengembalikan 403 setelah menambahkan AuthorizationPolicy

Kemungkinan penyebabSolusi
Principal tidak adaKebijakan ALLOW dengan RequestPrincipals: * mewajibkan JWT valid. Permintaan tanpa token ditolak karena tidak ada principal terotentikasi yang dapat ditetapkan.
Format principal salahSaat membatasi berdasarkan issuer dan subject, format yang diharapkan adalah <issuer>/<subject>. Verifikasi bahwa klaim iss dan sub keduanya ada di JWT Anda.

Kegagalan pengambilan JWKS (saat menggunakan jwksUri)

  • Verifikasi bahwa URL titik akhir JWKS dapat diakses dari dalam mesh.

  • Periksa bahwa titik akhir mengembalikan JSON valid dengan array keys.

  • Tinjau log proxy Envoy untuk pesan kesalahan detail:

      kubectl logs <ingress-gateway-pod> -c istio-proxy

Topik terkait