Service Mesh (ASM) menyederhanakan konfigurasi terpadu untuk skenario keamanan umum dengan menyediakan fitur kebijakan keamanan ASM yang mengabstraksi resource keamanan native Istio. ASM mengintegrasikan plug-in Open Policy Agent (OPA), sehingga Anda dapat menentukan kebijakan kontrol akses dan menerapkan kontrol akses detail halus pada aplikasi Anda.
Cara kerja
Secara default, ASM men-deploy OPA dalam mode sidecar. Tutorial ini menggunakan layanan otorisasi OPA terpusat sebagai gantinya, yang Anda deploy di kluster Anda lalu hubungkan ke aplikasi melalui kebijakan keamanan ASM.
-
Mode sidecar (default) — Setelah Anda mengaktifkan OPA dan melakukan restart Pod aplikasi, ASM menyuntikkan kontainer OPA ke dalam Pod tersebut. Sidecar OPA kemudian memvalidasi semua permintaan dari kontainer aplikasi. Mode sidecar menjaga seluruh akses di dalam Pod, sehingga memberikan latensi lebih rendah dan cocok untuk workload yang sensitif terhadap latensi. Kelemahannya adalah konsumsi resource, perlu restart Pod untuk setiap aplikasi, serta fleksibilitas terbatas.
-
Mode terpusat (digunakan dalam tutorial ini) — OPA terpusat melengkapi mode sidecar dalam aspek-aspek berikut: mengonsumsi lebih sedikit resource, menghubungkan aplikasi tanpa perlu restart, dan memungkinkan Anda menentukan permintaan mana ke aplikasi yang dievaluasi terhadap kebijakan OPA.
Prasyarat
-
Kluster Kubernetes terkelola telah ditambahkan ke instans ASM yang menjalankan versi 1.15.3.25 atau yang lebih baru. Untuk petunjuknya, lihat Add a cluster to an ASM instance dan Upgrade an ASM instance.
-
Aplikasi httpbin telah dideploy dan dapat diakses melalui gerbang masuk ASM. Perintah pengujian dalam tutorial ini mengirim permintaan ke
${ASM_GATEWAY_IP}, yaitu alamat IP gerbang tersebut. Untuk petunjuknya, lihat Deploy the httpbin application. -
Injeksi sidecar otomatis diaktifkan untuk namespace
default. Untuk petunjuknya, lihat Configure a sidecar injection policy.
Langkah 1: Deploy OPA
Deploy layanan otorisasi OPA terpusat di kluster yang telah Anda tambahkan ke instans ASM.
-
Buat file
asm-opa.yamldengan konten berikut. File YAML ini mendeploy Service OPA, Deployment OPA, dan Secret.Ganti
cn-hangzhoudalam imageregistry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-staticdengan wilayah kluster Anda sebelum mendeploy file tersebut.Engine OPA dalam Deployment mengaktifkan logging secara default (
--set=decision_logs.console=true) untuk menyederhanakan debugging.Secret menentukan kebijakan OPA, yang mengizinkan permintaan dalam salah satu kondisi berikut:
-
Jalur permintaan adalah
health. -
Metode permintaan adalah
HEAD. -
Username adalah
alice.CatatanUsername berasal dari header
Authorizationpermintaan, dalam formatAuthorization: Basic ${encoding Base64 dari string username:password}.
asm-opa.yaml
apiVersion: v1 kind: Service metadata: name: asm-opa labels: app: opa spec: ports: - name: grpc port: 9191 targetPort: 9191 protocol: TCP - name: http port: 8181 targetPort: 8181 protocol: TCP selector: app: opa --- kind: Deployment apiVersion: apps/v1 metadata: name: opa labels: app: opa spec: replicas: 1 selector: matchLabels: app: opa template: metadata: labels: app: opa annotations: sidecar.istio.io/inject: "false" spec: containers: - name: opa image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static securityContext: runAsUser: 1111 volumeMounts: - readOnly: true mountPath: /policy name: opa-policy args: - "run" - "--server" - "--addr=0.0.0.0:8181" - "--diagnostic-addr=0.0.0.0:8282" - "--set=plugins.envoy_ext_authz_grpc.addr=:9191" - "--set=plugins.envoy_ext_authz_grpc.path=asm/authz/allow" - "--set=decision_logs.console=true" - "--ignore=.*" - "/policy/policy.rego" ports: - containerPort: 9191 protocol: TCP resources: limits: cpu: "0" memory: "0" volumes: - name: opa-policy secret: secretName: opa-policy --- apiVersion: v1 kind: Secret metadata: name: opa-policy type: Opaque stringData: policy.rego: | 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 == "alice" } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }CatatanNilai
resources.limitsdalam contoh ini bersifat placeholder. Atur nilaicpudanmemorysesuai dengan lingkungan Anda. -
-
Gunakan file kubeconfig kluster Container Service for Kubernetes (ACK) untuk menjalankan perintah berikut guna mendeploy OPA.
kubectl apply -f asm-opa.yaml -
Pastikan layanan otorisasi OPA tersedia sebelum melanjutkan. Deployment
opaharus siap, dan Serviceasm-opaharus mengekspos port9191untuk gRPC dan port8181untuk HTTP.
Langkah 2: Menghubungkan ke OPA menggunakan kebijakan keamanan ASM
Buat kebijakan keamanan ASM yang mengirimkan permintaan tertentu ke layanan otorisasi OPA untuk otorisasi.
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
-
Di halaman ASMSecurityPolicy, klik Create. Di kotak dialog Create ASMSecurityPolicy, klik kartu Custom Authorization Service, lalu klik OK.
-
Konfigurasikan Custom Authorization Service:
-
Di halaman Create Custom Authorization Service, konfigurasikan informasi layanan otorisasi OPA yang telah Anda deploy di Langkah 1.
Atur parameter sebagai berikut: tetapkan ASM Security Policy Name menjadi
opa, pilih GRPC untuk Protocol, masukkanasm-opa.default.svc.cluster.localuntuk Service Address, masukkan9191untuk Service Port, dan masukkan10detik untuk Timeout. Lalu, klik Next. -
Di wizard Workload and Match Rules, klik Add Workload Group. Di kotak dialog New Workload Group, masukkan Workload Group Name lalu klik Add Workload.
-
Di kotak dialog Add Workload, pilih Workload Scope, atur Namespaces menjadi default, dan atur Workload Type menjadi Service. Di area Select workloads, pilih httpbin, klik ikon
, lalu klik OK. -
Di kotak dialog New Workload Group, buka area Match Rule List. Atur Match Mode menjadi The selected request must be authenticated, atur Matching Rules menjadi Custom Matching Rules, aktifkan sakelar Path dan atur nilainya menjadi
/status/*, lalu klik OK.Grup workload ini bernama
httpbin, dan daftar workload-nya berisi Service httpbin bertipe Sidecar dengan labelapp:httpbin. -
Di wizard Workload and Match Rules, klik Submit.
Setelah Anda mengirimkan konfigurasi, halaman akan menampilkan The ASM security policy is created dan menunjukkan resource Istio yang dibuat. Nama resource tersebut adalah
grpcextauth-asmsecuritypolicy-opauntuk ASMExtensionProvider danopa-ap-wg-httpbin-default-service-httpbinuntuk AuthorizationPolicy. Anda dapat mengklik View YAML untuk melihat detail resource, lalu klik Done.
-
Langkah 3: Uji akses httpbin
Dalam perintah berikut, ${ASM_GATEWAY_IP} adalah alamat IP gerbang masuk ASM yang mengekspos httpbin. Setiap perintah menggunakan -I untuk hanya mengembalikan header respons dan -X GET untuk memaksa metode GET, karena kebijakan OPA mengizinkan setiap permintaan HEAD. Pengujian ini menguji aturan username dalam kebijakan OPA.
-
Jalankan perintah berikut untuk mengakses jalur
/.curl ${ASM_GATEWAY_IP}/ -I -X GET
ResponsHTTP/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: 2200 OKmenunjukkan bahwa permintaan diizinkan. Jalur/tidak sesuai dengan aturan pencocokan/status/*yang Anda konfigurasikan di Langkah 2, sehingga permintaan tidak dikirim ke OPA untuk otorisasi. -
Jalankan perintah berikut untuk mengakses jalur
/status/201tanpa kredensial yang valid.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET
ResponsHTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:31:18 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1403 Forbiddenmenunjukkan bahwa permintaan ditolak karena tidak membawa kredensial yang valid. -
Jalankan perintah berikut untuk mengakses jalur
/status/201dengan kredensial yang valid.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpassword
ResponsHTTP/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: 3201 Createdmengonfirmasi bahwa permintaan diizinkan karena membawa kredensial yang valid untuk penggunaalice. Jika permintaan ini juga mengembalikan403 Forbidden, tinjau kembali deployment OPA di Langkah 1 dan konfigurasi kebijakan keamanan ASM di Langkah 2.
Langkah 4: Perbarui kebijakan OPA dan uji ulang akses
Panggil API HTTP engine OPA untuk memperbarui kebijakan OPA saat runtime. Secret opa-policy yang Anda buat di Langkah 1 tidak diubah dan masih berisi kebijakan asli.
-
Jalankan perintah berikut untuk memperbarui kebijakan agar hanya pengguna
bobyang diizinkan mengakses aplikasi, sedangkan penggunaalicesebelumnya ditolak.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 httpbin sebagai pengguna
bob.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user bob:testpassword
ResponsHTTP/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: 3201 Createdmenunjukkan bahwa penggunabobberhasil mengakses aplikasi berdasarkan kebijakan yang diperbarui. -
Jalankan perintah berikut untuk mengakses httpbin sebagai pengguna
alice.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpassword
ResponsHTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:32:49 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1403 Forbiddenmenunjukkan bahwa akses dari penggunaaliceditolak.