All Products
Search
Document Center

Alibaba Cloud Service Mesh:Gunakan kebijakan keamanan ASM untuk mengakses mesin OPA eksternal

Last Updated:Jul 02, 2025

Service Mesh (ASM) memungkinkan Anda mengenkapsulasi sumber daya keamanan asli Istio dan menyediakan fitur kebijakan keamanan. Anda dapat menyelesaikan konfigurasi keamanan dengan mudah dalam skenario umum. ASM terintegrasi dengan Open Policy Agent (OPA), yang memungkinkan Anda mendefinisikan kebijakan kontrol akses untuk menerapkan kontrol akses lebih rinci pada aplikasi Anda. Topik ini menjelaskan cara menggunakan kebijakan keamanan ASM untuk mengakses mesin OPA di luar pod.

Prasyarat

Deskripsi Fitur

Secara default, OPA diterapkan dalam mode sidecar di ASM. Saat Anda memulai ulang pod aplikasi setelah mengaktifkan OPA, ASM akan menyuntikkan kontainer OPA ke dalam pod aplikasi. Setelah itu, semua permintaan ke kontainer aplikasi diautentikasi oleh OPA. Dalam mode sidecar, proxy Istio mengakses OPA dalam pod yang sama. Oleh karena itu, latensi rendah, dan mode ini cocok untuk layanan yang sensitif terhadap latensi.

Namun, mode sidecar memiliki beberapa kekurangan: penggunaan sumber daya yang tinggi, pod perlu dimulai ulang saat kontainer OPA disuntikkan, dan permintaan tidak dapat mengakses aplikasi secara fleksibel. OPA dalam mode terpusat dapat melengkapi OPA dalam mode sidecar dalam aspek-aspek ini. Mode terpusat memiliki keunggulan berikut: penggunaan sumber daya lebih rendah, pod tidak perlu dimulai ulang untuk penyebaran kontainer OPA, dan Anda dapat menggunakan kebijakan OPA untuk permintaan tertentu ke aplikasi. Topik ini menjelaskan cara menerapkan OPA dalam mode terpusat untuk autentikasi permintaan ke aplikasi.

OPA部署方式.png

Langkah 1: Terapkan OPA

  1. Buat file bernama asm-opa.yaml dan salin konten berikut ke dalam file tersebut.

    Kode YAML ini digunakan untuk menerapkan Service OPA, Deployment OPA, dan Secret.

    Jenis

    Deskripsi

    Deployment

    • Ganti ID wilayah dalam gambar registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static dengan ID wilayah tempat kluster Anda diterapkan.

    • Secara default, logging diaktifkan untuk mesin OPA (--set=decision_logs.console=true). Ini memudahkan debugging.

    Secret

    Secret ini mendefinisikan kebijakan OPA berikut:

    • Jika jalur permintaan adalah health, permintaan diizinkan.

    • Jika metode permintaan adalah HEAD, permintaan diizinkan.

    • Jika nama pengguna permintaan adalah alice, permintaan diizinkan.

      Catatan

      Nama pengguna dibawa dalam header Authorization dari permintaan, dalam bentuk Authorization: Basic ${user name: Base64-encoded password string}.

    Tampilkan isi dari 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. Gunakan kubectl untuk terhubung ke kluster Container Service for Kubernetes (ACK) berdasarkan informasi dalam file kubeconfig dan jalankan perintah berikut untuk menerapkan OPA:

    kubectl apply -f asm-opa.yaml

Langkah 2: Asosiasikan kebijakan keamanan ASM dengan OPA

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

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

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

  4. Konfigurasikan layanan otorisasi kustom.

    1. Di halaman CreateCustom Authorization Service, konfigurasikan informasi tentang layanan otorisasi OPA yang diterapkan di Langkah 1 dan klik Next.

      创建自定义授权服务.png

    2. Di langkah Workload and Match Rules, klik Add Workload Group. Di kotak dialog New Workload Group, atur Workload Group Name dan klik Add Workload.

    3. Di kotak dialog Add Workload, pilih Workload Scope, atur Namespace menjadi default, lalu atur Workload Type menjadi Service. Kemudian, pilih httpbin di bagian Select workloads, klik ikon Dingtalk_20230302182310.png, lalu klik OK.添加工作负载.png

    4. Di bagian Match Rule List dari kotak dialog New Workload Group, atur Match Mode menjadi The selected request must be authenticated dan Matching Rules menjadi Custom Matching Rules. Nyalakan saklar Path, masukkan /status/* di bidang tersebut, lalu klik OK.

      新建工作负载组.png

    5. Di langkah Workload and Match Rules, klik submit.

      Gambar berikut menunjukkan halaman setelah kebijakan keamanan dibuat dan diasosiasikan dengan OPA.ASM安全策略创建成功.png

Langkah 3: Uji akses ke aplikasi HTTPBin

  1. Jalankan perintah berikut untuk mengakses jalur /:

    curl ${Alamat IP gateway ASM}/ -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

    Output menunjukkan bahwa autentikasi tidak diperlukan untuk permintaan akses ke jalur tersebut.

  2. Jalankan perintah berikut untuk mengakses jalur /status/201 tanpa parameter valid:

    curl ${Alamat IP gateway ASM}/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

    Output menunjukkan bahwa permintaan akses tanpa parameter valid ditolak.

  3. Jalankan perintah berikut untuk mengakses jalur /status/201 dengan parameter valid:

    curl ${Alamat IP gateway ASM}/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

    Output menunjukkan bahwa permintaan akses dengan parameter valid diizinkan.

Langkah 4: Perbarui kebijakan OPA

Panggil API HTTP mesin OPA untuk memperbarui kebijakan OPA.

  1. Jalankan perintah berikut untuk hanya mengizinkan pengguna bernama bob mengakses aplikasi HTTPBin melalui HTTP dan menolak pengguna bernama alice mengakses aplikasi HTTPBin melalui HTTP.

    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 aplikasi HTTPBin menggunakan pengguna bernama bob:

    curl ${Alamat IP gateway ASM}/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

    Output menunjukkan bahwa akses pengguna bernama bob berhasil.

  3. Jalankan perintah berikut untuk mengakses aplikasi HTTPBin menggunakan pengguna bernama alice:

    curl ${Alamat IP gateway ASM}/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

    Output menunjukkan bahwa akses pengguna bernama alice dilarang.