Untuk menerapkan kontrol akses dinamis, Anda dapat mengintegrasikan mesin Open Policy Agent (OPA) ke dalam gerbang masuk guna menyesuaikan kebijakan otorisasi berdasarkan identitas pengguna atau konten permintaan serta mengontrol komunikasi antar layanan secara real time. Pendekatan ini secara efektif mencegah akses tidak sah, mengurangi risiko kebocoran data, dan meningkatkan keamanan aplikasi dalam instans Service Mesh (ASM). Topik ini menjelaskan cara menggunakan mesin OPA untuk mengotentikasi dan mengotorisasi permintaan yang diterima oleh gerbang masuk. Dalam contoh ini, permintaan dialirkan melalui gerbang masuk untuk mengakses aplikasi HTTPBin.
Prasyarat
-
Kluster Kubernetes terkelola telah ditambahkan ke instans ASM versi 1.15.3.25 atau lebih baru. Untuk petunjuknya, lihat Tambahkan kluster ke instans ASM dan Tingkatkan instans ASM.
-
Aplikasi httpbin telah diterapkan dan dapat diakses. Untuk petunjuknya, lihat Terapkan aplikasi httpbin.
-
Injeksi sidecar otomatis telah diaktifkan untuk namespace
default. Untuk petunjuknya, lihat Konfigurasikan kebijakan injeksi sidecar.
Langkah 1: Terapkan mesin OPA
-
Buat file bernama
asm-opa.yamldengan konten berikut.Manifes YAML ini menerapkan Service, Deployment, dan Secret OPA.
Kind
Deskripsi
Deployment
-
Pada path image
registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static, ganticn-hangzhoudengan ID wilayah kluster Anda. -
Mesin eksekusi OPA ini mengaktifkan pencatatan keputusan secara default (
--set=decision_logs.console=true) untuk menyederhanakan debugging.
Secret
Secret mendefinisikan kebijakan OPA dengan aturan berikut:
-
Izinkan permintaan jika path-nya adalah
health. -
Izinkan permintaan jika metodenya adalah
HEAD. -
Izinkan permintaan jika username-nya adalah
alice.CatatanUsername diekstraksi dari header
Authorization, yang harus dalam formatAuthorization: Basic ${base64_encoded_username:password}.
-
-
Jalankan perintah berikut untuk menerapkan OPA.
kubectl apply -f asm-opa.yaml
Langkah 2: Gunakan fitur otorisasi eksternal gerbang masuk untuk mengintegrasikan mesin OPA dengan gerbang masuk
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Ingress Gateway, temukan gerbang yang ingin Anda integrasikan dengan OPA lalu klik Gateway Security.
-
Di panel navigasi kiri gerbang, pilih .
-
Konfigurasikan layanan otorisasi kustom.
-
Pada wizard Custom Authorization Service Configuration, konfigurasikan OPA sebagai layanan otorisasi kustom untuk gerbang tersebut, lalu klik Next.
Aktifkan sakelar Enable Gateway Custom Authorization Service, pilih tab Custom authorization service based on envoy.ext_authz (HTTP or gRPC), atur Protocol ke GRPC, service address ke
asm-opa.default.svc.cluster.local, service port ke 9191, dan timeout ke 10 detik. -
Pada wizard Matching Rules, konfigurasikan aturan pencocokan untuk menentukan permintaan mana yang memerlukan otorisasi OPA, lalu klik Submit.
Atur Matching Mode ke Selected requests must be authorized, pilih Custom matching rules, aktifkan HTTP Path (Path), dan masukkan
/status/*.Muncul pesan konfirmasi bahwa Gateway Custom Authorization Service was created successfully dan mencantumkan resource native Istio yang dibuat: ASMExtensionProvider (nama resource:
grpcextauth-asmsecuritypolicy-ingressgateway-extauthz) dan AuthorizationPolicy (nama resource:ingressgateway-extauthz-ap-wg-gateway-istio-system-gateway-ingressgateway). Anda dapat mengklik View YAML untuk melihat konfigurasi resource atau mengklik Edit untuk memodifikasi layanan otorisasi.
-
Langkah 3: Uji akses httpbin
-
Jalankan perintah berikut untuk mengakses path
/.curl ${ASM_GATEWAY_IP}/ -I -X GETHTTP/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 permintaan diizinkan karena path ini tidak memerlukan autentikasi.
-
Jalankan perintah berikut untuk mengakses path
/status/201tanpa kredensial yang valid.curl ${ASM_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 Forbiddenmenunjukkan bahwa permintaan ditolak karena kredensial tidak tersedia. -
Jalankan perintah berikut untuk mengakses path
/status/201dengan kredensial valid untuk penggunaalice.curl ${ASM_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 Createdmengonfirmasi bahwa permintaan diizinkan karena penggunaalicediotorisasi oleh kebijakan OPA.
Langkah 4: Perbarui kebijakan OPA
Anda dapat memperbarui kebijakan OPA saat runtime dengan memanggil API HTTP mesin OPA.
-
Jalankan perintah berikut untuk memperbarui kebijakan. Kebijakan baru hanya mengizinkan akses untuk pengguna
bobdan menolak akses untukalice.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 menguji akses sebagai pengguna
bob.curl ${ASM_GATEWAY_IP}/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: 3Tanggapan
201 Createdmenunjukkan bahwa penggunabobberhasil mengakses path tersebut. -
Jalankan perintah berikut untuk menguji akses sebagai pengguna
alice.curl ${ASM_GATEWAY_IP}/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: 1Tanggapan
403 Forbiddenmengonfirmasi bahwa penggunaalicekini ditolak aksesnya, sehingga memvalidasi pembaruan kebijakan.