Topik ini menjawab beberapa pertanyaan umum (FAQ) terkait JSON Web Token (JWT).
Apa saja algoritma JWT yang didukung oleh ASM?
Instance Service Mesh (ASM) dengan versi lebih lama dari V1.13 hanya mendukung algoritma RSA.
Instance ASM versi V1.13 atau lebih baru mendukung algoritma ES256, ES384, ES512, HS256, HS384, HS512, RS256, RS384, RS512, PS256, PS384, PS512, dan EdDSA.
Bagaimana cara menggunakan parameter jwksUri di ASM?
Parameter jwksUri dapat digunakan pada instance ASM versi V1.13 atau lebih baru. Metode penggunaannya berbeda-beda tergantung pada skenario:
Untuk menentukan alamat layanan dalam kluster Container Service for Kubernetes (ACK) yang dikelola oleh ASM, Anda dapat menggunakan parameter jwksUri secara langsung.
Untuk menentukan alamat layanan yang tidak diterapkan dalam kluster ACK yang dikelola oleh ASM, Anda harus mengonfigurasi entri layanan yang sesuai.
Contoh ini menggunakan JWT resmi Istio dan JSON Web Key Set (JWKS). Untuk informasi lebih lanjut, lihat sampel JWT dan JWKS Istio.
jwksUri menentukan alamat layanan dalam kluster ACK yang dikelola oleh ASM
Dalam contoh ini, jwksUri menentukan alamat layanan nginx-proxy dalam kluster yang dikelola oleh ASM. Kunci publik dapat diperoleh dari jwks melalui port 80 dari alamat/get_jwks. Nilai jwksUri adalah http://nginx-proxy.{Namespace}.svc.cluster.local:80/get_jwks.
Jalankan perintah berikut untuk memeriksa apakah get_jwks dari kluster dapat digunakan:
curl nginx-proxy/get_jwksOutput yang diharapkan:
{ "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-e****","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65p****-P7KfIupjf59vsdo91bSP9C8H07pSAGQ****_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5****_pbhLdKXbi66GlVeK6ABZOUW3WYt****-91gVuoeJT_DwtGGcp4ignkgXfkiE****-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoU****_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZ****_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqT****_EyxOGuHJrLsn00****"}]}Output di atas menunjukkan bahwa get_jwks dapat digunakan.
Buat kebijakan autentikasi permintaan.
Masuk ke Konsol ASM.
Di panel navigasi sisi kiri, pilih .
Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance tersebut atau pilih Manage di kolom Actions.
Di panel navigasi sisi kiri, pilih .
Di halaman RequestAuthentication, klik Create from YAML. Di halaman yang muncul, pilih Namespace tempat Anda ingin membuat kebijakan autentikasi permintaan dan Template, salin konten berikut ke editor YAML, lalu klik Create.
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-example namespace: foo spec: jwtRules: - issuer: testing@secure.istio.io jwksUri: 'http://nginx-proxy/get_jwks' selector: matchLabels: app: httpbin
Gunakan kubectl untuk terhubung ke bidang data berdasarkan informasi dalam file kubeconfig, dan jalankan perintah berikut untuk mengakses aplikasi HTTPBin:
# Tetapkan variabel lingkungan Token. TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.14/security/tools/jwt/samples/demo.jwt -s) && echo "$TOKEN" | cut -d '.' -f2 - | base64 --decode - # Akses aplikasi httpbin dari pod tempat aplikasi sleep berada menggunakan permintaan dengan JWT. kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl "http://httpbin.foo:8000/headers" -sS -o /dev/null -H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"Jika kode status
200dikembalikan, operasi berhasil.
jwksUri menentukan alamat layanan yang tidak diterapkan dalam kluster ACK yang dikelola oleh ASM
Dalam contoh ini, protokol HTTP digunakan. Untuk menggunakan HTTPS untuk mendapatkan JWKS, konfigurasikan aturan tujuan untuk entri layanan.
Buat entri layanan untuk layanan tersebut.
Buat file bernama service-entry.yaml dan salin konten berikut ke file tersebut:
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: external-svc-https namespace: foo spec: addresses: - 11.11.XX.XX # Ganti variabel ini dengan jwksUri Anda. endpoints: - address: 11.11.XX.XX # Ganti variabel ini dengan jwksUri Anda. hosts: - 11.11.XX.XX # Ganti variabel ini dengan jwksUri Anda. location: MESH_EXTERNAL ports: - name: http number: 80 protocol: HTTP - name: https number: 443 protocol: HTTPS resolution: STATICJalankan perintah berikut untuk membuat entri layanan:
kubectl apply -f service-entry.yaml
(Opsional) Untuk menggunakan HTTPS untuk mendapatkan JWKS, konfigurasikan aturan tujuan untuk entri layanan.
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: external-svc-https namespace: foo spec: host: ${The host where ServiceEntry resides} trafficPolicy: loadBalancer: simple: ROUND_ROBIN portLevelSettings: - port: number: 443 tls: mode: SIMPLEBuat kebijakan autentikasi permintaan.
Masuk ke Konsol ASM.
Di panel navigasi sisi kiri, pilih .
Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance tersebut atau pilih Manage di kolom Actions.
Di panel navigasi sisi kiri, pilih .
Di halaman RequestAuthentication, klik Create from YAML. Di halaman yang muncul, pilih Namespace tempat Anda ingin membuat kebijakan autentikasi permintaan dan Template, salin konten berikut ke editor YAML, lalu klik Create.
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-example namespace: foo spec: jwtRules: - issuer: tes****@secure.istio.io jwksUri: '${Your jwksUri}' selector: matchLabels: app: httpbin
Jalankan perintah berikut untuk mengakses aplikasi httpbin di pod tempat aplikasi sleep berada:
# Akses aplikasi httpbin dari pod tempat aplikasi sleep berada menggunakan permintaan dengan JWT. kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl "http://httpbin.foo:8000/headers" -sS -o /dev/null -H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"Jika kode status
200dikembalikan, operasi berhasil.
Bagaimana cara mengonfigurasi autentikasi JWT ketika saya tidak ingin mengautentikasi permintaan yang menuju jalur tertentu?
Anda dapat menyetel parameter action ke DENY dan menentukan jalur saat mengonfigurasi file YAML kebijakan otorisasi di Konsol ASM.
Sebarkan aplikasi sampel dan akses aplikasi tersebut.
Sebarkan aplikasi Bookinfo di kluster ACK yang ditambahkan ke instance ASM. Untuk informasi lebih lanjut, lihat Sebarkan aplikasi di kluster ACK yang ditambahkan ke instance ASM.
Jalankan perintah berikut untuk mengakses tiga layanan guna memastikan semua jalur dapat diakses:
curl "http://${Alamat IP gateway ingress}/productpage" -sS -o /dev/null -w "%{http_code}\n" curl "http://${Alamat IP gateway ingress}/api/v1/products/0" -sS -o /dev/null -w "%{http_code}\n" curl "http://${Alamat IP gateway ingress}/api/v1/products/1" -sS -o /dev/null -w "%{http_code}\n"Jika kode status
200dikembalikan di setiap keluaran perintah, operasi berhasil.
Buat kebijakan autentikasi permintaan.
Masuk ke Konsol ASM.
Di panel navigasi sisi kiri, pilih .
Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance tersebut atau pilih Manage di kolom Actions.
Di panel navigasi sisi kiri, pilih .
Di halaman RequestAuthentication, klik Create from YAML. Di halaman yang muncul, pilih Namespace tempat Anda ingin membuat kebijakan autentikasi permintaan dan Template, salin konten berikut ke editor YAML, lalu klik Create.
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-example namespace: istio-system spec: jwtRules: - issuer: testing@secure.istio.io jwks: >- { "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-e****","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65pHymX-P7KfIupjf59vsdo91bSP9C8H07pSAGQ****_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5****_pbhLdKXbi66GlVeK6ABZOUW3WYtnNHD-91gVu****_DwtGGcp4ignkgXfkiEm4sw-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoU****_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZ****_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqT****_EyxOGuHJrLsn00****"}]} selector: matchLabels: app: istio-ingressgatewayKebijakan autentikasi permintaan ini berlaku untuk gateway ingress, dan semua permintaan yang melewati gateway perlu diautentikasi. Permintaan dengan JWT valid atau tanpa JWT diizinkan, sedangkan permintaan dengan JWT tidak valid ditolak.
Buat kebijakan otorisasi yang mengizinkan permintaan tanpa JWT untuk mengakses jalur tertentu.
Anda dapat membuat kebijakan otorisasi untuk menentukan bahwa permintaan yang menuju jalur tertentu tidak perlu melewati autentikasi JWT, sedangkan permintaan yang menuju jalur lainnya harus membawa JWT yang valid. Dalam contoh ini, permintaan yang menuju jalur /productpage tidak perlu melewati autentikasi JWT, sedangkan permintaan yang menuju dua jalur lainnya harus membawa JWT yang valid.
Masuk ke Konsol ASM.
Di panel navigasi sisi kiri, pilih .
Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance tersebut atau pilih Manage di kolom Actions.
Di panel navigasi sisi kiri, pilih .
Di halaman AuthorizationPolicy, klik Create from YAML. Di halaman yang muncul, pilih Namespace tempat Anda ingin membuat kebijakan otorisasi dan Template, salin konten berikut ke editor YAML, lalu klik Create.
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: test-exclude namespace: istio-system spec: action: DENY rules: - from: - source: notRequestPrincipals: - '*' to: - operation: notPaths: - /productpage selector: matchLabels: app: istio-ingressgatewayKebijakan otorisasi ini juga berlaku untuk gateway ingress. Aturan DENY dikonfigurasikan untuk menolak semua permintaan tanpa JWT yang valid yang menuju jalur selain jalur /productpage.
Lakukan pengujian akses.
Jalankan perintah berikut untuk menetapkan JWT ke variabel lingkungan Token:
export TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1****.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5p****.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9****-LS9qd_vpdLG4Tn1A15NxfCjp5f7Q****-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZz****__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCg****_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3Uc1MI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvH****_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8****Jalankan perintah berikut untuk mengakses tiga layanan:
Setiap permintaan tidak membawa JWT:
curl "http://${Alamat IP gateway ingress}/productpage" -sS -o /dev/null -w "%{http_code}\n" 200 curl "http://${Alamat IP gateway ingress}/api/v1/products/0" -sS -o /dev/null -w "%{http_code}\n" 403 curl "http://${Alamat IP gateway ingress}/api/v1/products/1" -sS -o /dev/null -w "%{http_code}\n" 403Keluaran menunjukkan bahwa hanya jalur /productpage yang dapat diakses, sedangkan dua jalur lainnya tidak dapat diakses dan kode status
403dikembalikan.Setiap permintaan membawaJWT:
curl "http://${Alamat IP gateway ingress}/productpage" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n" 200 curl "http://${Alamat IP gateway ingress}/api/v1/products/0" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n" 200 curl "http://${Alamat IP gateway ingress}/api/v1/products/1" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n" 200Kode status
200dikembalikan untuk setiap operasi, menunjukkan bahwa ketiga jalur tersebut dapat diakses.