All Products
Search
Document Center

Alibaba Cloud Service Mesh:Integrasikan mesin OPA dengan gerbang masuk

Last Updated:Mar 12, 2026

Saat gerbang masuk menerima traffic eksternal, kontrol akses detail halus sering kali memerlukan lebih dari sekadar aturan izinkan/tolak yang sederhana. Open Policy Agent (OPA) memungkinkan Anda menulis kebijakan otorisasi kustom dalam Rego dan menerapkannya di tingkat gerbang—tanpa mengubah kode aplikasi.

Topik ini menjelaskan penerapan mesin OPA bersama gerbang masuk Service Mesh (ASM), integrasinya melalui mekanisme otorisasi eksternal Envoy, serta pengujian konfigurasi tersebut menggunakan aplikasi HTTPBin.

Cara kerja

Gerbang masuk ASM menggunakan Envoy sebagai proxy bidang data. Envoy mendukung filter otorisasi eksternal (ext_authz) yang mendelegasikan keputusan otorisasi ke layanan eksternal.

Saat OPA diintegrasikan sebagai layanan otorisasi eksternal:

  1. Permintaan tiba di gerbang masuk.

  2. Envoy mengirim metadata permintaan (metode, path, header) ke mesin OPA melalui gRPC.

  3. OPA mengevaluasi permintaan tersebut terhadap kebijakan Rego yang dimuat.

  4. OPA mengembalikan keputusan izinkan atau tolak. Envoy kemudian meneruskan permintaan ke hulu atau mengembalikan 403 Forbidden.

Karena OPA berjalan sebagai Pod terpisah dalam kluster, evaluasi kebijakan bersifat lokal—tidak diperlukan lompatan jaringan eksternal. Kebijakan dapat diperbarui saat runtime melalui API HTTP OPA tanpa perlu menerapkan ulang beban kerja apa pun.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Langkah 1: Terapkan mesin OPA

Buat file bernama asm-opa.yaml dengan konten berikut. Manifes ini mendefinisikan tiga resource Kubernetes:

ResourceTujuan
ServiceMengekspos mesin OPA pada port 9191 (gRPC) dan port 8181 (HTTP)
DeploymentMenjalankan kontainer OPA dengan plugin gRPC otorisasi eksternal Envoy diaktifkan
SecretMenyimpan kebijakan Rego default yang dimuat OPA saat startup
Catatan

Ganti ID wilayah cn-hangzhou dalam path gambar kontainer dengan wilayah tempat kluster Anda ditempatkan. Misalnya, jika kluster Anda berada di wilayah China (Shanghai), gunakan registry-vpc.cn-shanghai.aliyuncs.com/acs/opa:0.46.1-istio-3-static.

Tampilkan isi 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), ":")
    }

Bidang konfigurasi utama

args pada Deployment mengonfigurasi cara kerja mesin OPA:

BidangNilaiDeskripsi
--addr0.0.0.0:8181Alamat pendengar API HTTP untuk manajemen kebijakan dan pemeriksaan kesehatan.
--diagnostic-addr0.0.0.0:8282Titik akhir diagnostik untuk probe kesiapan dan pemeriksaan kelangsungan hidup.
plugins.envoy_ext_authz_grpc.addr:9191Alamat pendengar gRPC untuk plugin otorisasi eksternal Envoy. Harus sesuai dengan port Service.
plugins.envoy_ext_authz_grpc.pathasm/authz/allowPath keputusan kebijakan Rego. OPA mengevaluasi data.asm.authz.allow untuk setiap permintaan.
decision_logs.consoletrueMencetak log keputusan ke stdout untuk debugging.

Aturan kebijakan default

Kebijakan Rego dalam Secret mendefinisikan tiga aturan otorisasi. Permintaan diizinkan jika salah satu aturan dievaluasi menjadi true:

AturanKondisiContoh
Bypass pemeriksaan kesehatanPath permintaan diawali dengan healthGET /health
Bypass metode HEADMetode HTTP adalah HEADHEAD /any-path
Otorisasi penggunaUsername dalam header Authorization adalah aliceAuthorization: Basic YWxpY2U6dGVzdHBhc3N3b3Jk (alice:testpassword, dalam format Base64)

Semua permintaan lainnya ditolak (default allow := false).

Terapkan

Jalankan perintah berikut untuk menerapkan OPA ke kluster Container Service for Kubernetes (ACK):

kubectl apply -f asm-opa.yaml

Langkah 2: Konfigurasikan gerbang masuk untuk menggunakan OPA

Hubungkan mesin OPA ke gerbang masuk sebagai layanan otorisasi kustom melalui Konsol ASM.

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

  2. Pada halaman Mesh Management, klik nama instans ASM yang dituju. Di panel navigasi sebelah kiri, pilih ASM Gateways > Ingress Gateway.

  3. Pada halaman Ingress Gateway, klik Gateway security di sebelah gerbang masuk yang ingin dikonfigurasi.

  4. Di panel navigasi sebelah kiri, pilih Gateway Security > Custom Authorization Service.

  5. Pada langkah Custom Authorization Service Configuration, konfigurasikan mesin OPA sebagai layanan otorisasi kustom untuk gerbang masuk, lalu klik Next.

    Custom Authorization Service Configuration

  6. Pada langkah Matching Rules, tentukan permintaan mana yang memerlukan otorisasi OPA, lalu klik Submit.

    Matching Rules

Setelah konfigurasi disimpan, layanan otorisasi kustom akan muncul di halaman:

Custom Authorization Service Created

Langkah 3: Verifikasi otorisasi OPA

Uji ketiga aturan otorisasi dengan mengirim permintaan ke aplikasi HTTPBin melalui gerbang masuk.

Ganti <gateway-ip> dalam perintah berikut dengan alamat IP gerbang masuk ASM Anda.

Uji 1: Akses path yang tidak tercakup oleh aturan pencocokan

Kirim permintaan GET ke path root (/). Jika aturan pencocokan yang dikonfigurasi pada Langkah 2 tidak mencakup path ini, permintaan akan melewati OPA dan langsung mencapai layanan hulu.

curl <gateway-ip>/ -I -X GET

Output yang diharapkan:

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

Tanggapan 200 OK mengonfirmasi bahwa permintaan ke path ini tidak dicegat oleh OPA.

Uji 2: Akses path yang dilindungi tanpa kredensial

Kirim permintaan GET ke /status/201 tanpa header Authorization:

curl <gateway-ip>/status/201 -I -X GET

Output 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: 1

Tanggapan 403 Forbidden mengonfirmasi bahwa OPA menolak permintaan yang tidak sesuai dengan aturan izinkan apa pun.

Uji 3: Akses path yang dilindungi dengan kredensial valid

Kirim permintaan GET ke /status/201 dengan username yang diotorisasi alice:

curl <gateway-ip>/status/201 -I -X GET --user alice:testpassword

Output 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: 3

Tanggapan 201 Created mengonfirmasi bahwa OPA mengotorisasi permintaan dari pengguna alice.

Langkah 4: Perbarui kebijakan OPA saat runtime

OPA menyediakan API HTTP untuk manajemen kebijakan. Gunakan API ini untuk memperbarui kebijakan tanpa menerapkan ulang Pod OPA.

Contoh berikut mengubah pengguna yang diotorisasi dari alice menjadi bob:

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), ":")
}'
Catatan

Perintah ini menjalankan curl dari kontainer istio-proxy pada Pod httpbin karena layanan OPA (asm-opa:8181) hanya dapat diakses di dalam kluster. Metode HTTP PUT menggantikan kebijakan yang ada pada path yang ditentukan.

Verifikasi kebijakan yang diperbarui

  1. Kirim permintaan sebagai bob. Harapkan tanggapan 201 Created: Output yang diharapkan:

       curl <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
  2. Kirim permintaan sebagai alice. Harapkan tanggapan 403 Forbidden: Output yang diharapkan:

       curl <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

Hasil ini mengonfirmasi bahwa kebijakan yang diperbarui langsung berlaku: bob diotorisasi sedangkan alice kini ditolak.