Saat gerbang masuk menerima traffic eksternal, kontrol akses detail halus sering kali memerlukan lebih dari sekadar aturan izinkan/tolak yang sederhana. Open Policy Agent (OPA) memungkinkan Anda menulis kebijakan otorisasi kustom dalam Rego dan menerapkannya di tingkat gerbang—tanpa mengubah kode aplikasi.
Topik ini menjelaskan penerapan mesin OPA bersama gerbang masuk Service Mesh (ASM), integrasinya melalui mekanisme otorisasi eksternal Envoy, serta pengujian konfigurasi tersebut menggunakan aplikasi HTTPBin.
Cara kerja
Gerbang masuk ASM menggunakan Envoy sebagai proxy bidang data. Envoy mendukung filter otorisasi eksternal (ext_authz) yang mendelegasikan keputusan otorisasi ke layanan eksternal.
Saat OPA diintegrasikan sebagai layanan otorisasi eksternal:
Permintaan tiba di gerbang masuk.
Envoy mengirim metadata permintaan (metode, path, header) ke mesin OPA melalui gRPC.
OPA mengevaluasi permintaan tersebut terhadap kebijakan Rego yang dimuat.
OPA mengembalikan keputusan izinkan atau tolak. Envoy kemudian meneruskan permintaan ke hulu atau mengembalikan
403 Forbidden.
Karena OPA berjalan sebagai Pod terpisah dalam kluster, evaluasi kebijakan bersifat lokal—tidak diperlukan lompatan jaringan eksternal. Kebijakan dapat diperbarui saat runtime melalui API HTTP OPA tanpa perlu menerapkan ulang beban kerja apa pun.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ASM (v1.15.3.25 atau lebih baru) dengan kluster Kubernetes terkelola yang telah ditambahkan. Untuk informasi selengkapnya, lihat Add a cluster to an ASM instance dan Update an ASM instance.
Aplikasi HTTPBin yang telah diterapkan dan dapat diakses melalui gerbang masuk. Untuk informasi selengkapnya, lihat Deploy the HTTPBin application.
Injeksi proxy sidecar otomatis diaktifkan untuk namespace
default. Untuk informasi selengkapnya, lihat Configure sidecar proxy injection policies.
Langkah 1: Terapkan mesin OPA
Buat file bernama asm-opa.yaml dengan konten berikut. Manifes ini mendefinisikan tiga resource Kubernetes:
| Resource | Tujuan |
|---|---|
| Service | Mengekspos mesin OPA pada port 9191 (gRPC) dan port 8181 (HTTP) |
| Deployment | Menjalankan kontainer OPA dengan plugin gRPC otorisasi eksternal Envoy diaktifkan |
| Secret | Menyimpan kebijakan Rego default yang dimuat OPA saat startup |
Ganti ID wilayah cn-hangzhou dalam path gambar kontainer dengan wilayah tempat kluster Anda ditempatkan. Misalnya, jika kluster Anda berada di wilayah China (Shanghai), gunakan registry-vpc.cn-shanghai.aliyuncs.com/acs/opa:0.46.1-istio-3-static.
Bidang konfigurasi utama
args pada Deployment mengonfigurasi cara kerja mesin OPA:
| Bidang | Nilai | Deskripsi |
|---|---|---|
--addr | 0.0.0.0:8181 | Alamat pendengar API HTTP untuk manajemen kebijakan dan pemeriksaan kesehatan. |
--diagnostic-addr | 0.0.0.0:8282 | Titik akhir diagnostik untuk probe kesiapan dan pemeriksaan kelangsungan hidup. |
plugins.envoy_ext_authz_grpc.addr | :9191 | Alamat pendengar gRPC untuk plugin otorisasi eksternal Envoy. Harus sesuai dengan port Service. |
plugins.envoy_ext_authz_grpc.path | asm/authz/allow | Path keputusan kebijakan Rego. OPA mengevaluasi data.asm.authz.allow untuk setiap permintaan. |
decision_logs.console | true | Mencetak log keputusan ke stdout untuk debugging. |
Aturan kebijakan default
Kebijakan Rego dalam Secret mendefinisikan tiga aturan otorisasi. Permintaan diizinkan jika salah satu aturan dievaluasi menjadi true:
| Aturan | Kondisi | Contoh |
|---|---|---|
| Bypass pemeriksaan kesehatan | Path permintaan diawali dengan health | GET /health |
| Bypass metode HEAD | Metode HTTP adalah HEAD | HEAD /any-path |
| Otorisasi pengguna | Username dalam header Authorization adalah alice | Authorization: Basic YWxpY2U6dGVzdHBhc3N3b3Jk (alice:testpassword, dalam format Base64) |
Semua permintaan lainnya ditolak (default allow := false).
Terapkan
Jalankan perintah berikut untuk menerapkan OPA ke kluster Container Service for Kubernetes (ACK):
kubectl apply -f asm-opa.yamlLangkah 2: Konfigurasikan gerbang masuk untuk menggunakan OPA
Hubungkan mesin OPA ke gerbang masuk sebagai layanan otorisasi kustom melalui Konsol ASM.
Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih .
Pada halaman Mesh Management, klik nama instans ASM yang dituju. Di panel navigasi sebelah kiri, pilih .
Pada halaman Ingress Gateway, klik Gateway security di sebelah gerbang masuk yang ingin dikonfigurasi.
Di panel navigasi sebelah kiri, pilih .
Pada langkah Custom Authorization Service Configuration, konfigurasikan mesin OPA sebagai layanan otorisasi kustom untuk gerbang masuk, lalu klik Next.

Pada langkah Matching Rules, tentukan permintaan mana yang memerlukan otorisasi OPA, lalu klik Submit.

Setelah konfigurasi disimpan, layanan otorisasi kustom akan muncul di halaman:

Langkah 3: Verifikasi otorisasi OPA
Uji ketiga aturan otorisasi dengan mengirim permintaan ke aplikasi HTTPBin melalui gerbang masuk.
Ganti <gateway-ip> dalam perintah berikut dengan alamat IP gerbang masuk ASM Anda.
Uji 1: Akses path yang tidak tercakup oleh aturan pencocokan
Kirim permintaan GET ke path root (/). Jika aturan pencocokan yang dikonfigurasi pada Langkah 2 tidak mencakup path ini, permintaan akan melewati OPA dan langsung mencapai layanan hulu.
curl <gateway-ip>/ -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: 2Tanggapan 200 OK mengonfirmasi bahwa permintaan ke path ini tidak dicegat oleh OPA.
Uji 2: Akses path yang dilindungi tanpa kredensial
Kirim permintaan GET ke /status/201 tanpa header Authorization:
curl <gateway-ip>/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: 1Tanggapan 403 Forbidden mengonfirmasi bahwa OPA menolak permintaan yang tidak sesuai dengan aturan izinkan apa pun.
Uji 3: Akses path yang dilindungi dengan kredensial valid
Kirim permintaan GET ke /status/201 dengan username yang diotorisasi alice:
curl <gateway-ip>/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: 3Tanggapan 201 Created mengonfirmasi bahwa OPA mengotorisasi permintaan dari pengguna alice.
Langkah 4: Perbarui kebijakan OPA saat runtime
OPA menyediakan API HTTP untuk manajemen kebijakan. Gunakan API ini untuk memperbarui kebijakan tanpa menerapkan ulang Pod OPA.
Contoh berikut mengubah pengguna yang diotorisasi dari alice menjadi bob:
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), ":")
}'Perintah ini menjalankan curl dari kontainer istio-proxy pada Pod httpbin karena layanan OPA (asm-opa:8181) hanya dapat diakses di dalam kluster. Metode HTTP PUT menggantikan kebijakan yang ada pada path yang ditentukan.
Verifikasi kebijakan yang diperbarui
Kirim permintaan sebagai
bob. Harapkan tanggapan201 Created: Output yang diharapkan:curl <gateway-ip>/status/201 -I -X GET --user bob:testpasswordHTTP/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: 3Kirim permintaan sebagai
alice. Harapkan tanggapan403 Forbidden: Output yang diharapkan:curl <gateway-ip>/status/201 -I -X GET --user alice:testpasswordHTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:32:49 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1
Hasil ini mengonfirmasi bahwa kebijakan yang diperbarui langsung berlaku: bob diotorisasi sedangkan alice kini ditolak.