All Products
Search
Document Center

Alibaba Cloud Service Mesh:Aktifkan WAF pada gerbang masuk ASM dengan plug-in Coraza Wasm

Last Updated:Mar 12, 2026

Aturan routing VirtualService dan kebijakan akses AuthorizationPolicy tidak mencakup ancaman lapisan aplikasi seperti Injeksi SQL, skrip lintas situs (XSS), atau serangan OWASP Top 10 lainnya. Plug-in WebAssembly (Wasm) Coraza mengatasi keterbatasan ini dengan menambahkan Web Application Firewall (WAF) langsung dalam proses Envoy di gerbang. Setiap permintaan masuk diperiksa, dan lalu lintas berbahaya diblokir sebelum mencapai layanan Anda—tanpa memerlukan sidecar eksternal atau hop jaringan tambahan.

Coraza adalah mesin WAF open-source yang dipelihara oleh OWASP dan menggunakan sintaks aturan ModSecurity (SecRule). Untuk menerapkannya, kemas binari Coraza Wasm sebagai image OCI dan dorong ke registri kontainer. Selanjutnya, terapkan resource WasmPlugin untuk memuatnya ke dalam rantai filter Envoy.

Cara kerja

  1. Kemas binari Coraza Wasm sebagai image OCI dan dorong ke registri kontainer.

  2. Buat Secret Kubernetes agar gerbang ASM dapat menarik image tersebut.

  3. Terapkan resource WasmPlugin untuk memuat plug-in ke dalam rantai filter Envoy pada gerbang dan mengonfigurasi direktif SecRule.

  4. Gerbang mengevaluasi setiap permintaan masuk terhadap aturan yang dikonfigurasi dan mengembalikan respons 403 Forbidden untuk permintaan yang sesuai dengan aturan penolakan.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Metode pemuatan plug-in Wasm

ASM mendukung tiga cara untuk memuat plug-in Wasm. Tutorial ini menggunakan metode image OCI.

Metode

Cara kerja

Kapan digunakan

OCI image (yang digunakan dalam tutorial ini)

Kemas binari .wasm sebagai image OCI dan dorong ke registri kontainer. Gerbang menarik image dari repository image.

Disarankan untuk sebagian besar penerapan produksi. Terdapat versi, dapat diaudit, dan kompatibel dengan infrastruktur registri yang ada.

ConfigMap

Simpan binari .wasm dalam ConfigMap Kubernetes dan pasang ke dalam pod gerbang. Gerbang memuat file dari sistem file lokal.

Prototipe cepat atau lingkungan air-gapped di mana registri tidak tersedia. Dibatasi oleh batas ukuran ConfigMap 1 MiB.

Unduh HTTP

Host binari .wasm di Cloud Storage atau titik akhir apa pun yang dapat diakses melalui HTTP. Gerbang mengunduhnya melalui jaringan.

Lingkungan di mana server artefak terpusat sudah menyediakan binari melalui HTTP.

Langkah 1: Bangun dan dorong image OCI Coraza Wasm

Unduh dan siapkan binari plug-in

  1. Unduh plug-in Coraza Wasm dan ekstrak:

       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. Ubah nama binari menjadi plugin.wasm. ASM memerlukan nama file persis ini:

       mv coraza-proxy-wasm.wasm plugin.wasm
  3. Buat Dockerfile di direktori yang sama:

       FROM scratch
       ADD ./plugin.wasm ./plugin.wasm
  4. Bangun image OCI:

       docker build -t coraza-proxy-wasm:latest .

Dorong image ke Container Registry

  1. Buat namespace di Container Registry:

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

    2. Pada halaman Instances, klik kartu instans Container Registry Enterprise Edition Anda.

    3. Di panel navigasi sebelah kiri, pilih Repository > Namespace. Klik Create Namespace, atur Namespace menjadi wasm, lalu klik OK.

  2. Aktifkan akses Internet untuk registri: Di panel navigasi sebelah kiri, pilih Repository > Access Control. Klik tab Internet, aktifkan Enable Access over Internet, dan tambahkan daftar putih Internet sesuai kebutuhan Anda. Jika Anda tidak memerlukan kontrol berbasis daftar putih, hapus daftar putih default.

    Catatan

    Contoh ini menggunakan titik akhir publik. Untuk penggunaan produksi, konfigurasikan akses Virtual Private Cloud (VPC) demi keamanan dan performa jaringan yang lebih baik. Untuk informasi selengkapnya, lihat Konfigurasikan ACL VPC.

  3. Masuk ke registri: Masukkan kata sandi saat diminta. Ganti placeholder berikut dengan nilai aktual Anda:

    Placeholder

    Deskripsi

    Contoh

    <your-username>

    Username login untuk instans Container Registry

    admin@china

    <your-registry-endpoint>

    Titik akhir instans Container Registry Anda

    enterprise-registry.cn-hangzhou

       docker login --username=<your-username> <your-registry-endpoint>.cr.aliyuncs.com
  4. Beri tag dan dorong image: Ganti <image-id> dengan ID image yang dikembalikan oleh docker build pada bagian sebelumnya.

       docker tag <image-id> <your-registry-endpoint>.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
       docker push <your-registry-endpoint>.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
  5. Verifikasi bahwa image telah didorong: Jika image dengan tag latest muncul, berarti dorongan berhasil.

    1. Di Konsol Container Registry, buka instans Edisi Perusahaan Anda.

    2. Di panel navigasi sebelah kiri, pilih Repository > Repositories. Klik coraza-proxy-wasm.

    3. Di panel navigasi sebelah kiri, klik Tags.

Langkah 2: Buat Secret untuk penarikan image

Repository bersifat privat, sehingga gerbang ASM memerlukan kredensial untuk menarik image Wasm. Buat Secret Kubernetes dengan kredensial registri:

kubectl create secret docker-registry coraza-wasm-proxy \
  -n istio-system \
  --docker-server=<your-registry-endpoint>.cr.aliyuncs.com \
  --docker-username=<your-username> \
  --docker-password=<your-password>
Penting

Secret harus berada di namespace yang sama dengan resource WasmPlugin. Tutorial ini menggunakan istio-system. Sesuaikan nilai -n jika plug-in Anda menargetkan namespace berbeda.

Verifikasi Rahasia:

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

Langkah 3: Terapkan resource WasmPlugin

Resource WasmPlugin mendeklarasikan plug-in mana yang akan dimuat, posisinya dalam rantai filter Envoy, serta cara mengonfigurasinya.

  1. Buat file bernama wasm-plugin.yaml dengan konten berikut. Tabel berikut menjelaskan bidang kunci: dalam contoh ini, direktif default mengaktifkan Coraza rule engine dan mendefinisikan satu aturan—menolak permintaan apa pun yang header x-user-type-nya sama dengan baned.

    Bidang

    Deskripsi

    spec.url

    Alamat image OCI termasuk tag-nya. Mendukung skema oci://, file://, dan http[s]://.

    spec.imagePullSecret

    Nama Kubernetes Secret yang berisi kredensial registri.

    spec.imagePullPolicy

    Kebijakan penarikan image.

    spec.selector

    Selektor label yang menentukan beban kerja mana yang memuat plug-in ini. Di sini, plug-in menargetkan gerbang masuk.

    spec.phase

    Posisi pemasangan plug-in dalam rantai filter. AUTHN menempatkannya sebelum filter autentikasi, sehingga permintaan diperiksa sedini mungkin.

    spec.pluginConfig

    Konfigurasi khusus Coraza. directives_map mendefinisikan kumpulan aturan bernama menggunakan sintaks SecRule. default_directives menentukan kumpulan aturan mana yang diterapkan secara default.

       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://<your-registry-endpoint>.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
  2. Sambungkan ke instans ASM menggunakan kubectl dan terapkan resource tersebut:

       kubectl apply -f wasm-plugin.yaml

Langkah 4: Verifikasi plug-in WAF

Uji permintaan yang diizinkan maupun yang diblokir untuk memastikan plug-in berfungsi.

  1. Kirim permintaan normal ke aplikasi HTTPBin melalui gerbang masuk: Ganti <gateway-ip> dengan alamat IP gerbang masuk Anda. Untuk informasi selengkapnya, lihat Dapatkan alamat IP gerbang masuk. Hasil yang diharapkan — gerbang mengembalikan 200 OK:

       curl -v http://<gateway-ip>/
       > GET / HTTP/1.1
       > Host: <gateway-ip>
       ...
       < HTTP/1.1 200 OK
       < server: istio-envoy
       ...
  2. Kirim permintaan dengan header yang diblokir: Hasil yang diharapkan — gerbang mengembalikan 403 Forbidden. Tanggapan 403 ini mengonfirmasi bahwa plug-in WAF Coraza aktif dan menegakkan aturan yang dikonfigurasi.

       curl -v -H 'x-user-type: baned' http://<gateway-ip>/
       > GET / HTTP/1.1
       > Host: <gateway-ip>
       > x-user-type: baned
       ...
       < HTTP/1.1 403 Forbidden
       < server: istio-envoy
       ...