Topik ini menjelaskan cara mengonfigurasi otentikasi permintaan JWT di Service Mesh untuk memvalidasi sumber permintaan, juga dikenal sebagai otentikasi pengguna akhir. Saat menerima permintaan pengguna, konfigurasi ini memverifikasi bahwa token akses dalam header permintaan dapat dipercaya dan mengotorisasi permintaan dari sumber yang sah. Topik ini menjelaskan cara mengonfigurasi otentikasi permintaan JWT untuk gerbang masuk di ASM agar hanya permintaan dengan token akses tepercaya yang dapat mengakses layanan.
Prasyarat
Gerbang masuk telah dideploy. Untuk informasi selengkapnya, lihat Buat gerbang masuk.
Latar Belakang
Topik ini menggunakan layanan httpbin sebagai contoh. Pertama, Anda menggunakan kebijakan RequestAuthentication untuk membatasi permintaan yang mengakses layanan melalui gerbang masuk. Kebijakan awal ini mengizinkan permintaan dengan JWT yang valid dan menolak permintaan dengan JWT yang tidak valid, tetapi tetap mengizinkan permintaan tanpa JWT. Berdasarkan hal tersebut, Anda dapat menggunakan kebijakan otorisasi untuk lebih membatasi permintaan dalam dua skenario berikut:
-
Gunakan kebijakan otorisasi untuk mewajibkan semua permintaan menyertakan JWT agar dapat mengakses layanan melalui gerbang masuk.
-
Gunakan kebijakan otorisasi untuk mewajibkan semua permintaan menyertakan JWT dari penerbit tertentu agar dapat mengakses layanan melalui gerbang masuk.
Langkah 1: Deploy layanan contoh
-
Aktifkan injeksi otomatis untuk namespace default.
-
Masuk ke Konsol ASM.
-
Di panel navigasi kiri, pilih .
-
Pada halaman detail instans ASM, pilih di panel navigasi kiri.
-
Pada halaman Global Namespace, temukan default dan klik Enable Automatic Sidecar Proxy Injection pada kolom Automatic Sidecar Injection.
-
Pada kotak dialog Confirm, klik OK.
-
-
Deploy layanan contoh.
-
Sambungkan ke kluster menggunakan kubectl dan file KubeConfig kluster.
-
Buat file bernama 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 -
Jalankan perintah berikut untuk membuat aplikasi httpbin.
kubectl apply -f httpbin.yaml -n default
-
Langkah 2: Buat Gateway dan virtual service
-
Buat Gateway.
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik Create from YAML.
-
Atur Namespaces menjadi default, masukkan konten berikut ke dalam kotak teks, 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 virtual service.
-
Pada halaman detail instans ASM, pilih di panel navigasi kiri. Pada halaman yang muncul, klik Create from YAML.
-
Atur Namespaces menjadi default, masukkan konten berikut ke dalam kotak teks, 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 RequestAuthentication
-
Buat JWK.
-
Di OpenSSL, jalankan perintah berikut untuk menghasilkan kunci privat RSA 2048-bit.
openssl genrsa -out rsa-private-key.pem 2048 -
Jalankan perintah berikut untuk menghasilkan kunci publik dari kunci privat.
openssl rsa -in rsa-private-key.pem -pubout -out rsa-public-key.pem -
Di tool JWK to PEM Convertor daring, pilih PEM-to-JWK (RSA Only), masukkan kunci publik, 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 RequestAuthentication.
-
Masuk ke Konsol ASM.
-
Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM atau klik Manage pada kolom Actions.
-
Di panel navigasi kiri halaman detail instans ASM, pilih . Pada halaman yang muncul, klik Create.
-
Pada halaman Create, konfigurasi parameter lalu klik Create.
Parameter
Deskripsi
Namespaces
Atur Namespaces menjadi istio-system.
Name
Masukkan nama untuk kebijakan.
Match Label
Memilih beban kerja yang akan diterapkan kebijakan ini.
Klik Add Matching Label. Atur Name menjadi istio dan Value menjadi ingressgateway.
JWT Rule Set
Klik Add di sebelah kanan JWT Rule Set dan konfigurasi aturan JWT:
-
issuer: Penerbit JWT. Dalam topik ini, atur menjadi testing@asm.test.io.
-
audiences: Daftar audiens untuk JWT. Ini menentukan layanan mana yang dapat menggunakan JWT. Biarkan kosong untuk mengizinkan akses ke semua layanan.
-
jwks: Informasi JWT. Atur menjadi
{"keys":[YOUR_JWK]}. Misalnya, jika JWK dari Langkah 3 adalah{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add786****"}, aturjwksmenjadi{"keys":[{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add786****"}]}.
-
-
Langkah 4: Verifikasi kebijakan RequestAuthentication
-
Gunakan tool seperti JWT.io untuk mengencode informasi permintaan JWT Anda menjadi JWT.
Pada bagian Decoded, masukkan informasi permintaan JWT. Tool secara otomatis mengonversinya menjadi JWT di bagian Encoded.
-
HEADER: Atur algoritma enkripsi ke RS256, masukkan
kiddari JWK Anda, dan atur tipe ke JWT. -
PAYLOAD: Atur
issketesting@asm.test.io. Anda juga dapat menambahkan informasi kustom. -
VERIFY SIGNATURE: Masukkan kunci publik dan kunci privat yang Anda buat di Langkah 3.
Dalam contoh ini, nilai kid pada HEADER adalah
59399e22-7a9a-45ed-8c76-7add7863915c. PAYLOAD juga berisi klaim sub dengan nilaitesting@asm.test.io, klaim iat dengan nilai1623389700, dan klaim kustom foo dengan nilaibar. -
-
Akses layanan melalui gerbang masuk.
-
Jalankan perintah berikut untuk mengirim permintaan dengan JWT valid yang dibuat di langkah sebelumnya.
curl -I -H "Authorization: Bearer $TOKEN" http://{YOUR_ASM_GATEWAY_ADDRESS}/Output yang diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT -
Jalankan perintah berikut untuk mengirim permintaan dengan JWT tidak valid.
curl -I -H "Authorization: Bearer invalidToken" http://{YOUR_ASM_GATEWAY_ADDRESS}/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-envoy -
Jalankan perintah berikut untuk mengirim permintaan tanpa JWT.
curl -I http://{YOUR_ASM_GATEWAY_ADDRESS}/Output yang diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT
Hasil ini mengonfirmasi kebijakan RequestAuthentication berfungsi: permintaan dengan token valid atau tanpa token berhasil, sedangkan permintaan dengan token tidak valid ditolak.
-
Langkah 5: Buat kebijakan otorisasi
Skenario 1: Batasi akses layanan
Buat kebijakan otorisasi untuk mewajibkan semua permintaan menyertakan JWT agar dapat mengakses layanan melalui gerbang masuk.
-
Masuk ke Konsol ASM.
-
Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM atau klik Manage pada kolom Actions.
-
Pada halaman detail instans ASM, pilih di panel navigasi kiri. Pada halaman yang muncul, klik Create.
-
Pada halaman Create, konfigurasi parameter lalu klik Create.
Dalam contoh ini, masukkan
require-jwtuntuk Name.Parameter
Deskripsi
Name
Masukkan nama untuk kebijakan otorisasi.
Policy Type
Atur Policy Type menjadi ALLOW.
Gateway Scope
Klik tab Gateway Scope dan atur ASM Gateway menjadi ingressgateway. Pada bagian Add Request Source, aktifkan RequestPrincipals dan masukkan * ke dalam kotak teks.
-
Verifikasi kebijakan otorisasi.
-
Jalankan perintah berikut untuk mengirim permintaan tanpa JWT.
curl -I http://{YOUR_ASM_GATEWAY_ADDRESS}/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-envoy -
Jalankan perintah berikut untuk mengirim permintaan dengan JWT valid.
curl -I -H "Authorization: Bearer $TOKEN" http://{YOUR_ASM_GATEWAY_ADDRESS}/Output yang diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT
Hasil ini mengonfirmasi kebijakan otorisasi berfungsi: permintaan tanpa JWT kini ditolak, sedangkan permintaan dengan token valid berhasil.
-
Skenario 2: Batasi penerbit JWT
Buat kebijakan otorisasi untuk mewajibkan permintaan menyertakan JWT dari penerbit tertentu agar dapat mengakses layanan melalui gerbang masuk.
-
Masuk ke Konsol ASM.
-
Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM atau klik Manage pada kolom Actions.
-
Pada halaman detail instans ASM, pilih di panel navigasi kiri. Pada halaman yang muncul, klik Create.
-
Pada halaman Create, konfigurasi parameter lalu klik Create.
Parameter
Deskripsi
Name
Masukkan nama untuk kebijakan otorisasi.
Policy Type
Atur Policy Type menjadi ALLOW.
Gateway Scope
Klik tab Gateway Scope dan atur ASM Gateway menjadi ingressgateway. Pada bagian Add Request Source, aktifkan RequestPrincipals dan masukkan testing@asm.test.io/demo@asm.test.io ke dalam kotak teks.
-
Verifikasi bahwa kebijakan otorisasi membatasi akses berdasarkan penerbit.
-
Jalankan perintah berikut untuk mengirim permintaan dengan JWT asli.
curl -I -H "Authorization: Bearer $TOKEN" http://{YOUR_ASM_GATEWAY_ADDRESS}/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-envoyPermintaan gagal karena kebijakan otorisasi mengharuskan principal JWT menjadi
testing@asm.test.io/demo@asm.test.io. Principal token asli, yaitutesting@asm.test.io/testing@asm.test.io(issuer/subject), tidak sesuai. -
Modifikasi JWT agar memiliki principal
testing@asm.test.io/demo@asm.test.io.Di tool JWT, atur klaim iss menjadi
testing@asm.test.iodan klaimsubmenjadidemo@asm.test.iopada bagian PAYLOAD. Pertahankan semua konfigurasi lainnya sama seperti sebelumnya.// Header { "alg": "RS256", "kid": "59399e22-7a9a-45ed-8c76-7add7863915c", "typ": "JWT" } // Payload { "foo": "bar", "iat": 1623389700, "iss": "testing@asm.test.io", "sub": "demo@asm.test.io" } -
Jalankan perintah berikut untuk mengirim permintaan dengan JWT yang baru dihasilkan.
curl -I -H "Authorization: Bearer $TOKEN" http://{YOUR_ASM_GATEWAY_ADDRESS}/Output yang diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMTPermintaan berhasil, mengonfirmasi bahwa kebijakan otorisasi membatasi akses dengan benar berdasarkan principal JWT.
-