All Products
Search
Document Center

:Perbarui kebijakan OPA secara dinamis di ASM

Last Updated:Jun 21, 2026

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

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.OPA

Langkah 1: Aktifkan OPA

  1. Masuk ke ASM console.

  2. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

  3. Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.

  4. Pada halaman Basic Information, klik Settings di pojok kanan atas.

  5. Pada panel Settings Update, pilih Enable OPA plug-in.

  6. 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.

Penting
  • 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 bidang default allow, keberadaan beberapa bidang default allow tersebut akan menyebabkan pembaruan dinamis gagal.

  • Sidecar OPA bergantung pada ConfigMap bernama opa-policy untuk 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.

  1. Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.

  2. Buat ConfigMap bernama opa-policy.

    Sidecar OPA memerlukan ConfigMap bernama opa-policy untuk memulai. ConfigMap ini mendukung pembaruan dinamis. Gunakan ConfigMap ini hanya untuk konfigurasi kebijakan dasar. Tambahkan kebijakan kompleks secara dinamis melalui ConfigMap lainnya.

    1. 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"
          }
    2. Jalankan perintah berikut untuk membuat ConfigMap:

      kubectl apply -f opa-policy.yaml
  3. Buat ConfigMap bernama opa-policy-add.

    Gunakan ConfigMap ini untuk menentukan kebijakan OPA Anda.

    1. 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 peran guest kepada guest1 dan peran admin kepada admin1.

      • role_perms: Menetapkan izin untuk setiap peran. Contoh ini mengizinkan peran guest mengakses aplikasi di jalur /productpage, dan peran admin mengakses aplikasi di jalur /productpage dan /api/v1/products.

    2. Jalankan perintah berikut untuk membuat ConfigMap:

      kubectl apply -f opa-policy-add.yaml
  4. Jalankan perintah berikut untuk melihat hasil dorongan kebijakan:

    Status dorongan diperbarui di annotations ConfigMap.

    kubectl get configmap  opa-policy-add -o yaml  

    Lihat 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.

  1. Deploy aplikasi contoh Bookinfo ke instans ASM. Untuk informasi selengkapnya, lihat Deploy an application to an ASM instance.

  2. Tentukan layanan virtual Istio dan layanan gateway masuk sesuai kebutuhan. Untuk informasi selengkapnya, lihat Version-based traffic routing with Istio.

  3. Periksa apakah sidecar OPA disuntikkan ke pod setiap aplikasi dalam aplikasi Bookinfo.

    1. Masuk ke Container Service Management Console.

    2. Di panel navigasi kiri, klik Cluster.

    3. Pada halaman Cluster List, klik nama kluster tujuan atau klik Details di kolom Actions.

    4. Di panel navigasi kiri halaman manajemen kluster, pilih Workload > Pods.

    5. 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 guest1 yang memiliki peran guest dapat mengakses aplikasi di /productpage tetapi ditolak saat mengakses /api/v1/products.

    curl -X GET http://{{The IP address of the ingress gateway service}}/productpage --user guest1:password -I

    Output berikut diharapkan:

    HTTP/1.1 200 OK
    curl -X GET http://{{The IP address of the ingress gateway service}}/api/v1/products --user guest1:password -I

    Output berikut diharapkan:

    HTTP/1.1 403 Forbidden
  • Jalankan perintah berikut. Hasilnya menunjukkan bahwa pengguna admin1 yang memiliki peran admin dapat mengakses aplikasi baik di jalur /productpage maupun /api/v1/products.

    curl -X GET http://{{The IP address of the ingress gateway service}}/productpage --user admin1:password -I

    Output berikut diharapkan:

    HTTP/1.1 200 OK
    curl -X GET http://{{The IP address of the ingress gateway service}}/api/v1/products --user admin1:password -I

    Output berikut diharapkan:

    HTTP/1.1 200 OK

    Hasil di atas menunjukkan bahwa kebijakan OPA yang ditentukan menerapkan kontrol akses sesuai harapan.

Langkah 5: Perbarui kebijakan OPA secara dinamis

  1. 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 peran guest dan admin kepada guest1, sedangkan admin1 memiliki peran admin.

    • role_perms: Menetapkan izin untuk setiap peran. Contoh ini mengizinkan peran guest mengakses aplikasi di jalur /productpage, dan peran admin mengaksesnya di jalur /productpage dan /api/v1/products.

  2. Jalankan perintah berikut untuk melihat hasil dorongan kebijakan:

    Status dorongan diperbarui di annotations ConfigMap.

    kubectl get configmap  opa-policy-add -o yaml  

    Lihat 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 -I

Output berikut diharapkan:

HTTP/1.1 200 OK
curl -X GET http://{{The IP address of the ingress gateway service}}/api/v1/products --user guest1:password -I

Output berikut diharapkan:

HTTP/1.1 200 OK

Sebelum 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.