Topik ini menyediakan jawaban atas pertanyaan umum mengenai otentikasi JSON Web Token (JWT) di Alibaba Cloud Service Mesh (ASM), termasuk dukungan algoritma JWT, konfigurasi JwksUri untuk layanan di dalam dan di luar kluster, serta pengecualian otentikasi berbasis path.
Prasyarat
Instans ASM telah dibuat.
Untuk konfigurasi terkait JwksUri, diperlukan ASM versi 1.13 atau yang lebih baru.
kubeconfig untuk kluster bidang data telah dikonfigurasi agar dapat menjalankan perintah
kubectl.
Algoritma JWT apa saja yang didukung oleh ASM?
Versi ASM sebelum 1.13 hanya mendukung algoritma RSA.
ASM 1.13 dan versi setelahnya mendukung algoritma JWT berikut: ES256, ES384, ES512, HS256, HS384, HS512, RS256, RS384, RS512, PS256, PS384, PS512, dan EdDSA.
Bagaimana cara menggunakan JwksUri di ASM?
Anda harus menggunakan Alibaba Cloud Service Mesh versi 1.13 atau yang lebih baru. Terdapat dua cara untuk menggunakan JwksUri:
Jika JwksUri mengarah ke layanan di dalam kluster, Anda dapat mengonfigurasinya secara langsung.
Jika JwksUri mengarah ke layanan di luar kluster, Anda harus mengonfigurasi ServiceEntry yang sesuai.
Topik ini menggunakan contoh JWT dan Jwks resmi dari Istio sebagai referensi. Untuk informasi lebih lanjut, lihat JWT dan Jwks.
Gunakan alamat JwksUri di dalam kluster
Topik ini mengasumsikan bahwa alamat JwksUri merupakan alamat dalam kluster yang dikelola oleh Service Mesh. nginx-proxy adalah layanan di dalam kluster. Titik akhir /get_jwks-nya pada Port 80 mengembalikan informasi kunci publik jwks, dan JwksUri-nya adalah http://nginx-proxy.{Namespace}.svc.cluster.local:80/get_jwks.
Jalankan perintah berikut untuk memeriksa apakah titik akhir get_jwks di kluster tersedia.
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****"}]}Tanggapan
200dengan data kunci menunjukkan bahwa titik akhir get_jwks tersedia.Lakukan otentikasi permintaan.
-
Masuk ke Konsol ASM.
-
Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.
Di panel navigasi sebelah kiri, klik Mesh Security CenterRequestAuthentication.
Pada halaman RequestAuthentication, klik Create from YAML, pilih Namespaces target dan Scenario Template apa pun, konfigurasi YAML berikut, 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 kubeconfig bidang data dan jalankan perintah berikut untuk mengakses layanan 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 layanan httpbin dengan JWT dari Pod sleep.
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"Kode status 200 mengonfirmasi bahwa permintaan berhasil.
Gunakan alamat JwksUri di luar kluster
Contoh berikut didasarkan pada protokol HTTP. Jika Anda perlu menggunakan HTTPS untuk mendapatkan Jwks, konfigurasikan DestinationRule tambahan untuk ServiceEntry tersebut.
Buat ServiceEntry untuk alamat remote.
a. Gunakan konten YAML berikut untuk membuat file service-entry.yaml.
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: external-svc-https namespace: foo spec: addresses: - 11.11.XX.XX # Ganti dengan alamat layanan Jwks eksternal Anda. endpoints: - address: 11.11.XX.XX # Ganti dengan alamat layanan Jwks eksternal Anda. hosts: - 11.11.XX.XX # Ganti dengan alamat layanan Jwks eksternal Anda. location: MESH_EXTERNAL ports: - name: http number: 80 protocol: HTTP - name: https number: 443 protocol: HTTPS resolution: STATICb. Jalankan perintah berikut untuk menerapkan ServiceEntry.
kubectl apply -f service-entry.yaml(Opsional) Jika layanan jwks Anda memerlukan protokol HTTPS, Anda harus mengonfigurasi DestinationRule tambahan untuk ServiceEntry tersebut.
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: external-svc-https namespace: foo spec: host: <your-service-entry-host> trafficPolicy: loadBalancer: simple: ROUND_ROBIN portLevelSettings: - port: number: 443 tls: mode: SIMPLELakukan otentikasi permintaan.
-
Masuk ke Konsol ASM.
-
Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.
Di panel navigasi sebelah kiri, klik Mesh Security CenterRequestAuthentication.
Pada halaman RequestAuthentication, klik Create from YAML, pilih Namespaces target dan Scenario Template apa pun, konfigurasi YAML berikut, lalu klik Create.
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-example namespace: foo spec: jwtRules: - issuer: testing@secure.istio.io jwksUri: '${YOUR_EXTERNAL_JWKS_URI}' selector: matchLabels: app: httpbin
-
Jalankan perintah berikut untuk menetapkan variabel lingkungan TOKEN dan melakukan uji akses dari Pod sleep.
# Tetapkan variabel lingkungan TOKEN.
TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.14/security/tools/jwt/samples/demo.jwt -s)
# Akses layanan httpbin dengan JWT dari Pod sleep.
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"Kode status 200 mengonfirmasi bahwa permintaan berhasil.
Bagaimana cara melewati otentikasi JWT untuk permintaan ke path tertentu?
Konsol ASM menyediakan fitur kebijakan otorisasi. Anda dapat mengonfigurasi exclusion match dalam kebijakan otorisasi untuk mengotentikasi permintaan ke path selain path yang ditentukan.
Deploy dan akses layanan-layanan tersebut.
a. Deploy aplikasi contoh Bookinfo di kluster yang terkait dengan instans ASM. Untuk informasi lebih lanjut, lihat Deploy aplikasi di kluster yang terkait dengan instans ASM.
b. Jalankan perintah berikut untuk mengakses ketiga layanan berikut dan pastikan setiap path tersedia.
curl "http://${ASM_GATEWAY_ADDRESS}/productpage" -sS -o /dev/null -w "%{http_code}\n" curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/0" -sS -o /dev/null -w "%{http_code}\n" curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/1" -sS -o /dev/null -w "%{http_code}\n"Ketiga layanan mengembalikan
200, yang menunjukkan bahwa layanan tersebut dapat diakses.Buat RequestAuthentication.
-
Masuk ke Konsol ASM.
-
Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.
Di panel navigasi sebelah kiri, klik Mesh Security CenterRequestAuthentication.
Pada halaman RequestAuthentication, klik Create from YAML, pilih Namespaces target dan Scenario Template apa pun, konfigurasi YAML berikut, 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-ingressgatewayRequestAuthentication ini diterapkan pada gerbang ASM dan berlaku untuk semua permintaan yang melewati gerbang tersebut. Setelah RequestAuthentication dikonfigurasi, baik permintaan tanpa JWT maupun permintaan dengan JWT yang benar tetap diizinkan. Hanya permintaan yang membawa JWT salah yang ditolak.
-
Buat AuthorizationPolicy.
Konfigurasikan permintaan ke path tertentu agar tidak perlu membawa JWT, sedangkan permintaan ke path lainnya harus membawa JWT. Topik ini menggunakan path /productpage sebagai contoh. Otentikasi JWT tidak dilakukan untuk path /productpage. Untuk dua path selain /productpage, permintaan harus membawa JWT yang benar agar lolos.
-
Masuk ke Konsol ASM.
-
Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.
Di panel navigasi sebelah kiri, klik Mesh Security CenterAuthorizationPolicy.
-
Pada halaman AuthorizationPolicy, klik Create from YAML, pilih Namespaces target dan Scenario Template apa pun, masukkan konfigurasi YAML berikut, 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-ingressgatewayAuthorizationPolicy ini juga berlaku untuk gerbang ASM. Kebijakan ini terutama mengonfigurasi satu aturan DENY: permintaan ke path selain /productpage akan ditolak jika tidak menyertakan JWT yang valid.
Lakukan uji akses.
a. Jalankan perintah berikut untuk menetapkan JWT yang dibawa dalam permintaan sebagai variabel lingkungan TOKEN.
export TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1****.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5p****.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9****-LS9qd_vpdLG4Tn1A15NxfCjp5f7Q****-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZz****__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCg****_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3Uc1MI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvH****_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8****b. Jalankan perintah berikut untuk mengakses tiga path layanan tersebut.
Permintaan tidak membawa JWT:
curl "http://${ASM_GATEWAY_ADDRESS}/productpage" -sS -o /dev/null -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/0" -sS -o /dev/null -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/1" -sS -o /dev/null -w "%{http_code}\n"Output yang diharapkan:
200
403
403Hanya path /productpage yang dapat diakses. Semua path lainnya mengembalikan 403.
Semua permintaan membawa JWT:
curl "http://${ASM_GATEWAY_ADDRESS}/productpage" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/0" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/1" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n"Output yang diharapkan:
200
200
200Ketiga path mengembalikan 200, yang menunjukkan bahwa semuanya dapat diakses.