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.
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
Kluster yang telah ditambahkan ke instans ASM. Untuk informasi selengkapnya, lihat Tambahkan kluster ke instans ASM.
Layanan ingress gateway yang telah diterapkan. Untuk informasi selengkapnya, lihat Buat ingress gateway.
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
Masuk ke Konsol ASM.
Di panel navigasi kiri, pilih Service Mesh > Mesh Management.
Di halaman detail instans ASM, pilih ASM Instance > Global Namespace di panel navigasi kiri.
Di halaman Global Namespace, temukan namespace default dan klik Enable Automatic Sidecar Proxy Injection di kolom Automatic Sidecar Injection.
Pada pesan Submit, klik OK.
Terapkan httpbin
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.
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: 80Terapkan layanan:
kubectl apply -f httpbin.yaml -n default
Buat gateway Istio dan layanan virtual
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.
Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih ASM Gateway > Gateway. Di halaman yang muncul, klik Create from YAML.
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: HTTPDi halaman detail instans ASM, pilih Traffic Management Center > VirtualService di panel navigasi kiri. Klik Create from YAML.
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
Hasilkan kunci privat RSA 2048-bit dengan OpenSSL:
openssl genrsa -out rsa-private-key.pem 2048Ekstrak kunci publik:
openssl rsa -in rsa-private-key.pem -pubout -out rsa-public-key.pemKonversi kunci publik ke format JWK. Buka alat online JWK to PEM Convertor, pilih PEM-to-JWK (RSA Only), tempel isi file
rsa-public-key.pemke 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
Masuk ke Konsol ASM.
Di panel navigasi kiri, pilih Service Mesh > Mesh Management.
Di halaman Mesh Management, temukan instans ASM dan klik namanya atau klik Manage di kolom Actions.
Pilih Mesh Security Center > RequestAuthentication di panel navigasi kiri. Klik Create.
Konfigurasikan parameter berikut dan klik Create.
Parameter Value Namespace Pilih istio-system. Name Masukkan nama untuk kebijakan. Matching Label Klik Add Matching Label. Atur Name menjadi istiodan Value menjadiingressgateway.JWT Rule Set Klik Add dan konfigurasikan bidang seperti pada tabel berikut. Bidang JWT Rule Set:
Bidang Deskripsi Contoh nilai issuer Identifier penerbit JWT. testing@asm.test.ioaudiences Layanan yang diizinkan menggunakan JWT. Biarkan kosong untuk mengizinkan semua layanan. (kosong) jwks Kunci penandatanganan dalam format {"keys":[<your-JWK>]}.{"keys":[{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add786****"}]}
Verifikasi kebijakan autentikasi permintaan
Hasilkan JWT uji
Gunakan alat JWT untuk mengenkripsi token uji coba. Pada bagian Decoded, konfigurasikan bidang-bidang berikut:
HEADER: Atur
algmenjadiRS256,kidmenjadi ID kunci dari JWK Anda, dantypmenjadiJWT.PAYLOAD: Atur
issmenjaditesting@asm.test.io. Tambahkan klaim lain sesuai kebutuhan.VERIFY SIGNATURE: Tempel kunci publik dan kunci privat yang dihasilkan di Hasilkan JWK.

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 GMTPermintaan 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-envoyPermintaan 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 GMTHasil ini mengonfirmasi bahwa kebijakan RequestAuthentication bekerja dengan benar:
| Jenis permintaan | Hasil yang diharapkan | Alasan |
|---|---|---|
| JWT valid | 200 OK | Token lolos validasi tanda tangan dan issuer. |
| JWT tidak valid | 401 Unauthorized | Token gagal validasi tanda tangan. |
| Tanpa JWT | 200 OK | RequestAuthentication 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.
Masuk ke Konsol ASM.
Di panel navigasi kiri, pilih Service Mesh > Mesh Management.
Klik nama instans ASM atau klik Manage di kolom Actions.
Pilih Mesh Security Center > AuthorizationPolicy di panel navigasi kiri. Klik Create.
Konfigurasikan parameter berikut dan klik Create. Mengatur
RequestPrincipalsmenjadi*akan mencocokkan semua principal terotentikasi, yang mewajibkan JWT valid pada setiap permintaan.Parameter Value Name Masukkan nama untuk kebijakan. Policy Type Pilih ALLOW. Gateway Scope Di tab Gateway Scope, atur ASM Gateway menjadi ingressgateway. Di bagian Add Request Source, aktifkan RequestPrincipals dan masukkan *.
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-envoyPermintaan 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 GMTPermintaan 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.
Masuk ke Konsol ASM.
Di panel navigasi kiri, pilih Service Mesh > Mesh Management.
Klik nama instans ASM atau klik Manage di kolom Actions.
Pilih Mesh Security Center > AuthorizationPolicy di panel navigasi kiri. Klik Create.
Konfigurasikan parameter berikut dan klik Create.
Parameter Value Name Masukkan nama untuk kebijakan. Policy Type Pilih ALLOW. Gateway Scope Di 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.
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-envoyKebijakan 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.

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 GMTHanya 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 penyebab | Solusi |
|---|---|
| Token kedaluwarsa | Periksa klaim exp di muatan JWT. Hasilkan token baru jika sudah kedaluwarsa. |
| Ketidaksesuaian issuer | Pastikan klaim iss cocok dengan nilai issuer di kebijakan RequestAuthentication. |
| Ketidaksesuaian kunci | Verifikasi bahwa JWK di kebijakan cocok dengan pasangan kunci yang digunakan untuk menandatangani token. Hasilkan ulang keduanya jika diperlukan. |
| Selisih waktu jam | Pastikan jam node kluster tersinkronisasi. Validasi JWT sensitif terhadap perbedaan waktu. |
Permintaan mengembalikan 403 setelah menambahkan AuthorizationPolicy
| Kemungkinan penyebab | Solusi |
|---|---|
| Principal tidak ada | Kebijakan ALLOW dengan RequestPrincipals: * mewajibkan JWT valid. Permintaan tanpa token ditolak karena tidak ada principal terotentikasi yang dapat ditetapkan. |
| Format principal salah | Saat 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
Konfigurasikan autentikasi mutual TLS di ASM — Amankan komunikasi antar layanan dalam mesh.
Konsep keamanan Istio — Pelajari lebih lanjut tentang model RequestAuthentication dan AuthorizationPolicy.