Di Service Mesh (ASM), Anda dapat mengonfigurasi autentikasi JSON Web Token (JWT) untuk mengautentikasi sumber permintaan. Metode ini juga dikenal sebagai autentikasi pengguna akhir. Setelah mengonfigurasi autentikasi JWT untuk gateway masuk pada instance ASM, ASM memeriksa apakah permintaan untuk mengakses layanan menggunakan gateway masuk berisi JWT yang valid di header permintaan. Hanya permintaan dengan JWT yang valid yang diizinkan. Topik ini menjelaskan cara mengonfigurasi autentikasi JWT untuk gateway masuk.
Prasyarat
Gateway masuk telah diterapkan. Untuk informasi lebih lanjut, lihat Buat gateway masuk.
Informasi latar belakang
Dalam contoh ini, layanan httpbin digunakan. Kebijakan autentikasi permintaan dikonfigurasikan untuk gateway masuk guna membatasi permintaan yang mencoba mengakses layanan httpbin. Permintaan yang berisi JWT yang valid diizinkan untuk mengakses layanan httpbin, sedangkan permintaan dengan JWT tidak valid akan ditolak. Namun, permintaan tanpa JWT tetap diizinkan untuk mengakses layanan httpbin. Berdasarkan kebijakan autentikasi permintaan ini, Anda dapat membuat kebijakan otorisasi untuk membatasi permintaan lebih lanjut dalam skenario berikut:
Buat kebijakan otorisasi untuk hanya mengizinkan permintaan yang berisi JWT yang valid untuk mengakses layanan menggunakan gateway masuk.
Buat kebijakan otorisasi untuk hanya mengizinkan permintaan yang berisi JWT yang dikeluarkan oleh penerbit tertentu untuk mengakses layanan menggunakan gateway masuk.
Langkah 1: Terapkan layanan httpbin
Aktifkan injeksi proxy sidecar otomatis untuk namespace default.
Masuk ke Konsol ASM.
Di panel navigasi kiri, pilih .
Di halaman detail instance ASM, pilih di panel navigasi kiri.
Di halaman Global Namespace, temukan namespace default dan klik Enable Automatic Sidecar Proxy Injection di kolom Automatic Sidecar Injection.
Di pesan Submit, klik OK.
Terapkan layanan httpbin.
Hubungkan ke kluster Container Service for Kubernetes (ACK) menggunakan kubectl. Untuk informasi lebih lanjut, lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
Buat file httpbin.yaml yang berisi 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: 80Jalankan perintah berikut untuk menerapkan layanan httpbin:
kubectl apply -f httpbin.yaml -n default
Langkah 2: Buat gateway Istio dan layanan virtual
Buat gateway Istio.
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih . Di halaman yang muncul, klik Create from YAML.
Di halaman Create, pilih default dari daftar drop-down Namespace dan salin konten 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
Buat layanan virtual.
Di halaman detail instance ASM, pilih di panel navigasi kiri. Di halaman yang muncul, klik Create from YAML.
Di halaman Buat, pilih default dari daftar drop-down Namespace dan salin konten 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
Langkah 3: Buat kebijakan autentikasi permintaan
Buat JSON Web Key (JWK).
Jalankan perintah berikut di OpenSSL untuk menghasilkan kunci privat Rivest-Shamir-Adleman (RSA) 2048-bit:
openssl genrsa -out rsa-private-key.pem 2048Jalankan perintah berikut untuk mengekstrak kunci publik dari file kunci privat:
openssl rsa -in rsa-private-key.pem -pubout -out rsa-public-key.pemDi alat JWK to PEM Convertor online, pilih PEM-to-JWK (RSA Only), masukkan kunci publik di editor kode, lalu klik submit untuk mengonversi kunci publik menjadi JWK.
{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add7863915c","n":"2dnwOlDKEwII9Cyh9w7o59a5y3RS2gWUKYC3HSBJL1FhYIZa7sjTCKxwEuG-vCRQkR6augWxYWseSDfgtyivzi3CxxkF8WnQbECOCGm5xAYKmMcXeOpv0zsJTHN122Tt_tsd6K2OC3yGwKtmp7m-MOpHagqWRqFtvyEOm_1JW1-t0n1VsGSeWww8dvcmnJPKAKHbAU40jdV1hMn9AA3RfSpDY6nfrUkpXA5-aQ6rJRjMn36DatZ5ykVL4LKPOUxZdfK_yNIPkCnwIKesqiOpr4s-iCM8pMiZuejDZ1qoX-uBjggESf4G9_L-laDSeoDmXeOZ9kzN3Jw8ay69ihIFEQ"}
Buat kebijakan autentikasi permintaan.
Masuk ke Konsol ASM.
Di panel navigasi kiri, pilih .
Di halaman Mesh Management, temukan instance ASM yang ingin Anda konfigurasikan. Klik nama instance ASM atau klik Manage di kolom Actions.
Di halaman detail instance ASM, pilih di panel navigasi kiri. Di halaman yang muncul, klik Create.
Di halaman Create, atur parameter dan klik Create.

Parameter
Deskripsi
Namespace
Namespace tempat Anda membuat kebijakan autentikasi permintaan. Dalam contoh ini, istio-system dipilih dari daftar drop-down.
Name
Nama kebijakan autentikasi permintaan.
Matching Label
Label yang digunakan untuk menentukan layanan yang berlaku untuk kebijakan autentikasi permintaan.
Klik Add Matching Label. Atur parameter Name menjadi istio dan parameter Value menjadi ingressgateway.
JWT Rule Set
Aturan JWT. Klik Add di sebelah JWT Rule Set, lalu atur parameter berikut:
issuer: penerbit JWT. Dalam contoh ini, nilainya diatur menjadi testing@asm.test.io.
audiences: audiens JWT. Parameter ini menentukan layanan yang dapat menggunakan JWT untuk mengakses layanan yang diinginkan. Jika Anda tidak mengatur parameter ini, semua layanan dapat mengakses layanan yang diinginkan.
jwks: informasi tentang JWT, dalam format
{"keys":[JWK created in Step 1]}. Sebagai contoh, jika JWK yang Anda buat di Langkah 1 adalah{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add786****"}, atur parameter ini menjadi{"keys":[{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add786****"}]}.
Langkah 4: Periksa apakah kebijakan autentikasi permintaan berlaku
Gunakan alat JWT untuk mengkodekan informasi permintaan JWT menjadi string JWT.
Di bagian Decoded, masukkan informasi permintaan JWT berikut. Kemudian, informasi permintaan JWT secara otomatis dikonversi menjadi JWT di bagian Encoded.
HEADER: Atur parameter alg menjadi RS256, parameter kid menjadi ID kunci JWK yang Anda buat, dan parameter typ menjadi JWT.
PAYLOAD: Atur parameter iss menjadi testing@asm.test.io. Anda dapat menambahkan informasi tambahan sesuai kebutuhan bisnis Anda.
VERIFY SIGNATURE: Masukkan kunci publik dan kunci privat yang dibuat di sublangkah pertama Langkah 3: Buat kebijakan autentikasi permintaan.

Akses layanan httpbin menggunakan gateway masuk.
Jalankan perintah berikut untuk mengirim permintaan untuk mengakses layanan httpbin. Permintaan tersebut berisi JWT yang dibuat di Sublangkah 1.
curl -I -H "Authorization: Bearer $TOKEN" http://{Alamat IP gateway masuk}/Output yang diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMTJalankan perintah berikut untuk mengirim permintaan yang berisi JWT tidak valid untuk mengakses layanan httpbin:
curl -I -H "Authorization: Bearer invalidToken" http://{Alamat IP gateway masuk}/Output yang diharapkan:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://47.98.25*.***/", error="invalid_token" content-length: 79 content-type: text/plain date: Fri, 18 Mar 2022 07:59:00 GMT server: istio-envoyJalankan perintah berikut untuk mengirim permintaan yang tidak berisi JWT untuk mengakses layanan httpbin:
curl -I http://{Alamat IP gateway masuk}/Output yang diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT
Hasil di atas menunjukkan bahwa permintaan untuk mengakses layanan httpbin diizinkan jika permintaan berisi JWT yang valid atau tidak berisi JWT, dan permintaan yang berisi JWT tidak valid tidak diizinkan. Ini menunjukkan bahwa kebijakan autentikasi permintaan berlaku.
Langkah 5: Buat kebijakan otorisasi
Scenario 1: Create an authorization policy to allow only requests that contain a valid JWT to access the service by using the ingress gateway
Masuk ke Konsol ASM.
Di panel navigasi kiri, pilih .
Di halaman Mesh Management, temukan instance ASM yang ingin Anda konfigurasikan. Klik nama instance ASM atau klik Manage di kolom Actions.
Di halaman detail instance ASM, pilih di panel navigasi kiri. Di halaman yang muncul, klik Create.
Di halaman Create, atur parameter dan klik Create.

Parameter
Deskripsi
Name
Nama kebijakan otorisasi.
Policy Type
Tindakan otorisasi. Dalam contoh ini, nilainya diatur menjadi ALLOW.
Gateway Scope
Gateway tempat kebijakan otorisasi berlaku. Dalam contoh ini, parameter ASM Gateway pada tab Gateway Scope diatur menjadi ingressgateway. Di bagian Add Request Source, aktifkan RequestPrincipals dan masukkan * di bidang tersebut.
Periksa apakah kebijakan otorisasi berlaku.
Jalankan perintah berikut untuk mengirim permintaan yang tidak berisi JWT untuk mengakses layanan httpbin:
curl -I http://{Alamat IP gateway masuk}/Output yang diharapkan:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://47.98.25*.***/", error="invalid_token" content-length: 79 content-type: text/plain date: Fri, 18 Mar 2022 07:59:00 GMT server: istio-envoyJalankan perintah berikut untuk mengirim permintaan yang berisi JWT yang valid untuk mengakses layanan httpbin:
curl -I -H "Authorization: Bearer $TOKEN" http://{Alamat IP gateway masuk}/Output yang diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT
Hasil di atas menunjukkan bahwa permintaan untuk mengakses layanan httpbin diizinkan jika permintaan berisi JWT yang valid, dan permintaan yang tidak berisi JWT tidak diizinkan. Ini menunjukkan bahwa kebijakan otorisasi berlaku.
Scenario 2: Create an authorization policy to allow only requests that contain a JWT issued by the specified issuer to access the service by using the ingress gateway
Dalam contoh ini, penerbitnya adalah testing@asm.test.io.
Masuk ke Konsol ASM.
Di panel navigasi kiri, pilih .
Di halaman Mesh Management, temukan instance ASM yang ingin Anda konfigurasikan. Klik nama instance ASM atau klik Manage di kolom Actions.
Di halaman detail instance ASM, pilih di panel navigasi kiri. Di halaman yang muncul, klik Create.
Di halaman Create, atur parameter dan klik Create.

Parameter
Deskripsi
Name
Nama kebijakan otorisasi.
Policy Type
Tindakan otorisasi. Dalam contoh ini, nilainya diatur menjadi ALLOW.
Gateway Scope
Gateway tempat kebijakan otorisasi berlaku. Dalam contoh ini, parameter ASM Gateway pada tab Gateway Scope diatur menjadi ingressgateway. Di bagian Add Request Source, RequestPrincipals diaktifkan dan nilainya diatur menjadi testing@asm.test.io/demo@asm.test.io.
Periksa apakah kebijakan otorisasi berlaku.
Jalankan perintah berikut untuk mengirim permintaan yang berisi JWT yang dikeluarkan oleh testing@asm.test.io untuk mengakses layanan httpbin:
curl -I -H "Authorization: Bearer $TOKEN" http://{Alamat IP gateway masuk}/Output yang diharapkan:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://47.98.25*.***/", error="invalid_token" content-length: 79 content-type: text/plain date: Fri, 18 Mar 2022 07:59:00 GMT server: istio-envoyKebijakan otorisasi menentukan testing@asm.test.io/demo@asm.test.io sebagai penerbit JWT yang diizinkan. Oleh karena itu, permintaan yang berisi JWT yang dikeluarkan oleh testing@asm.test.io tidak diizinkan untuk mengakses layanan httpbin.
Ubah penerbit JWT menjadi testing@asm.test.io/demo@asm.test.io.
Jalankan perintah berikut untuk mengirim permintaan yang berisi JWT yang dihasilkan di sublangkah sebelumnya untuk mengakses layanan httpbin:
curl -I -H "Authorization: Bearer $TOKEN" http://{Alamat IP gateway masuk}/Output yang diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMTPermintaan yang berisi JWT yang dikeluarkan oleh testing@asm.test.io/demo@asm.test.io diizinkan untuk mengakses layanan httpbin. Ini menunjukkan bahwa kebijakan otorisasi berlaku.
