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
Kemas binari Coraza Wasm sebagai image OCI dan dorong ke registri kontainer.
Buat Secret Kubernetes agar gerbang ASM dapat menarik image tersebut.
Terapkan resource
WasmPluginuntuk memuat plug-in ke dalam rantai filter Envoy pada gerbang dan mengonfigurasi direktif SecRule.Gerbang mengevaluasi setiap permintaan masuk terhadap aturan yang dikonfigurasi dan mengembalikan respons
403 Forbiddenuntuk permintaan yang sesuai dengan aturan penolakan.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ASM v1.18 atau lebih baru dengan kluster Container Service for Kubernetes (ACK) yang ditambahkan. Untuk informasi selengkapnya, lihat Tambahkan kluster ke instans ASM.
Injeksi proxy sidecar otomatis diaktifkan. Untuk informasi selengkapnya, lihat Kelola namespace global.
Aplikasi HTTPBin telah diterapkan dan dapat diakses. Untuk informasi selengkapnya, lihat Terapkan aplikasi HTTPBin.
Instans Container Registry Enterprise Edition (mendukung image OCI). Untuk informasi selengkapnya, lihat Buat instans Container Registry Enterprise Edition.
Docker telah diinstal. Untuk informasi selengkapnya, lihat Get Docker.
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 | Disarankan untuk sebagian besar penerapan produksi. Terdapat versi, dapat diaudit, dan kompatibel dengan infrastruktur registri yang ada. |
ConfigMap | Simpan binari | Prototipe cepat atau lingkungan air-gapped di mana registri tidak tersedia. Dibatasi oleh batas ukuran ConfigMap 1 MiB. |
Unduh HTTP | Host binari | 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
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.zipUbah nama binari menjadi
plugin.wasm. ASM memerlukan nama file persis ini:mv coraza-proxy-wasm.wasm plugin.wasmBuat
Dockerfiledi direktori yang sama:FROM scratch ADD ./plugin.wasm ./plugin.wasmBangun image OCI:
docker build -t coraza-proxy-wasm:latest .
Dorong image ke Container Registry
Buat namespace di Container Registry:
Masuk ke Konsol Container Registry. Di panel navigasi sebelah kiri, klik Instances.
Pada halaman Instances, klik kartu instans Container Registry Enterprise Edition Anda.
Di panel navigasi sebelah kiri, pilih . Klik Create Namespace, atur Namespace menjadi
wasm, lalu klik OK.
Aktifkan akses Internet untuk registri: Di panel navigasi sebelah kiri, pilih . 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.
CatatanContoh 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.
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-hangzhoudocker login --username=<your-username> <your-registry-endpoint>.cr.aliyuncs.comBeri tag dan dorong image: Ganti
<image-id>dengan ID image yang dikembalikan olehdocker buildpada 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:latestVerifikasi bahwa image telah didorong: Jika image dengan tag
latestmuncul, berarti dorongan berhasil.Di Konsol Container Registry, buka instans Edisi Perusahaan Anda.
Di panel navigasi sebelah kiri, pilih . Klik coraza-proxy-wasm.
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>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-proxyLangkah 3: Terapkan resource WasmPlugin
Resource WasmPlugin mendeklarasikan plug-in mana yang akan dimuat, posisinya dalam rantai filter Envoy, serta cara mengonfigurasinya.
Buat file bernama
wasm-plugin.yamldengan konten berikut. Tabel berikut menjelaskan bidang kunci: dalam contoh ini, direktifdefaultmengaktifkan Coraza rule engine dan mendefinisikan satu aturan—menolak permintaan apa pun yang headerx-user-type-nya sama denganbaned.Bidang
Deskripsi
spec.urlAlamat image OCI termasuk tag-nya. Mendukung skema
oci://,file://, danhttp[s]://.spec.imagePullSecretNama Kubernetes Secret yang berisi kredensial registri.
spec.imagePullPolicyKebijakan penarikan image.
spec.selectorSelektor label yang menentukan beban kerja mana yang memuat plug-in ini. Di sini, plug-in menargetkan gerbang masuk.
spec.phasePosisi pemasangan plug-in dalam rantai filter.
AUTHNmenempatkannya sebelum filter autentikasi, sehingga permintaan diperiksa sedini mungkin.spec.pluginConfigKonfigurasi khusus Coraza.
directives_mapmendefinisikan kumpulan aturan bernama menggunakan sintaks SecRule.default_directivesmenentukan 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: defaultSambungkan 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.
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 mengembalikan200 OK:curl -v http://<gateway-ip>/> GET / HTTP/1.1 > Host: <gateway-ip> ... < HTTP/1.1 200 OK < server: istio-envoy ...Kirim permintaan dengan header yang diblokir: Hasil yang diharapkan — gerbang mengembalikan
403 Forbidden. Tanggapan403ini 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 ...