全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan Plugin Wasm Coraza untuk mengimplementasikan kemampuan WAF pada gateway ASM

更新时间:Jul 02, 2025

Service Mesh (ASM) menyediakan kemampuan routing dan manipulasi permintaan yang kaya melalui API VirtualService serta kemampuan keamanan yang komprehensif melalui API AuthorizationPolicy. Namun, dalam skenario tertentu, API ini mungkin tidak memenuhi kebutuhan Anda sepenuhnya. Anda dapat menyesuaikan filter WebAssembly (Wasm) dan menambahkannya ke gateway ASM atau proxy sidecar untuk mengimplementasikan perilaku kustom dalam skenario kompleks. Topik ini menjelaskan cara menggunakan API WasmPlugin untuk mengaktifkan Coraza Web Application Firewall (WAF) pada gateway ASM.

Prasyarat

Langkah 1: Buat gambar OCI dari plugin Wasm dan dorong ke instance Container Registry Enterprise Edition

Plugin Wasm dapat dimuat dengan tiga metode berikut. Contoh ini menggunakan metode kedua, yaitu membuat gambar OCI dari plugin Wasm dan mendorongnya ke instance Container Registry Enterprise Edition.

  • Plugin Wasm disimpan dalam ConfigMap dan dipasang ke kontainer. Proxy sidecar ASM atau gateway ASM memuat plugin Wasm dari sistem file lokal.

  • Gambar OCI dari plugin Wasm dibuat dan diunggah ke repositori gambar. Proxy sidecar ASM atau gateway ASM menarik gambar dari repositori gambar.

  • Plugin Wasm diunggah ke penyimpanan cloud atau layanan lain yang mendukung unduhan melalui HTTP. Proxy sidecar ASM atau gateway ASM mengunduh plugin Wasm melalui jaringan.

  1. Unduh plugin Wasm Coraza dan buat gambar.

    1. Jalankan perintah berikut untuk mengunduh plugin Wasm Coraza ke komputer Anda dan mengekstraknya:

      wget https://github.com/corazawaf/coraza-proxy-wasm/releases/download/0.3.0/coraza-proxy-wasm-0.3.0.zip
      unzip coraza-proxy-wasm-0.3.0.zip
    2. Jalankan perintah berikut untuk mengganti nama plugin Wasm Coraza.

      Setelah mengekstrak file pada langkah sebelumnya, Anda akan mendapatkan file coraza-proxy-wasm.wasm. ASM mengharuskan plugin Wasm bernama plugin.wasm, sehingga Anda harus menggantinya.

      mv coraza-proxy-wasm.wasm plugin.wasm
    3. Gunakan konten berikut untuk membuat file Dockerfile di direktori saat ini:

      FROM scratch
      ADD ./plugin.wasm ./plugin.wasm
    4. Jalankan perintah berikut untuk membuat gambar:

      docker build -t coraza-proxy-wasm:latest . 
  2. Dorong gambar ke instance Container Registry Enterprise Edition.

    1. Buat namespace.

      1. Masuk ke Konsol Container Registry. Di panel navigasi kiri, klik Instances.

      2. Di halaman Instances, klik kartu instance Container Registry Enterprise Edition yang diinginkan.

      3. Di panel navigasi kiri, pilih Repository > Namespace. Pada halaman yang muncul, klik Create Namespace. Di kotak dialog yang muncul, konfigurasikan informasi terkait, lalu klik OK.

        Untuk contoh ini, atur Namespace menjadi wasm.

    2. Di panel navigasi kiri, pilih Repository > Access Control. Lalu, klik tab Internet, aktifkan Enable Access over Internet, dan tambahkan daftar putih internet sesuai kebutuhan bisnis Anda.

      Jika Anda tidak memerlukan kontrol berbasis daftar putih, hapus daftar putih default.

      Catatan

      Titik akhir publik digunakan sebagai contoh. Selama penggunaan aktual, Anda dapat mengonfigurasi akses virtual private cloud (VPC) untuk meningkatkan keamanan dan performa jaringan. Untuk informasi lebih lanjut, lihat Konfigurasikan ACL VPC.

    3. Jalankan perintah berikut dan masukkan kata sandi untuk masuk ke instance Container Registry Enterprise Edition:

      docker login --username=Nama pengguna enterprise-registry.cn-hangzhou.cr.aliyuncs.com
    4. Jalankan perintah berikut untuk mendorong gambar ke repositori gambar:

      docker tag ${ImageId} enterprise-registry.cn-hangzhou.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
      docker push enterprise-registry.cn-hangzhou.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
    5. Periksa apakah gambar berhasil didorong.

      1. Masuk ke Konsol Container Registry. Di panel navigasi kiri, klik Instances.

      2. Di halaman Instances, klik kartu instance Container Registry Enterprise Edition yang diinginkan.

      3. Di panel navigasi kiri, pilih Repository > Repositories. Pada halaman yang muncul, klik coraza-proxy-wasm. Di panel navigasi kiri, klik Tags.

        Jika gambar dengan tag latest ditampilkan, gambar berhasil didorong.

Langkah 2: Konfigurasikan izin untuk menarik gambar

Setelah membuat repositori pribadi, Anda harus menggunakan kata sandi yang dikonfigurasikan untuk instance Container Registry Enterprise Edition untuk membuat Secret. Proxy sidecar ASM atau gateway ASM menggunakan informasi otorisasi dalam Secret untuk autentikasi saat menarik gambar.

  1. Jalankan perintah berikut untuk membuat Secret:

    kubectl create secret docker-registry -n istio-system coraza-wasm-proxy --docker-server=enterprise-registry.cn-hangzhou.cr.aliyuncs.com --docker-username=Nama Pengguna --docker-password=Kata Sandi

    Secret harus berada di namespace yang sama dengan plugin Wasm. Dalam contoh ini, namespace plugin Wasm adalah istio-system. Oleh karena itu, Secret harus berada di namespace istio-system. Selama penggunaan aktual, ubah nama namespace setelah parameter -n dalam perintah di atas sesuai kebutuhan bisnis Anda.

  2. Jalankan perintah berikut untuk memeriksa apakah Secret berhasil dibuat:

    kubectl -n istio-system get secret coraza-wasm-proxy 

Langkah 3: Terapkan API WasmPlugin ke instance ASM

API WasmPlugin digunakan untuk mendeklarasikan plugin yang berlaku untuk gateway tujuan atau proxy sidecar beserta konfigurasi terkait.

  1. Buat file wasm-plugin.yaml yang berisi konten berikut:

    apiVersion: extensions.istio.io/v1alpha1
    kind: WasmPlugin
    metadata:
      name: coraza-proxy-wasm
      namespace: istio-system
    spec:
      imagePullPolicy: IfNotPresent
      imagePullSecret: coraza-wasm-proxy
      selector:
        matchLabels:
          istio: ingressgateway
      url: oci://enterprise-registry.cn-hangzhou.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
      phase: AUTHN
      pluginConfig:
        directives_map:
          default:
            - "SecDebugLogLevel 9"
            - "SecRuleEngine On"
            - "SecRule REQUEST_HEADERS:x-user-type \"@streq baned\" \"id:101,phase:1,t:lowercase,deny,msg:'denied by header'\""
        default_directives: default

    Parameter

    Deskripsi

    spec.url

    Menentukan alamat dan tag gambar OCI.

    spec.imagePullSecret

    Menentukan Secret yang digunakan untuk mengautentikasi repositori gambar.

    spec.selector

    Menentukan beban kerja tempat konfigurasi plugin ini diterapkan.

    spec.phase

    Menentukan lokasi untuk menyisipkan plugin.

    spec.pluginConfig

    Menentukan konfigurasi plugin.

    • directives_map: mendefinisikan directive bernama default. Secara default, aturan ini menentukan bahwa permintaan ditolak jika membawa header x-user-type dengan nilai baned.

    • default_directives: menentukan bahwa directive default adalah default.

  2. Gunakan kubectl untuk terhubung ke instance ASM berdasarkan informasi dalam file kubeconfig. Lalu, jalankan perintah berikut untuk menerapkan plugin Wasm Coraza ke instance ASM:

    kubectl apply -f wasm-plugin.yaml

Langkah 4: Periksa apakah plugin Wasm Coraza berfungsi

  1. Jalankan perintah berikut untuk mengakses aplikasi HTTPBin.

    Ganti http://120.27.XXX.XX/ dengan alamat IP gateway ingress. Untuk informasi lebih lanjut tentang cara mendapatkan alamat IP gateway, lihat Dapatkan Alamat IP Gateway Ingress.

    curl -v http://120.27.XXX.XX/

    Keluaran yang diharapkan:

    *   Trying 120.27.XXX.XX:80...
    * Connected to 120.27.XXX.XX (120.27.XXX.XX) port 80 (#0)
    > GET / HTTP/1.1
    > Host: 120.27.XXX.XX
    > User-Agent: curl/7.86.0
    > Accept: */*
    >
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 200 OK
    < server: istio-envoy
    < date: Fri, 27 Oct 2023 03:21:19 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
    ......

    Keluaran menunjukkan bahwa 200 OK dikembalikan untuk permintaan seperti yang diharapkan.

  2. Jalankan perintah berikut untuk mengirim permintaan dengan header x-user-type: baned untuk mengakses aplikasi HTTPBin lagi.

    Ganti http://120.27.XXX.XX/ dengan alamat IP gateway yang sebenarnya.

    curl -v -H 'x-user-type: baned' http://120.27.XXX.XX/

    Keluaran yang diharapkan:

    *   Trying 120.27.XXX.XX:80...
    * Connected to 120.27.XXX.XX (120.27.XXX.XX) port 80 (#0)
    > GET / HTTP/1.1
    > Host: 120.27.XXX.XX
    > User-Agent: curl/7.86.0
    > Accept: */*
    > x-user-type: baned
    >
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 403 Forbidden
    < date: Fri, 27 Oct 2023 03:22:19 GMT
    < server: istio-envoy
    < content-length: 0
    <
    * Connection #0 to host 120.27.XXX.XX left intact

    Keluaran menunjukkan bahwa 403 Forbidden dikembalikan untuk permintaan, yang ditolak oleh gateway seperti yang diharapkan.