Tulis skrip Lua kustom untuk mengintersepsi dan memodifikasi pemrosesan permintaan web, sehingga memungkinkan penerapan logika keamanan yang melampaui aturan bawaan WAF. Skrip dan parameter yang dapat dikonfigurasi memberikan fleksibilitas lebih tinggi dalam memenuhi kebutuhan bisnis yang kompleks.
Aktifkan fitur Extensions
Untuk menggunakan Extensions, ikuti langkah-langkah aktivasi berikut:
Edisi yang berlaku: Hanya WAF Enterprise Edition berbasis Subscription, Ultimate Edition, dan Pay-As-You-Go Edition yang mendukung fitur ini.
Penagihan: Ini adalah layanan berbayar. Metode penagihannya sebagai berikut:
-
Pay-As-You-Go Edition: Anda dapat langsung menggunakannya tanpa perlu pembelian terlebih dahulu. Biaya tambahan dikenakan berdasarkan penggunaan aktual.
-
Subscription Edition: Anda harus membeli fitur ini sebelum menggunakannya.
-
Masuk ke Konsol Web Application Firewall 3.0. Dari bilah menu atas, pilih kelompok sumber daya dan wilayah (Chinese Mainland atau Outside Chinese Mainland) untuk instans WAF.
-
Pada panel navigasi kiri, pilih .
-
Klik Buy Now dan ikuti petunjuk di layar untuk mengaktifkan fitur tersebut.
Buat ekstensi
Pada halaman Extensions, klik Create Extension, lalu konfigurasikan parameter berikut.
-
Basic Info: Masukkan Plugin Name dan Plugin Description yang mudah dikenali.
-
Plugin Code: Tulis skrip Lua di sini untuk menerapkan logika keamanan kustom Anda. Contoh: Untuk informasi lebih lanjut tentang API, lihat Lampiran: Referensi API skrip Lua kustom.
-- Contoh skrip Lua kustom: Ekstrak parameter kueri dan bandingkan dengan parameter kustom. Blokir jika tidak sesuai. -- Langkah 1: Ekstrak parameter permintaan local token = aliwaf.req.get_arg('token') -- Langkah 2: Bandingkan dengan parameter kustom if token ~= params.token then aliwaf.func.punish() endPenting-
Untuk menjamin stabilitas sistem WAF, waktu eksekusi satu skrip Lua per permintaan dibatasi hingga 2 ms. Selama fase Debug and Test, jika waktu eksekusi melebihi batas ini, skrip gagal dalam pengujian dan pembuatan gagal. Selama waktu proses aktual, jika waktu eksekusi skrip melebihi 2 ms untuk suatu permintaan, sistem akan melewati eksekusi tersebut.
-
Jangan menyematkan informasi sensitif (seperti kunci) secara langsung dalam kode Anda. Gunakan fitur Parameter Definition di bawah ini sebagai gantinya.
-
-
Parameter Definition: Ekstrak nilai yang disematkan langsung dari skrip ke dalam parameter yang dapat dikonfigurasi untuk memisahkan logika dari data. Hal ini memungkinkan Anda menyesuaikan kebijakan secara dinamis tanpa mengubah kode, serta mengelola kunci secara aman. Klik Add Parameter dan lengkapi konfigurasi berikut:
-
Parameter Name: Nama variabel yang dirujuk dalam skrip (misalnya,
secret_key). -
Parameter Type: Jenis yang didukung mencakup String, Number, Boolean, JSON Object, dan JSON Array. Pastikan jenisnya sesuai dengan logika penanganan dalam skrip Anda.
-
Parameter Description: Menjelaskan tujuan parameter tersebut.
-
Parameter Value: Mendukung dua mode berikut:
-
Manual Input: Masukkan nilai secara langsung.
-
Use KMS Credential: Rujuk kredensial yang telah dibuat di Key Management Service untuk menyimpan data sensitif secara aman. Agar WAF berhasil merujuk kredensial tersebut, Anda harus menyambungkan tag berikut padanya:
-
Tag Key:
waf:access:enable -
Tag Value:
true
-
-
-
-
Debug and Test:
-
Plugin Action Parameters: Saat ini hanya mendukung mode Block, yang memblokir permintaan.
-
Traffic Parameters: Mensimulasikan traffic permintaan HTTP nyata. Klik Add Parameter, lalu masukkan Parameter Name (misalnya
method,uri, atauargs) dan Parameter Value-nya.Contoh: Atur
methodmenjadiPOSTdanurimenjadi/loginuntuk menguji logika perlindungan pada titik akhir login.
-
-
Execution Result: Klik Run and Debug. Sistem akan mengeksekusi skrip terhadap traffic simulasi, dan Anda dapat melihat panel Execution Result di sebelah kanan. Jika hasilnya menunjukkan kegagalan, perbaiki kode berdasarkan pesan error spesifik.
Langkah selanjutnya
Setelah membuat extension, Anda harus mereferensikannya dalam Template perlindungan Custom Rule. Untuk informasi lebih lanjut, lihat Custom rules.
Operasi harian
Pada halaman Extensions, Anda dapat melakukan operasi berikut:
-
Lihat daftar plugin: Menampilkan semua extension. Gunakan kotak pencarian untuk memasukkan nama plugin guna pencarian cepat.
-
Lihat aturan perlindungan terkait: Temukan plugin target dan klik ikon
pada kolom Associated Rules untuk menampilkan ID aturan perlindungan terkait. Anda dapat menyalin ID tersebut dan mencarinya di halaman Core Web Protection atau Security Reports. -
Edit extension: Temukan plugin target dan klik Edit pada kolom Actions untuk mengubah konfigurasinya.
-
Hapus extension: Temukan plugin target dan klik Delete pada kolom Actions untuk menghapus extension tersebut.
Lampiran: Referensi API skrip Lua kustom
Antarmuka inti untuk skrip Lua kustom, mencakup pembacaan data permintaan, enkripsi dan dekripsi, serta pengendalian alur permintaan.
Contoh permintaan HTTP
POST /api/v1/orders?source=web&campaign=spring2024 HTTP/1.1
Host: shop.example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
Cookie: session_id=abc123xyz; user_prefs=lang%3Den%26theme%3Ddark
Content-Type: application/json
Content-Length: 68
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx
Accept: application/json
eyJwcm9kdWN0X2lkIjogNzg5LCAicXVhbnRpdHkiOiAyLCAidXJnZW50IjogdHJ1ZX0=
Baca data permintaan
Semua antarmuka mengembalikan string. Jika bidang tidak ada, string kosong dikembalikan.
Baca metode
|
Item |
Type |
Description |
|
Parameter |
- |
- |
|
Return value |
string |
Method permintaan HTTP, seperti "GET" atau "POST". |
-- POST --
local method = aliwaf.req.get_method()
Baca URI
|
Item |
Type |
Description |
|
Parameter |
- |
- |
|
Return value |
string |
Jalur URI dari permintaan. |
-- /api/v1/orders --
local uri = aliwaf.req.get_uri()
Baca domain
|
Item |
Type |
Description |
|
Parameter |
- |
- |
|
Return value |
string |
Nama domain Host dari permintaan. |
-- shop.example.com --
local domain = aliwaf.req.get_domain()
Baca query
|
Item |
Type |
Description |
|
Parameter |
- |
- |
|
Return value |
string |
String kueri lengkap dari permintaan. |
-- source=web&campaign=spring2024 --
local query = aliwaf.req.get_query()
Baca parameter kueri
|
Item |
Type |
Description |
|
Parameter |
string |
Nama parameter kueri. |
|
Return value |
string |
Nilai parameter yang sesuai. Mengembalikan string kosong "" jika parameter tidak ada. |
-- web --
local source = aliwaf.req.get_arg('source')
Baca cookie
|
Item |
Type |
Description |
|
Parameter |
string |
Nama cookie. |
|
Return value |
string |
Nilai cookie yang sesuai. Mengembalikan string kosong "" jika cookie tidak ada. |
-- abc123xyz --
local session_id = aliwaf.req.get_cookie('session_id')
Baca header
|
Item |
Type |
Description |
|
Parameter |
string |
Nama Header permintaan HTTP. |
|
Return value |
string |
Nilai header yang sesuai. Mengembalikan string kosong "" jika header tidak ada. |
-- Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx --
local auth = aliwaf.req.get_header('Authorization')
Baca body
Periksa status request body
-
Apakah body telah sepenuhnya diterima
Item
Type
Description
Parameter
-
-
Return value
boolean
true menunjukkan bahwa request body telah sepenuhnya diterima. false menunjukkan bahwa masih ada data yang tertunda.
local last = aliwaf.func.is_last_fragment_arrived() -
Apakah body telah dipotong
Item
Type
Description
Parameter
-
-
Return value
boolean
true menunjukkan bahwa request body melebihi batas dan dipotong. false menunjukkan bahwa request body utuh.
Secara default, WAF menyimpan hingga 128 KB dari request body. Permintaan yang melebihi batas ini akan dipotong (bagian yang melebihi dibuang).
local discard = aliwaf.func.is_request_body_discarded()
Tunggu body
Request body tiba di WAF secara streaming, sehingga body mungkin belum sepenuhnya diterima saat skrip dieksekusi. Untuk memproses body secara lengkap, beri tahu framework secara eksplisit untuk menunggu body lengkap sebelum mengeksekusi ulang skrip.
|
Item |
Type |
Description |
|
Parameter |
- |
- |
|
Return value |
- |
- |
aliwaf.func.wait_request_body()
Contoh: Baca request body
-- Body belum sepenuhnya diterima; tunggu --
if not aliwaf.func.is_last_fragment_arrived() then
aliwaf.func.wait_request_body()
return
end
-- Body telah sepenuhnya diterima; periksa apakah dipotong --
if aliwaf.func.is_request_body_discarded() then
return
end
-- eyJwcm9kdWN0X2lkIjogNzg5LCAicXVhbnRpdHkiOiAyLCAidXJnZW50IjogdHJ1ZX0= --
local body = aliwaf.req.get_body()
-- TODO: Terapkan logika bisnis pada body lengkap --
Fungsi utilitas umum
Encoding dan decoding dasar
Antarmuka encoding/decoding URL, hex, dan Base64 menerima parameter string dan mengembalikan string yang telah diproses. Jika gagal, mereka mengembalikan string kosong.
Encoding dan decoding URL
-
escape_uri
Item
Type
Description
Parameter
string
String mentah yang akan di-encode.
Return value
string
String yang telah di-encode.
-
unescape_uri
Item
Type
Description
Parameter
string
String yang telah di-encode URL yang akan didecode.
Return value
string
String mentah yang telah didecode.
-- a%20b --
local data1 = aliwaf.util.escape_uri('a b')
-- a b --
local data2 = aliwaf.util.unescape_uri('a%20b')
Encoding dan decoding Hex
-
hex_encode
Item
Type
Description
Parameter
string
String biner yang akan di-encode.
Return value
string
String yang di-encode hex dalam huruf kapital.
-
hex_decode
Item
Type
Description
Parameter
string
String hex yang akan didecode.
Return value
string
String mentah yang telah didecode. Mengembalikan string kosong "" jika input tidak valid.
-- DEADBEEF --
local data1 = aliwaf.util.hex_encode(string.char(0xDE, 0xAD, 0xBE, 0xEF))
-- \xDE\xAD\xBE\xEF --
local data2 = aliwaf.util.hex_decode('DEADBEEF')
Encoding dan decoding Base64
-
base64_encode
Item
Type
Description
Parameter
string
String mentah yang akan di-encode.
Return value
string
String yang di-encode Base64.
-
base64_decode
Item
Type
Description
Parameter
string
String Base64 yang akan didecode.
Return value
string
String mentah yang telah didecode. Mengembalikan string kosong "" jika input tidak valid.
-- aGVsbG8= --
local data1 = aliwaf.util.base64_encode('hello')
-- hello --
local data2 = aliwaf.util.base64_decode('aGVsbG8=')
MD5/CRC/SHA
-
md5
Item
Type
Description
Parameter
string
String mentah yang akan di-hash.
Return value
string
Digest MD5 dalam format hex 32 karakter huruf kecil.
-
sha256
Item
Type
Description
Parameter
string
String mentah yang akan di-hash.
Return value
string
Digest SHA-256 dalam format hex 64 karakter huruf kecil.
-
crc32
Item
Type
Description
Parameter
string
String mentah yang akan dihitung.
Return value
integer
Checksum CRC32 (bilangan bulat tak bertanda 32-bit).
-- 5d41402abc4b2a76b9719d911017c592 --
local md5 = aliwaf.util.md5('hello')
-- 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 --
local sha = aliwaf.util.sha256('hello')
-- 3287646509 --
local crc = aliwaf.util.crc32('hello')
Enkripsi dan dekripsi (AES/DES)
-
evp_encrypt
Item
Type
Description
Parameter 1
string
Jenis algoritma enkripsi, seperti "aes-128-cbc".
Parameter 2
string
Kunci enkripsi (string binary-safe).
Parameter 3
string
Vektor inisialisasi. Dapat berupa string kosong "" jika IV tidak digunakan.
Parameter 4
string
Teks biasa yang akan dienkripsi.
Return value
string
Teks sandi yang telah dienkripsi. Mengembalikan string kosong "" jika parameter tidak valid atau enkripsi gagal.
-
evp_decrypt
Item
Type
Description
Parameter 1
string
Jenis algoritma dekripsi. Harus sesuai dengan algoritma yang digunakan untuk enkripsi, seperti "aes-128-cbc".
Parameter 2
string
Kunci dekripsi. Harus sesuai dengan kunci yang digunakan untuk enkripsi.
Parameter 3
string
Vektor inisialisasi. Harus sesuai dengan IV yang digunakan untuk enkripsi. Dapat berupa string kosong "".
Parameter 4
string
Teks sandi yang akan didekripsi.
Return value
string
Teks biasa yang telah didekripsi. Mengembalikan string kosong "" jika parameter tidak valid atau dekripsi gagal.
local data1 = aliwaf.util.evp_encrypt('aes-128-cbc', 'key-12345678-key', 'iv-1234567890-iv', 'hello')
local data2 = aliwaf.util.evp_decrypt('aes-128-cbc', 'key-12345678-key', 'iv-1234567890-iv', data1)
Penandatanganan dan verifikasi (ES256)
-
es256_sign
Item
Type
Description
Parameter 1
string
Kunci privat ES256 dalam format PEM.
Parameter 2
string
Data mentah yang akan ditandatangani.
Return value
string
Hasil signature (string biner). Mengembalikan string kosong "" jika parameter tidak valid atau penandatanganan gagal.
-
es256_verify
Item
Type
Description
Parameter 1
string
Kunci publik ES256 dalam format PEM.
Parameter 2
string
Data mentah yang digunakan untuk penandatanganan (harus sesuai dengan data yang digunakan saat penandatanganan).
Parameter 3
string
Nilai signature yang akan diverifikasi (dihasilkan oleh es256_sign).
Return value
boolean
true menunjukkan bahwa verifikasi signature berhasil. false menunjukkan kegagalan verifikasi atau parameter tidak valid.
local sign = aliwaf.util.es256_sign('private_key-1234', 'hello')
local result = aliwaf.util.es256_verify('public_key-12345', 'hello', sign)
Waktu
|
Item |
Type |
Description |
|
Parameter |
- |
- |
|
Return value |
integer |
Stempel waktu UNIX tingkat milidetik saat ini. |
-- Stempel waktu tingkat milidetik saat ini (integer) --
local timestamp = aliwaf.util.get_current_ms()
Fungsi pembantu bisnis
Fungsi pembantu bisnis mengkoordinasikan antara skrip Lua dan framework WAF.
Action
|
Item |
Type |
Description |
|
Parameter |
- |
- |
|
Return value |
- |
- |
-- Lakukan aksi pada permintaan saat ini berdasarkan aksi yang telah dipilih sebelumnya --
aliwaf.func.punish()