Service Mesh (ASM) Alibaba Cloud terintegrasi dengan plug-in Open Policy Agent (OPA), memungkinkan Anda menentukan kebijakan kontrol akses granular untuk aplikasi Anda. Instans ASM versi v1.8.6.41 atau lebih baru mendukung konfigurasi ConfigMap untuk mendorong kebijakan OPA ke pod secara otomatis, sehingga memungkinkan pembaruan kebijakan secara dinamis. Topik ini menjelaskan cara memperbarui kebijakan OPA secara dinamis di ASM.
Prasyarat
-
Instans ASM versi v1.8.6.41-gb1d8f288-aliyun atau lebih baru telah dibuat. Untuk informasi selengkapnya, lihat Create an ASM instance.
Kluster ACK yang dikelola telah dibuat. Untuk informasi selengkapnya, lihat Create an ACK managed cluster.
Informasi latar belakang
Di bawah naungan CNCF sebagai proyek inkubasi, Open Policy Agent (OPA) adalah mesin kebijakan yang dapat Anda gunakan untuk menerapkan kontrol akses granular pada aplikasi Anda. Sebagai mesin kebijakan tujuan umum, OPA dapat dideploy sebagai layanan mandiri yang berjalan bersama layanan mikro Anda. Untuk melindungi suatu aplikasi, setiap permintaan ke layanan mikro harus melalui otorisasi. Layanan mikro tersebut mengirim kueri ke API OPA untuk menentukan apakah permintaan tersebut diizinkan.
Langkah 1: Aktifkan OPA
-
Masuk ke ASM console.
-
Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.
-
Pada halaman Basic Information, klik Settings di pojok kanan atas.
-
Pada panel Settings Update, pilih Enable OPA plug-in.
-
Klik OK.
Pada halaman Basic Information, status OPA Plug-in berubah menjadi Enable.
Langkah 2: Buat ConfigMap
ASM mendukung pembaruan dinamis untuk kebijakan OPA. Anda dapat mengonfigurasi Service Mesh dengan label openpolicyagent.org/policy=rego. Kebijakan tersebut kemudian akan didorong secara otomatis ke semua pod yang memiliki sidecar OPA yang disuntikkan di seluruh namespace. Menghapus ConfigMap juga akan menghapus kebijakan dari pod tersebut.
-
Saat menentukan kebijakan OPA untuk sebuah pod, Anda hanya boleh menyertakan satu bidang
default allow. Jika beberapa ConfigMap yang terkait dengan kebijakan OPA berlaku untuk satu pod dan masing-masing mendefinisikan bidangdefault allow, keberadaan beberapa bidangdefault allowtersebut akan menyebabkan pembaruan dinamis gagal. -
Sidecar OPA bergantung pada ConfigMap bernama
opa-policyuntuk memulai. Jika Anda menghapus ConfigMap ini, kebijakan OPA terkait juga akan dihapus dari sidecar OPA. Membuat ulang ConfigMap tidak akan memulihkan kebijakan tersebut; Anda harus membuat ulang pod-nya.
-
Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
-
Buat ConfigMap bernama opa-policy.
Sidecar OPA memerlukan ConfigMap bernama
opa-policyuntuk memulai. ConfigMap ini mendukung pembaruan dinamis. Gunakan ConfigMap ini hanya untuk konfigurasi kebijakan dasar. Tambahkan kebijakan kompleks secara dinamis melalui ConfigMap lainnya.-
Gunakan konten berikut untuk membuat file YAML bernama opa-policy:
apiVersion: v1 kind: ConfigMap metadata: name: opa-policy data: policy.rego: | ### Jalur yang diizinkan dalam kebijakan ini diperlukan untuk pembaruan kebijakan OPA secara dinamis. Jika jalur ini tidak dikonfigurasi, pembaruan akan gagal. package istio.authz import input.parsed_path allow { parsed_path[0] = "v1" parsed_path[1] = "policies" } -
Jalankan perintah berikut untuk membuat ConfigMap:
kubectl apply -f opa-policy.yaml
-
-
Buat ConfigMap bernama opa-policy-add.
Gunakan ConfigMap ini untuk menentukan kebijakan OPA Anda.
-
Gunakan konten berikut untuk membuat file YAML bernama opa-policy-add:
apiVersion: v1 kind: ConfigMap metadata: name: opa-policy-add labels: ### Anda harus mengonfigurasi label berikut di ConfigMap. Jika tidak, kebijakan OPA yang didefinisikan oleh ConfigMap ini tidak dapat diperbarui secara dinamis. openpolicyagent.org/policy: rego data: policy.rego: | ### Kode berikut menunjukkan definisi kebijakan contoh. Tentukan kebijakan sesuai kebutuhan aktual Anda. package istio.authz import input.attributes.request.http as http_request default allow = false allow { roles_for_user[r] required_roles[r] } roles_for_user[r] { r := user_roles[user_name][_] } required_roles[r] { perm := role_perms[r][_] perm.method = http_request.method perm.path = http_request.path } user_name = parsed { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") } user_roles = { "guest1": ["guest"], "admin1": ["admin"] } role_perms = { "guest": [ {"method": "GET", "path": "/productpage"}, ], "admin": [ {"method": "GET", "path": "/productpage"}, {"method": "GET", "path": "/api/v1/products"}, ], }-
user_roles: Menetapkan peran kepada pengguna. Contoh ini memberikan peranguestkepadaguest1dan peranadminkepadaadmin1. -
role_perms: Menetapkan izin untuk setiap peran. Contoh ini mengizinkan peranguestmengakses aplikasi di jalur /productpage, dan peranadminmengakses aplikasi di jalur /productpage dan /api/v1/products.
-
-
Jalankan perintah berikut untuk membuat ConfigMap:
kubectl apply -f opa-policy-add.yaml
-
-
Jalankan perintah berikut untuk melihat hasil dorongan kebijakan:
Status dorongan diperbarui di
annotationsConfigMap.kubectl get configmap opa-policy-add -o yamlLihat ConfigMap pada output perintah:
-
Jika dorongan berhasil, Anda akan melihat informasi berikut di ConfigMap.
openpolicyagent.org/policy-status: '{"status":"ok"}' -
Jika dorongan gagal, pesan error yang sesuai akan ditampilkan.
-
Langkah 3: Suntikkan sidecar OPA
Deploy aplikasi contoh Bookinfo di instans ASM dan periksa apakah sidecar OPA disuntikkan ke setiap pod aplikasi Bookinfo.
-
Deploy aplikasi contoh Bookinfo ke instans ASM. Untuk informasi selengkapnya, lihat Deploy an application to an ASM instance.
-
Tentukan layanan virtual Istio dan layanan gateway masuk sesuai kebutuhan. Untuk informasi selengkapnya, lihat Version-based traffic routing with Istio.
-
Periksa apakah sidecar OPA disuntikkan ke pod setiap aplikasi dalam aplikasi Bookinfo.
Masuk ke Container Service Management Console.
Di panel navigasi kiri, klik Cluster.
Pada halaman Cluster List, klik nama kluster tujuan atau klik Details di kolom Actions.
Di panel navigasi kiri halaman manajemen kluster, pilih .
-
Pada halaman Pods, pilih default dari daftar drop-down Namespace dan klik nama pod aplikasi target.
Pada tab Containers, pastikan proxy sidecar (istio-proxy) dan sidecar OPA (opa-istio) telah disuntikkan. Ulangi pemeriksaan ini untuk setiap pod aplikasi.
Langkah 4: Verifikasi bahwa kebijakan OPA menerapkan kontrol akses sesuai harapan
-
Jalankan perintah berikut. Hasilnya menunjukkan bahwa pengguna
guest1yang memiliki peranguestdapat mengakses aplikasi di/productpagetetapi ditolak saat mengakses/api/v1/products.curl -X GET http://{{The IP address of the ingress gateway service}}/productpage --user guest1:password -IOutput berikut diharapkan:
HTTP/1.1 200 OKcurl -X GET http://{{The IP address of the ingress gateway service}}/api/v1/products --user guest1:password -IOutput berikut diharapkan:
HTTP/1.1 403 Forbidden -
Jalankan perintah berikut. Hasilnya menunjukkan bahwa pengguna
admin1yang memiliki peranadmindapat mengakses aplikasi baik di jalur/productpagemaupun/api/v1/products.curl -X GET http://{{The IP address of the ingress gateway service}}/productpage --user admin1:password -IOutput berikut diharapkan:
HTTP/1.1 200 OKcurl -X GET http://{{The IP address of the ingress gateway service}}/api/v1/products --user admin1:password -IOutput berikut diharapkan:
HTTP/1.1 200 OKHasil di atas menunjukkan bahwa kebijakan OPA yang ditentukan menerapkan kontrol akses sesuai harapan.
Langkah 5: Perbarui kebijakan OPA secara dinamis
-
Jalankan perintah berikut pada kluster ACK untuk memperbarui ConfigMap bernama opa-policy-add:
kubectl replace -n {The namespace where the ACK cluster resides} -f - <<EOF apiVersion: v1 kind: ConfigMap metadata: name: opa-policy-add labels: ### Anda harus mengonfigurasi label berikut di ConfigMap. Jika tidak, kebijakan OPA yang didefinisikan oleh ConfigMap ini tidak dapat diperbarui secara dinamis. openpolicyagent.org/policy: rego data: policy.rego: | ### Kode berikut menunjukkan definisi kebijakan contoh. Tentukan kebijakan sesuai kebutuhan aktual Anda. package istio.authz import input.attributes.request.http as http_request default allow = false allow { roles_for_user[r] required_roles[r] } roles_for_user[r] { r := user_roles[user_name][_] } required_roles[r] { perm := role_perms[r][_] perm.method = http_request.method perm.path = http_request.path } user_name = parsed { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") } user_roles = { "guest1": ["guest", "admin"], "admin1": ["admin"] } role_perms = { "guest": [ {"method": "GET", "path": "/productpage"}, ], "admin": [ {"method": "GET", "path": "/productpage"}, {"method": "GET", "path": "/api/v1/products"}, ], } EOF-
user_roles: Menetapkan peran kepada pengguna. Contoh ini memberikan peranguestdanadminkepadaguest1, sedangkanadmin1memiliki peranadmin. -
role_perms: Menetapkan izin untuk setiap peran. Contoh ini mengizinkan peranguestmengakses aplikasi di jalur /productpage, dan peranadminmengaksesnya di jalur /productpage dan /api/v1/products.
-
-
Jalankan perintah berikut untuk melihat hasil dorongan kebijakan:
Status dorongan diperbarui di
annotationsConfigMap.kubectl get configmap opa-policy-add -o yamlLihat ConfigMap pada output perintah:
-
Jika dorongan berhasil, Anda akan melihat informasi berikut di ConfigMap.
openpolicyagent.org/policy-status: '{"status":"ok"}' -
Jika dorongan gagal, pesan error yang sesuai akan ditampilkan.
-
Langkah 6: Verifikasi bahwa kebijakan OPA diperbarui secara dinamis
Jalankan perintah cURL berikut. Hasilnya menunjukkan bahwa peran admin diberikan kepada pengguna guest1. Selain itu, pengguna guest1 memiliki izin untuk mengakses aplikasi menggunakan URL yang berisi /productpage atau /api/v1/products.
curl -X GET http://{{The IP address of the ingress gateway service}}/productpage --user guest1:password -IOutput berikut diharapkan:
HTTP/1.1 200 OKcurl -X GET http://{{The IP address of the ingress gateway service}}/api/v1/products --user guest1:password -IOutput berikut diharapkan:
HTTP/1.1 200 OKSebelum kebijakan OPA diperbarui, pengguna guest1 dapat mengakses aplikasi menggunakan URL yang berisi /productpage, tetapi tidak dapat mengakses /api/v1/products. Setelah kebijakan OPA diperbarui, pengguna guest1 dapat mengakses aplikasi menggunakan URL yang berisi /productpage atau /api/v1/products. Hasil ini menunjukkan bahwa kebijakan OPA diperbarui secara dinamis.