All Products
Search
Document Center

Alibaba Cloud Service Mesh:Menghubungkan OPA eksternal menggunakan kebijakan keamanan ASM

Last Updated:Aug 28, 2026

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.

    OPA deployment modes

Prasyarat

Langkah 1: Deploy OPA

Deploy layanan otorisasi OPA terpusat di kluster yang telah Anda tambahkan ke instans ASM.

  1. Buat file asm-opa.yaml dengan konten berikut. File YAML ini mendeploy Service OPA, Deployment OPA, dan Secret.

    Ganti cn-hangzhou dalam image registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static dengan 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.

      Catatan

      Username berasal dari header Authorization permintaan, dalam format Authorization: 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), ":")
        }
    Catatan

    Nilai resources.limits dalam contoh ini bersifat placeholder. Atur nilai cpu dan memory sesuai dengan lingkungan Anda.

  2. Gunakan file kubeconfig kluster Container Service for Kubernetes (ACK) untuk menjalankan perintah berikut guna mendeploy OPA.

    kubectl apply -f asm-opa.yaml
  3. Pastikan layanan otorisasi OPA tersedia sebelum melanjutkan. Deployment opa harus siap, dan Service asm-opa harus mengekspos port 9191 untuk gRPC dan port 8181 untuk HTTP.

Langkah 2: Menghubungkan ke OPA menggunakan kebijakan keamanan ASM

Buat kebijakan keamanan ASM yang mengirimkan permintaan tertentu ke layanan otorisasi OPA untuk otorisasi.

  1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih Mesh Security Center > ASMSecurityPolicy.

  3. Di halaman ASMSecurityPolicy, klik Create. Di kotak dialog Create ASMSecurityPolicy, klik kartu Custom Authorization Service, lalu klik OK.

  4. Konfigurasikan Custom Authorization Service:

    1. 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, masukkan asm-opa.default.svc.cluster.local untuk Service Address, masukkan 9191 untuk Service Port, dan masukkan 10 detik untuk Timeout. Lalu, klik Next.

    2. Di wizard Workload and Match Rules, klik Add Workload Group. Di kotak dialog New Workload Group, masukkan Workload Group Name lalu klik Add Workload.

    3. 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 Add to selected workloads, lalu klik OK.

    4. 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 label app:httpbin.

    5. 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-opa untuk ASMExtensionProvider dan opa-ap-wg-httpbin-default-service-httpbin untuk 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.

  1. Jalankan perintah berikut untuk mengakses jalur /.

    curl ${ASM_GATEWAY_IP}/ -I -X GET

    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: 2
    Respons 200 OK menunjukkan bahwa permintaan diizinkan. Jalur / tidak sesuai dengan aturan pencocokan /status/* yang Anda konfigurasikan di Langkah 2, sehingga permintaan tidak dikirim ke OPA untuk otorisasi.

  2. Jalankan perintah berikut untuk mengakses jalur /status/201 tanpa kredensial yang valid.

    curl ${ASM_GATEWAY_IP}/status/201 -I -X GET

    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: 1
    Respons 403 Forbidden menunjukkan bahwa permintaan ditolak karena tidak membawa kredensial yang valid.

  3. Jalankan perintah berikut untuk mengakses jalur /status/201 dengan kredensial yang valid.

    curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpassword

    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: 3
    Respons 201 Created mengonfirmasi bahwa permintaan diizinkan karena membawa kredensial yang valid untuk pengguna alice. Jika permintaan ini juga mengembalikan 403 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.

  1. Jalankan perintah berikut untuk memperbarui kebijakan agar hanya pengguna bob yang diizinkan mengakses aplikasi, sedangkan pengguna alice sebelumnya 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), ":")
    }'
  2. Jalankan perintah berikut untuk mengakses httpbin sebagai pengguna bob.

    curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user bob:testpassword

    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: 3
    Respons 201 Created menunjukkan bahwa pengguna bob berhasil mengakses aplikasi berdasarkan kebijakan yang diperbarui.

  3. Jalankan perintah berikut untuk mengakses httpbin sebagai pengguna alice.

    curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpassword

    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: 1
    Respons 403 Forbidden menunjukkan bahwa akses dari pengguna alice ditolak.