Service Mesh (ASM) memungkinkan Anda mengenkapsulasi sumber daya keamanan asli Istio dan menyediakan fitur kebijakan keamanan. Anda dapat menyelesaikan konfigurasi keamanan dengan mudah dalam skenario umum. ASM terintegrasi dengan Open Policy Agent (OPA), yang memungkinkan Anda mendefinisikan kebijakan kontrol akses untuk menerapkan kontrol akses lebih rinci pada aplikasi Anda. Topik ini menjelaskan cara menggunakan kebijakan keamanan ASM untuk mengakses mesin OPA di luar pod.
Prasyarat
Kluster Kubernetes dikelola ditambahkan ke instance ASM versi 1.15.3.25 atau lebih baru. Untuk informasi lebih lanjut, lihat Tambahkan kluster ke instance ASM dan Perbarui instance ASM.
Aplikasi HTTPBin telah diterapkan dan dapat diakses. Untuk informasi lebih lanjut, lihat Terapkan aplikasi HTTPBin.
Injeksi proxy sidecar otomatis diaktifkan untuk namespace default. Untuk informasi lebih lanjut, lihat Konfigurasikan kebijakan injeksi proxy sidecar.
Deskripsi Fitur
Secara default, OPA diterapkan dalam mode sidecar di ASM. Saat Anda memulai ulang pod aplikasi setelah mengaktifkan OPA, ASM akan menyuntikkan kontainer OPA ke dalam pod aplikasi. Setelah itu, semua permintaan ke kontainer aplikasi diautentikasi oleh OPA. Dalam mode sidecar, proxy Istio mengakses OPA dalam pod yang sama. Oleh karena itu, latensi rendah, dan mode ini cocok untuk layanan yang sensitif terhadap latensi.
Namun, mode sidecar memiliki beberapa kekurangan: penggunaan sumber daya yang tinggi, pod perlu dimulai ulang saat kontainer OPA disuntikkan, dan permintaan tidak dapat mengakses aplikasi secara fleksibel. OPA dalam mode terpusat dapat melengkapi OPA dalam mode sidecar dalam aspek-aspek ini. Mode terpusat memiliki keunggulan berikut: penggunaan sumber daya lebih rendah, pod tidak perlu dimulai ulang untuk penyebaran kontainer OPA, dan Anda dapat menggunakan kebijakan OPA untuk permintaan tertentu ke aplikasi. Topik ini menjelaskan cara menerapkan OPA dalam mode terpusat untuk autentikasi permintaan ke aplikasi.

Langkah 1: Terapkan OPA
Buat file bernama asm-opa.yaml dan salin konten berikut ke dalam file tersebut.
Kode YAML ini digunakan untuk menerapkan Service OPA, Deployment OPA, dan Secret.
Jenis
Deskripsi
Deployment
Ganti ID wilayah dalam gambar
registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-staticdengan ID wilayah tempat kluster Anda diterapkan.Secara default, logging diaktifkan untuk mesin OPA (
--set=decision_logs.console=true). Ini memudahkan debugging.
Secret
Secret ini mendefinisikan kebijakan OPA berikut:
Jika jalur permintaan adalah
health, permintaan diizinkan.Jika metode permintaan adalah
HEAD, permintaan diizinkan.Jika nama pengguna permintaan adalah
alice, permintaan diizinkan.CatatanNama pengguna dibawa dalam header
Authorizationdari permintaan, dalam bentukAuthorization: Basic ${user name: Base64-encoded password string}.
Gunakan kubectl untuk terhubung ke kluster Container Service for Kubernetes (ACK) berdasarkan informasi dalam file kubeconfig dan jalankan perintah berikut untuk menerapkan OPA:
kubectl apply -f asm-opa.yaml
Langkah 2: Asosiasikan kebijakan keamanan ASM dengan OPA
Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih .
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi sebelah kiri, pilih .
Di halaman ASMSecurityPolicy, klik Create. Di kotak dialog Create ASMSecurityPolicy, klik kartu Custom Authorization Service dan klik OK.
Konfigurasikan layanan otorisasi kustom.
Di halaman CreateCustom Authorization Service, konfigurasikan informasi tentang layanan otorisasi OPA yang diterapkan di Langkah 1 dan klik Next.

Di langkah Workload and Match Rules, klik Add Workload Group. Di kotak dialog New Workload Group, atur Workload Group Name dan klik Add Workload.
Di kotak dialog Add Workload, pilih Workload Scope, atur Namespace menjadi default, lalu atur Workload Type menjadi Service. Kemudian, pilih httpbin di bagian Select workloads, klik ikon
, lalu klik OK.
Di bagian Match Rule List dari kotak dialog New Workload Group, atur Match Mode menjadi The selected request must be authenticated dan Matching Rules menjadi Custom Matching Rules. Nyalakan saklar Path, masukkan
/status/*di bidang tersebut, lalu klik OK.
Di langkah Workload and Match Rules, klik submit.
Gambar berikut menunjukkan halaman setelah kebijakan keamanan dibuat dan diasosiasikan dengan OPA.

Langkah 3: Uji akses ke aplikasi HTTPBin
Jalankan perintah berikut untuk mengakses jalur
/:curl ${Alamat IP gateway ASM}/ -I -X GETOutput yang diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Tue, 25 Jul 2023 08:30:58 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2Output menunjukkan bahwa autentikasi tidak diperlukan untuk permintaan akses ke jalur tersebut.
Jalankan perintah berikut untuk mengakses jalur
/status/201tanpa parameter valid:curl ${Alamat IP gateway ASM}/status/201 -I -X GETOutput yang diharapkan:
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:31:18 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1Output menunjukkan bahwa permintaan akses tanpa parameter valid ditolak.
Jalankan perintah berikut untuk mengakses jalur
/status/201dengan parameter valid:curl ${Alamat IP gateway ASM}/status/201 -I -X GET --user alice:testpasswordOutput yang diharapkan:
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:31:38 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3Output menunjukkan bahwa permintaan akses dengan parameter valid diizinkan.
Langkah 4: Perbarui kebijakan OPA
Panggil API HTTP mesin OPA untuk memperbarui kebijakan OPA.
Jalankan perintah berikut untuk hanya mengizinkan pengguna bernama bob mengakses aplikasi HTTPBin melalui HTTP dan menolak pengguna bernama alice mengakses aplikasi HTTPBin melalui HTTP.
kubectl exec deployment/httpbin -c istio-proxy -- curl asm-opa:8181/v1/policies/policy/policy.rego -XPUT --data-binary 'package asm.authz import future.keywords import input.attributes.request.http as http_request import input.parsed_path default allow := false allow if { parsed_path[0] == "health" } allow if { http_request.method == "HEAD" } allow if { user_name == "bob" } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }'Jalankan perintah berikut untuk mengakses aplikasi HTTPBin menggunakan pengguna bernama bob:
curl ${Alamat IP gateway ASM}/status/201 -I -X GET --user bob:testpasswordOutput yang diharapkan:
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:32:16 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3Output menunjukkan bahwa akses pengguna bernama bob berhasil.
Jalankan perintah berikut untuk mengakses aplikasi HTTPBin menggunakan pengguna bernama alice:
curl ${Alamat IP gateway ASM}/status/201 -I -X GET --user alice:testpasswordOutput yang diharapkan:
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:32:49 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1Output menunjukkan bahwa akses pengguna bernama alice dilarang.