Sebelumnya saya sudah bahas sedikit tentang rule ditutorial: Apa itu WAF (Web Application Firewall), Cara kerja WAF pada AWS.
Apa itu Rule pada WAF AWS?
Jadi rule itu berisi aturan-aturan yang digunakan untuk memfilter / menolak request yang masuk ke dalam aplikasi web. Jika request yang masuk sesuai kriteria rule, maka diizinkan, jika tidak maka ditolak. Saya paste kembali gambar berikut dari tutorial sebelumnya:
Bisa dilihat, user mengakses ke test-waf.latcoding.com harus melalui WAF AWS terlebih dahulu, disana ada pengecekan rule 1 dan rule 2. Misalkan rule tersebut berisi:
- rule 1 = IP user harus 111.222.333.444
- rule 2 = User-Agent harus dari browser Chrome saja
Jika user tersebut memenuhi kriteria dari 2 rule tersebut, maka user bisa mengakses test-waf.latcoding.com, jika tidak maka ditolak (kita bisa set responsenya, misal 401, 403, dsb).
Ditutorial kali ini kita akan belajar membuat 3 rules:
- rule WAF AWS: Batasi IP mana yang boleh mengakses website
- rule WAF AWS: User-Agent harus dari browser Chrome saja
- rule WAF AWS: Rate limiter berdasarkan IP client/user (max user request 100 per 5 menit)
Note: Saya asumsikan disini kita sudah mensetup Application Load Balancer dan WAFnya. Jadi kita tinggal buat rule WAFnya saja.
Domain yang digunakan untuk testing adalah test-waf.latcoding.com
Rule WAF AWS: batasi IP mana yang boleh mengakses website
Ada 2 komponen yang harus kita buat:
- IP set -> List IP yang boleh mengakses website
- Rule -> Aturan untuk batasi IP tertentu
1. IP Set
- Klik menu AWS WAF
- Pilih IP Sets
- Pilih Region Asia Pasific (Singapore) -> *Saya disini menghost di Region Singapore
- Klik Create IP set
- Masukkan IP set name dan Descriptionnya: list-ip-allowed
- Pilih Region: Asia Pasific (Singapore)
- IP Version: IPV4
- Masukkan IP yang ingin dilist, contoh disini saya masukkan 114.4.212.51/32, dimana /32 adalah range CIDRnya. Kalau /32 berarti range IPnya hanya 1 IP saja yaitu 114.4.212.51
- Klik Create IP set
Setelah itu akan sukses terbuat
2. Rule
Setelah kita mendaftarkan IP di IP sets, selanjutnya kita buat rulenya.
- Buka WAF ACL anda, misal punya saya: test-waf
- Akan ada banyak tab, buka tab Rules, pada sebelah kanan klik Add rules > Add my own rules and rule groups untuk membuat rule sesuai keinginan sendiri
- Akan dibawa ke halaman Add rule:
- Pada Rule type
- pilih Rule builder
- Pada Rule Builder
- masukkan nama Rule misal: rule-1
- typenya pilih Regular rule
- Pada If a request, pilih doesn’t matches the statement (NOT)
- Pada Statement, Pilih Inspect: Originatest from an IP address in
- Pada IP set, pilih list-ip-allowed
- Pada IP address to use as the originating address, pilih Source IP address
- Pada Then
- Pilih Action: Block
- Pada Custom Response: Enable
- Masukkan Response code: 403
- Klik Add rule
- Pada Rule type
- Akan dibawa ke halaman Set Rule Priority:
- Pada Set Rule Priority, klik save
- Setelah itu rule success terbuat
Test
Sekarang kita test, misal disini saya mengakses test-waf.latcoding.com menggunakan IP selain 114.4.212.51, maka responsenya akan 403 forbidden
Jika menggunakan IP 114.4.212.51, hasilnya bisa diakses
Rule WAF AWS: User-Agent harus dari browser Chrome saja
- Buat rule baru dengan nama rule-2, type nya Regular rule
- Pada If a request: pilih doesn’t match the statement (NOT)
- Pada Statement, pilih inspect: Single header
- Pada Header field name, masukkan: User-Agent
- Pada Match Type pilih: Contains String
- Pada String to Match, masukkan: Chrome
- Pada Then
- Pilih Block
- Custom Response: enable
- masukkan code 401
- Klik Add rule > Pada Set rule priority > save
Test
Kalau kita buka dengan browser mozilla, maka responsenya akan 401 Unauthorized
Jika dibuka pada browser Chrome, maka bisa diakses
Rule WAF AWS: Rate limiter berdasarkan IP client/user (max user request 100 per 5 menit)
- Buat rule dengan nama rule-3. Typenya pilih Rate-based rule
- Pada Rate-limiting criteria
- Masukkan Rate limit: 100, artinya 100 request per 5 menit (default dari AWS)
- Request aggregation: Source IP address
- Scope of inspection and rate limiting > Only consider requests that match the criteria in a rule statement
- If a request: matches the statement
- Pada statement
- Inspect: Single header
- Header field name: Host
- Match type: Matches reguler expression
- Reguler expression: (test\-waf\.latcoding\.com)
- Pada Then
- Action: block -> enable
- Masukkan code 429
- Klik Add rule > Set rule priority > Save
Test
Kita test menggunakan jmeter dengan request lebih > 100 request, maka akan mendapatkan response 429 Too Many Requests