All Products
Search
Document Center

Alibaba Cloud Service Mesh:Integrasikan mesin OPA dengan gerbang masuk

Last Updated:Jun 21, 2026

Untuk menerapkan kontrol akses dinamis, Anda dapat mengintegrasikan mesin Open Policy Agent (OPA) ke dalam gerbang masuk guna menyesuaikan kebijakan otorisasi berdasarkan identitas pengguna atau konten permintaan serta mengontrol komunikasi antar layanan secara real time. Pendekatan ini secara efektif mencegah akses tidak sah, mengurangi risiko kebocoran data, dan meningkatkan keamanan aplikasi dalam instans Service Mesh (ASM). Topik ini menjelaskan cara menggunakan mesin OPA untuk mengotentikasi dan mengotorisasi permintaan yang diterima oleh gerbang masuk. Dalam contoh ini, permintaan dialirkan melalui gerbang masuk untuk mengakses aplikasi HTTPBin.

Prasyarat

Langkah 1: Terapkan mesin OPA

  1. Buat file bernama asm-opa.yaml dengan konten berikut.

    Manifes YAML ini menerapkan Service, Deployment, dan Secret OPA.

    Kind

    Deskripsi

    Deployment

    • Pada path image registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static, ganti cn-hangzhou dengan ID wilayah kluster Anda.

    • Mesin eksekusi OPA ini mengaktifkan pencatatan keputusan secara default (--set=decision_logs.console=true) untuk menyederhanakan debugging.

    Secret

    Secret mendefinisikan kebijakan OPA dengan aturan berikut:

    • Izinkan permintaan jika path-nya adalah health.

    • Izinkan permintaan jika metodenya adalah HEAD.

    • Izinkan permintaan jika username-nya adalah alice.

      Catatan

      Username diekstraksi dari header Authorization, yang harus dalam format Authorization: Basic ${base64_encoded_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), ":")
        }
    
  2. Jalankan perintah berikut untuk menerapkan OPA.

    kubectl apply -f asm-opa.yaml

Langkah 2: Gunakan fitur otorisasi eksternal gerbang masuk untuk mengintegrasikan mesin OPA dengan gerbang masuk

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

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

  3. Pada halaman Ingress Gateway, temukan gerbang yang ingin Anda integrasikan dengan OPA lalu klik Gateway Security.

  4. Di panel navigasi kiri gerbang, pilih Gateway Security > External Authorization Service.

  5. Konfigurasikan layanan otorisasi kustom.

    1. Pada wizard Custom Authorization Service Configuration, konfigurasikan OPA sebagai layanan otorisasi kustom untuk gerbang tersebut, lalu klik Next.

      Aktifkan sakelar Enable Gateway Custom Authorization Service, pilih tab Custom authorization service based on envoy.ext_authz (HTTP or gRPC), atur Protocol ke GRPC, service address ke asm-opa.default.svc.cluster.local, service port ke 9191, dan timeout ke 10 detik.

    2. Pada wizard Matching Rules, konfigurasikan aturan pencocokan untuk menentukan permintaan mana yang memerlukan otorisasi OPA, lalu klik Submit.

      Atur Matching Mode ke Selected requests must be authorized, pilih Custom matching rules, aktifkan HTTP Path (Path), dan masukkan /status/*.

      Muncul pesan konfirmasi bahwa Gateway Custom Authorization Service was created successfully dan mencantumkan resource native Istio yang dibuat: ASMExtensionProvider (nama resource: grpcextauth-asmsecuritypolicy-ingressgateway-extauthz) dan AuthorizationPolicy (nama resource: ingressgateway-extauthz-ap-wg-gateway-istio-system-gateway-ingressgateway). Anda dapat mengklik View YAML untuk melihat konfigurasi resource atau mengklik Edit untuk memodifikasi layanan otorisasi.

Langkah 3: Uji akses httpbin

  1. Jalankan perintah berikut untuk mengakses path /.

    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

    Output menunjukkan bahwa permintaan diizinkan karena path ini tidak memerlukan autentikasi.

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

    curl ${ASM_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 menunjukkan bahwa permintaan ditolak karena kredensial tidak tersedia.

  3. Jalankan perintah berikut untuk mengakses path /status/201 dengan kredensial valid untuk pengguna alice.

    curl ${ASM_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 permintaan diizinkan karena pengguna alice diotorisasi oleh kebijakan OPA.

Langkah 4: Perbarui kebijakan OPA

Anda dapat memperbarui kebijakan OPA saat runtime dengan memanggil API HTTP mesin OPA.

  1. Jalankan perintah berikut untuk memperbarui kebijakan. Kebijakan baru hanya mengizinkan akses untuk pengguna bob dan menolak akses untuk alice.

    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 menguji akses sebagai pengguna bob.

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

    Output yang diharapkan:

    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

    Tanggapan 201 Created menunjukkan bahwa pengguna bob berhasil mengakses path tersebut.

  3. Jalankan perintah berikut untuk menguji akses sebagai pengguna alice.

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

    Output yang diharapkan:

    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

    Tanggapan 403 Forbidden mengonfirmasi bahwa pengguna alice kini ditolak aksesnya, sehingga memvalidasi pembaruan kebijakan.