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
Sebuah klaster Container Service for Kubernetes (ACK) telah ditambahkan ke instance ASM versi 1.18 atau lebih baru. Untuk informasi lebih lanjut, lihat Tambahkan Klaster ke Instance ASM.
Injeksi proxy sidecar otomatis telah diaktifkan. Untuk informasi lebih lanjut, lihat Kelola Namespace Global.
Aplikasi HTTPBin telah diterapkan dan dapat diakses. Untuk informasi lebih lanjut, lihat Terapkan Aplikasi HTTPBin.
Sebuah instance Container Registry Enterprise Edition telah dibuat. Instance ini mendukung gambar Open Container Initiative (OCI). Untuk informasi lebih lanjut, lihat Buat Instance Container Registry Enterprise Edition.
Docker telah diinstal. Untuk informasi lebih lanjut, lihat Dapatkan Docker.
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.
Unduh plugin Wasm Coraza dan buat gambar.
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.zipJalankan 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.wasmGunakan konten berikut untuk membuat file Dockerfile di direktori saat ini:
FROM scratch ADD ./plugin.wasm ./plugin.wasmJalankan perintah berikut untuk membuat gambar:
docker build -t coraza-proxy-wasm:latest .
Dorong gambar ke instance Container Registry Enterprise Edition.
Buat namespace.
Masuk ke Konsol Container Registry. Di panel navigasi kiri, klik Instances.
Di halaman Instances, klik kartu instance Container Registry Enterprise Edition yang diinginkan.
Di panel navigasi kiri, pilih . 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.
Di panel navigasi kiri, pilih . 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.
CatatanTitik 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.
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.comJalankan 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:latestPeriksa apakah gambar berhasil didorong.
Masuk ke Konsol Container Registry. Di panel navigasi kiri, klik Instances.
Di halaman Instances, klik kartu instance Container Registry Enterprise Edition yang diinginkan.
Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik coraza-proxy-wasm. Di panel navigasi kiri, klik Tags.
Jika gambar dengan tag
latestditampilkan, 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.
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 SandiSecret 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
-ndalam perintah di atas sesuai kebutuhan bisnis Anda.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.
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: defaultParameter
Deskripsi
spec.urlMenentukan alamat dan tag gambar OCI.
spec.imagePullSecretMenentukan Secret yang digunakan untuk mengautentikasi repositori gambar.
spec.selectorMenentukan beban kerja tempat konfigurasi plugin ini diterapkan.
spec.phaseMenentukan lokasi untuk menyisipkan plugin.
spec.pluginConfigMenentukan konfigurasi plugin.
directives_map: mendefinisikandirectivebernamadefault. Secara default, aturan ini menentukan bahwa permintaan ditolak jika membawa headerx-user-typedengan nilaibaned.default_directives: menentukan bahwadirectivedefault adalahdefault.
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
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 OKdikembalikan untuk permintaan seperti yang diharapkan.Jalankan perintah berikut untuk mengirim permintaan dengan header
x-user-type: baneduntuk 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 intactKeluaran menunjukkan bahwa
403 Forbiddendikembalikan untuk permintaan, yang ditolak oleh gateway seperti yang diharapkan.