Setiap aturan kebijakan keamanan Google Cloud Armor memiliki prioritas, kondisi kecocokan, dan tindakan. Cloud Armor menjalankan tindakan dari aturan dengan prioritas tertinggi yang cocok dengan permintaan. Aturan dengan prioritas yang lebih rendah daripada aturan yang cocok dengan prioritas tertinggi tidak dievaluasi, meskipun memiliki kondisi kecocokan yang sama.
Setiap aturan kebijakan keamanan mendukung dua jenis kondisi kecocokan:
- Kondisi kecocokan dasar berisi daftar alamat IP atau daftar rentang alamat IP. Kondisi kecocokan dasar ditentukan dengan menggunakan
flag
--src-ip-rangessaat membuat aturan menggunakan Google Cloud CLI. - Kondisi kecocokan lanjutan berisi ekspresi dengan hingga lima
subekspresi yang dapat mencocokkan berbagai atribut permintaan yang masuk.
Kondisi kecocokan lanjutan ditentukan menggunakan flag
--expressionsaat membuat aturan menggunakan Google Cloud CLI.
Halaman ini menjelaskan cara membuat dan melihat aturan kebijakan keamanan, serta memberikan referensi untuk bahasa aturan kustom Cloud Armor yang Anda gunakan untuk menulis ekspresi dalam kondisi pencocokan lanjutan. Bahasa aturan khusus Cloud Armor adalah subset dari Common Expression Language (CEL).
Ekspresi yang ditulis dalam bahasa aturan khusus Cloud Armor memerlukan dua komponen:
- Atribut: data yang akan diperiksa
- Operasi: cara menggunakan data
Misalnya, ekspresi berikut menggunakan atribut origin.ip dan
198.51.100.0/24 dalam operasi inIpRange. Dalam hal ini, ekspresi
akan menampilkan true jika origin.ip berada dalam rentang alamat IP 198.51.100.0/24.
inIpRange(origin.ip, '198.51.100.0/24')
Meskipun ekspresi contoh sebelumnya hanya cocok dengan alamat IP klien, saat Anda menggunakan ekspresi contoh tersebut dalam aturan kebijakan keamanan Cloud Armor, aturan tersebut dianggap sebagai aturan dengan kondisi kecocokan lanjutan dari perspektif kuota. Untuk mengetahui informasi selengkapnya, lihat Kuota dan batas Cloud Armor.
Membuat aturan kebijakan keamanan
Ikuti langkah-langkah di bagian ini untuk menambahkan aturan ke kebijakan keamanan Cloud Armor.
Konsol
Di konsol Google Cloud , buka halaman Cloud Armor policies.
Klik nama kebijakan keamanan untuk membuka halaman Policy details, lalu klik tab Rules.
Klik Tambahkan Aturan.
Opsional: Masukkan deskripsi aturan.
Pilih mode:
- Basic mode: mengizinkan atau menolak traffic berdasarkan alamat IP atau rentang IP.
- Mode lanjutan: mengizinkan atau menolak traffic berdasarkan ekspresi aturan.
Di kolom Match, tentukan kondisi yang menerapkan aturan:
Basic mode: masukkan dari 1 hingga 10 rentang alamat IP yang akan dicocokkan dengan aturan. Anda dapat menambahkan maksimal 10 rentang alamat IP. Untuk mengetahui batas, lihat Kuota dan batas Cloud Armor.
Mode lanjutan:
- Pembuat kondisi pencocokan (Pratinjau): gunakan pembuat visual untuk membuat ekspresi tanpa menulis kode CEL mentah. Gabungkan dan kelompokkan kondisi, serta terapkan transformasi string. Lihat Menggunakan pembuat kondisi pencocokan.
- Match condition editor: masukkan ekspresi untuk dievaluasi terhadap permintaan yang masuk. Untuk mengetahui informasi selengkapnya, lihat Operasi dan Atribut.
Dalam daftar Action, pilih Allow atau Deny.
Jika Anda mengonfigurasi aturan penolakan, di daftar Response code, pilih kode respons.
Untuk mengaktifkan mode pratinjau untuk aturan, pilih Enable.
Di kolom Priority, masukkan bilangan bulat dari 0 hingga 2.147.483.646. Cloud Armor mengevaluasi aturan dalam urutan prioritas dari 0 (tertinggi) hingga 2.147.483.647 (terendah). Aturan default memiliki prioritas 2.147.483.647.
Klik Tambahkan.
gcloud
Gunakan perintah gcloud compute security-policies rules create
PRIORITY. Ganti PRIORITY dengan
prioritas aturan dalam kebijakan:
gcloud compute security-policies rules create PRIORITY \
--security-policy POLICY_NAME \
--description DESCRIPTION \
--src-ip-ranges IP_RANGES | --expression EXPRESSION \
--action=[ allow | deny-403 | deny-404 | deny-502 ] \
--preview
Misalnya, perintah berikut menambahkan aturan dengan prioritas 1000 untuk memblokir traffic dari rentang alamat IP 192.0.2.0/24 dan 198.51.100.0/24:
gcloud compute security-policies rules create 1000 \
--security-policy my-policy \
--description "block traffic from 192.0.2.0/24 and 198.51.100.0/24" \
--src-ip-ranges "192.0.2.0/24","198.51.100.0/24" \
--action "deny-403"
Gunakan flag --expression untuk menentukan kondisi. Perintah berikut menambahkan aturan untuk mengizinkan traffic dari alamat IP 1.2.3.4 yang berisi string example di header User-Agent:
gcloud compute security-policies rules create 1000 \
--security-policy my-policy \
--expression "inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')" \
--action allow \
--description "Block User-Agent 'example'"
Perintah berikut menambahkan aturan untuk memblokir permintaan jika cookie permintaan berisi nilai tertentu:
gcloud compute security-policies rules create 1000 \
--security-policy my-policy \
--expression "has(request.headers['cookie']) && request.headers['cookie'].contains('80=SomeValue')" \
--action deny-403 \
--description "Cookie Block"
Perintah berikut menambahkan aturan untuk memblokir permintaan dari wilayah AU:
gcloud compute security-policies rules create 1000 \
--security-policy my-policy \
--expression "origin.region_code == 'AU'" \
--action deny-403 \
--description "AU block"
Perintah berikut menambahkan aturan untuk memblokir permintaan dari region AU
yang tidak berada dalam rentang IP yang ditentukan:
gcloud compute security-policies rules create 1000 \
--security-policy my-policy \
--expression "origin.region_code == \"AU\" && !inIpRange(origin.ip, '1.2.3.0/24')" \
--action deny-403 \
--description "country and IP block"
Perintah berikut menambahkan aturan untuk memblokir permintaan dengan URI yang cocok dengan ekspresi reguler:
gcloud compute security-policies rules create 1000 \
--security-policy my-policy \
--expression "request.path.matches('/example_path/')" \
--action deny-502 \
--description "regex block"
Perintah berikut menambahkan aturan untuk memblokir permintaan jika nilai yang didekode Base64
dari header user-id berisi nilai tertentu:
gcloud compute security-policies rules create 1000 \
--security-policy my-policy \
--expression "has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')" \
--action deny-403 \
--description "country and IP block"
Perintah berikut menambahkan aturan yang menggunakan set ekspresi yang telah dikonfigurasi sebelumnya dari OWASP Core Rule Set (CRS) 4.22 untuk memitigasi serangan injeksi SQL (SQLi):
gcloud compute security-policies rules create 1000 \
--security-policy my-policy \
--expression "evaluatePreconfiguredWaf('sqli-v422-stable')" \
--action deny-403
Menggunakan pembuat kondisi pencocokan
Pembuat kondisi pencocokan adalah antarmuka visual di konsol Google Cloud yang membantu Anda membuat ekspresi aturan Cloud Armor yang kompleks tanpa menulis kode Common Expression Language (CEL). Daripada menulis kode, Anda dapat menggunakan UI terstruktur builder untuk menggabungkan kondisi dan logika grup, yang dapat membantu Anda menghindari error sintaksis dan memvisualisasikan struktur aturan dengan lebih baik. Builder mendukung daftar datar dan logika bertingkat hingga lima tingkat ekspresi. Gunakan alat ini saat Anda mengonfigurasi aturan untuk membantu melindungi backend multi-cloud atau deployment hybrid, yang mungkin mengharuskan Anda memeriksa atribut permintaan tertentu sebelum merutekan traffic.
Fitur pembuat kondisi pencocokan
Pembuat kondisi pencocokan mencakup fitur berikut:
- Logika dan penyusunan bertingkat: gabungkan beberapa kondisi menggunakan operator
ANDdanOR. Alat ini mendukung pengelompokan dan penyusunan bertingkat hingga lima ekspresi. - Transformasi string: untuk atribut berbasis string (seperti
request.pathataurequest.headers), terapkan transformasi untuk menormalisasi data sebelum evaluasi. Transformasi yang didukung meliputi:- Huruf Kecil dan Huruf Besar
- Decode Base64
- URL Decode dan URL Decode (Unicode)
- Konversi UTF-8 ke Unicode
- Penguraian dua arah: beralih antara Pembuat kondisi pencocokan visual dan Editor kondisi pencocokan teks mentah. UI mengurai kode CEL mentah menjadi blok visual secara otomatis.
- Dukungan fungsi: builder menyediakan kontrol UI untuk ekspresi berbasis fungsi, seperti aturan WAF yang telah dikonfigurasi sebelumnya, grup alamat, dan Threat Intelligence.
Batasan
Pembuat kondisi pencocokan adalah antarmuka default untuk pembuatan aturan lanjutan. Jika ekspresi berisi logika yang tidak didukung (seperti makro yang tidak diketahui), builder akan dinonaktifkan. Dalam kasus ini, gunakan teks mentah di Match condition editor untuk mengedit aturan.
Selain itu, ketersediaan ekspresi tertentu di builder bergantung pada paket Google Cloud Armor Enterprise project Anda dan jenis kebijakan keamanan.
Contoh ekspresi
Berikut adalah contoh ekspresi. Untuk mengetahui informasi selengkapnya tentang operasi dan atribut yang didukung, lihat Operasi dan Atribut.
Jika aturan atau ekspresi Anda menggunakan kode negara atau wilayah ISO 3166-1 alpha-2, Cloud Armor memperlakukan setiap kode secara terpisah. Aturan dan ekspresi Cloud Armor menggunakan kode tersebut untuk mengizinkan atau menolak permintaan.
Ekspresi berikut cocok dengan permintaan dari alamat IP
1.2.3.4yang berisi stringexampledi headerUser-Agent:inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')Atau, cocokkan rentang alamat IP dari header alamat IP klien kustom dengan menggunakan atribut
origin.user_ip:inIpRange(origin.user_ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')Ekspresi berikut cocok dengan permintaan yang memiliki cookie dengan nilai tertentu:
has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')Ekspresi berikut cocok dengan permintaan dari region
AU:origin.region_code == 'AU'
Ekspresi berikut cocok dengan permintaan dari region
AUyang tidak berada dalam rentang IP yang ditentukan:origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
Ekspresi berikut cocok dengan permintaan dengan jalur variabel bernomor ke file tertentu jika URI cocok dengan ekspresi reguler:
request.path.matches('/path/[0-9]+/target_file.html')Ekspresi berikut cocok dengan permintaan jika nilai header
user-idyang didekode Base64 berisi nilai tertentu:has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')Ekspresi berikut menggunakan set ekspresi yang telah dikonfigurasi sebelumnya dari set aturan OWASP CRS 4.22 untuk mencocokkan serangan SQLi:
evaluatePreconfiguredWaf('sqli-v422-stable')
Path traversal dan normalisasi
Normalisasikan konten dalam aturan berbasis jalur untuk mengelola aturan encoding dan jalur traversal serta untuk membuat aturan umum yang menghindari kapitalisasi atau encoding khusus konten.
Saat Anda menulis aturan yang menggunakan startsWith, endsWith, atau contains untuk mencocokkan
pada request.path, gunakan lower dan urlDecode untuk menormalisasi jalur sebelum
pencocokan. Tindakan ini membantu mencegah bypass yang menggunakan encoding URL atau variasi huruf.
Misalnya, untuk memblokir akses ke direktori /admin, gunakan ekspresi berikut:
request.path.lower().urlDecode().startsWith('/admin')
Aturan ini memblokir permintaan untuk /admin, /Admin, /a%64min, dan variasi lainnya.
Saat Anda menulis aturan yang menggunakan matches untuk mencocokkan request.path, perhitungkan
karakter garis miring terbalik (\) dalam ekspresi reguler Anda.
Misalnya, untuk memblokir akses ke direktori /admin, gunakan ekspresi berikut untuk memblokir bypass yang menggunakan karakter garis miring terbalik (\):
request.path.matches(r'^/\\*admin')
Gabungkan ini dengan urlDecode untuk menangani encoding URL dan bypass karakter garis miring terbalik (\):
request.path.urlDecode().matches(r'^/\\*admin')
Melihat aturan kebijakan keamanan
Bagian berikut menjelaskan cara mencantumkan aturan yang dikonfigurasi dalam kebijakan keamanan dan melihat aturan WAF yang telah dikonfigurasi sebelumnya yang tersedia.
Membuat daftar aturan dalam kebijakan keamanan
Ikuti langkah-langkah di bagian ini untuk membuat daftar aturan dalam kebijakan keamanan Cloud Armor.
Konsol
Di konsol Google Cloud , buka halaman Cloud Armor policies.
Klik nama kebijakan keamanan tertentu. Halaman Policy details menampilkan aturan kebijakan di tab Rules.
gcloud
Gunakan perintah gcloud berikut untuk mencantumkan semua aturan dalam kebijakan
keamanan:
gcloud compute security-policies describe NAME
Gunakan perintah gcloud berikut untuk mencantumkan semua aturan dalam satu kebijakan keamanan di region tertentu beserta deskripsi kebijakan:
gcloud compute security-policies describe NAME \ --region REGION
Gunakan perintah gcloud berikut untuk mendeskripsikan aturan:
gcloud compute security-policies rules describe PRIORITY \
--security-policy POLICY_NAME
Misalnya, perintah berikut menjelaskan aturan dengan prioritas 1000
dalam kebijakan keamanan my-policy:
gcloud compute security-policies rules describe 1000 \
--security-policy my-policy
Output:
action: deny(403) description: block traffic from 192.0.2.0/24 and 198.51.100.0/24 kind: compute#securityPolicyRule match: srcIpRanges: - '192.0.2.0/24' - '198.51.100.0/24' preview: false priority: 1000
Untuk informasi selengkapnya, lihat gcloud compute security-policies
describe.
Membuat daftar aturan yang telah dikonfigurasi dan tersedia
Selain aturan yang Anda konfigurasi sendiri, Cloud Armor menyediakan aturan yang telah dikonfigurasi sebelumnya yang dapat Anda gunakan dalam kebijakan keamanan. Anda dapat membuat daftar aturan yang telah dikonfigurasi sebelumnya untuk melihat aturan dan signature perlindungan aplikasi yang telah ditentukan sebelumnya, seperti OWASP Core Rule Set (CRS), yang disediakan Cloud Armor. Aturan ini berisi signature bawaan yang dievaluasi Cloud Armor terhadap permintaan masuk. Tambahkan aturan yang telah dikonfigurasi sebelumnya ini ke aturan baru atau yang sudah ada menggunakan bahasa aturan kustom. Sebaiknya gunakan versi aturan CRS terbaru jika memungkinkan.
gcloud
Jalankan perintah
gcloud compute security-policies list-preconfigured-expression-sets:gcloud compute security-policies list-preconfigured-expression-sets
Contoh berikut menunjukkan bentuk output dari perintah:
EXPRESSION_SET expression-set-1 RULE_ID SENSITIVITY expression-set-1-id-1 sensitivity-value-1 expression-set-1-id-2 sensitivity-value-2 expression-set-2 alias-1 RULE_ID SENSITIVITY expression-set-2-id-1 sensitivity-value-1 expression-set-2-id-2 sensitivity-value-2
Contoh berikut mencakup contoh output sebenarnya dari perintah tersebut. Perhatikan bahwa output sebenarnya mencakup semua aturan yang tercantum dalam Menyesuaikan aturan WAF Cloud Armor.
gcloud compute security-policies list-preconfigured-expression-sets
EXPRESSION_SET sqli-canary RULE_ID SENSITIVITY owasp-crs-v042200-id942120-sqli 2 … xss-canary RULE_ID SENSITIVITY owasp-crs-v042200-id941110-xss 1 owasp-crs-v042200-id941120-xss 2 … sourceiplist-fastly sourceiplist-cloudflare sourceiplist-imperva
Operasi
Referensi berikut menjelaskan operator yang dapat Anda gunakan dengan atribut
(diwakili oleh x, y, dan k) untuk menentukan ekspresi aturan.
| Operasi | Ekspresi | Deskripsi |
|---|---|---|
| Kesetaraan | x == y |
Menampilkan true jika x sama dengan y. |
| Kesetaraan, literal string | x == "foo" |
Menampilkan true jika x sama dengan literal string konstan yang diberikan. |
| Kesetaraan, literal string raw | x == R"fo'o" |
Menampilkan true jika x sama dengan literal string raw yang diberikan yang tidak menafsirkan urutan escape. Literal string raw berguna untuk
mengekspresikan string yang harus menggunakan karakter urutan escape.
|
| Logika NOT | !x |
Menampilkan true jika nilai Boolean x adalah false, atau menampilkan false jika
nilai Boolean x adalah true. |
| Ketidaksetaraan | x != y |
Menampilkan true jika x tidak sama dengan y. |
| Penyambungan | x + y |
Menampilkan string penyambungan xy. |
| Logika AND | x && y |
Menampilkan true jika x dan y adalah true. |
| Logika OR | x || y |
Menampilkan true jika x, y, atau keduanya adalah true. |
| Berisi substring | x.contains(y) |
Menampilkan true jika string x berisi substring y. |
| Dimulai dengan substring | x.startsWith(y) |
Menampilkan true jika string x diawali dengan substring y. |
| Diakhiri dengan substring | x.endsWith(y) |
Menampilkan true jika string x diakhiri dengan substring y. |
| Pencocokan ekspresi reguler | x.matches(y) |
Menampilkan true jika string x sebagian cocok dengan pola
RE2
y yang ditentukan. Pola RE2 dikompilasi menggunakan opsi RE2::Latin1
yang menonaktifkan fitur Unicode. |
| Alamat IP dalam rentang | inIpRange(x, y) |
Menampilkan true jika alamat IP x berada dalam rentang IP
y. |
| Huruf kecil | x.lower() |
Menampilkan nilai huruf kecil dari string x. |
| Huruf besar | x.upper() |
Menampilkan nilai huruf besar dari string x. |
| Nilai yang didekode base64 | x.base64Decode() |
Menampilkan nilai yang didekode base64 dari x; garis bawah (_) dan tanda hubung (-) diganti terlebih dahulu dengan garis miring (/) dan tanda plus (+).
Menampilkan "" (string kosong) jika x bukan nilai base64 yang valid. |
| Nilai key-map | m['k'] |
Menampilkan nilai pada kunci k dalam peta string-ke-string m jika
k tersedia; jika tidak, maka error akan ditampilkan. Pendekatan yang direkomendasikan adalah
memeriksa ketersediaan terlebih dahulu menggunakan "has(m['k'])==true". |
| Memeriksa ketersediaan kunci di peta | has(m['k']) |
Menampilkan true jika kunci k tersedia di peta m. |
| Mengonversi ke integer | int(x) |
Mengonversi hasil string x menjadi jenis int. Kemudian,
nilai ini dapat digunakan untuk melakukan perbandingan integer menggunakan operator aritmatika
standar seperti > dan <=. Cara ini hanya berfungsi untuk nilai yang
seharusnya berupa integer. |
| Panjang | size(x) |
Menampilkan panjang string x. |
| Mendekode URL | x.urlDecode() |
Menampilkan nilai yang didekode URL dari x; urutan karakter dalam
format %## diganti dengan karakter non-ASCII yang setara, dan
+ diganti dengan spasi. Encoding yang tidak valid ditampilkan
apa adanya. |
| Mendekode URL (Unicode) | x.urlDecodeUni() |
Menampilkan nilai yang didekode URL dari x; selain
urlDecode(), fungsi ini juga menangani urutan karakter unicode dalam
format %u###. Encoding yang tidak valid ditampilkan apa adanya. |
| Konversi UTF-8 ke Unicode | x.utf8ToUnicode() |
Menampilkan representasi Unicode huruf kecil dari x yang dienkode UTF-8. |
| Ada | m.exists(k, expr) |
Menampilkan true jika setidaknya satu entri dalam peta m memenuhi expr,
dengan k mewakili kunci setiap entri peta.
|
| Ada satu | m.exists_one(k, expr) |
Menampilkan true jika tepat satu entri di peta m memenuhi expr,
dengan k mewakili kunci setiap entri peta.
|
| Semua | m.all(k, expr) |
Menampilkan true jika semua entri dalam peta m memenuhi expr,
dengan k mewakili kunci setiap entri peta.
|
| Filter | m.filter(k, expr) |
Menampilkan peta yang hanya berisi entri dari peta m dengan entri yang memenuhi expr, dengan k mewakili kunci setiap entri peta. |
| Peta | m.map(k, expr) |
Menampilkan daftar yang berisi hasil evaluasi expr untuk setiap kunci dalam peta m, dengan k mewakili kunci setiap entri peta. |
Atribut
Atribut merepresentasikan informasi dari permintaan masuk, seperti alamat IP klien atau jalur URL yang diminta.
| Kolom | Jenis | Deskripsi kolom |
|---|---|---|
origin.ip |
string | Alamat IP klien yang memulai permintaan. |
origin.user_ip |
string | Alamat IP klien asal, yang disertakan dalam
HTTP-HEADER oleh proxy upstream. Sebelum menggunakan
atribut ini, Anda harus mengonfigurasi opsi userIpRequestHeaders[]
di kolom advancedOptionsConfig kebijakan keamanan
agar cocok dengan sumber seperti True-Client-IP,
X-Forwarded-For, atau X-Real-IP. Untuk mengetahui informasi selengkapnya, lihat
Ringkasan alamat IP pengguna.
Jika Anda tidak mengonfigurasi opsi |
origin.tls_ja4_fingerprint |
string | Sidik jari TLS/SSL JA4
jika klien terhubung menggunakan
HTTPS, HTTP/2, atau HTTP/3. Jika tidak
tersedia, string kosong akan ditampilkan. |
origin.tls_ja3_fingerprint |
string | Sidik jari TLS/SSL JA3
jika klien terhubung menggunakan
HTTPS, HTTP/2, atau HTTP/3. Jika tidak
tersedia, string kosong akan ditampilkan. |
request.headers |
map | Peta string-ke-string dari header permintaan HTTP. Jika header memiliki beberapa nilai, nilai yang sesuai dalam peta ini adalah string tunggal yang berisi semua nilai, yang dipisahkan dengan koma. Semua kunci dalam peta ini berupa huruf kecil. Load Balancer Aplikasi eksternal memeriksa semua header yang diterima, dan batasan header yang sama
berlaku. Gunakan Anda dapat melakukan iterasi pada peta untuk memeriksa kunci dan nilai.
Namun, Anda hanya dapat menggunakan operator iterasi peta ( |
request.body |
string | Merepresentasikan isi permintaan sebagai string mentah. Jenis ini dapat merepresentasikan data dari Content-Type apa pun. Metode ini menyimpan konten sebagai string tanpa penguraian otomatis.
|
request.params |
map | Peta key-value pair yang ditambahkan ke URL atau disertakan dalam isi permintaan. Permintaan URI: name1=value1&name2=value2Isi permintaan JSON dengan Content-Type: application/json:{ "username": "johndoe", "email": "johndoe@example.com" }Isi permintaan POST GraphQL dengan Content-Type: application/graphql:{ Username: "exampleUser", query: "/* other fields */" }Isi permintaan POST formulir dengan Content-Type: application/x-www-form-urlencoded:"username=exampleUser&email=johndoe%40example.com"
|
request.method |
string | Metode permintaan HTTP. |
request.path |
string | Jalur URL HTTP yang diminta. Saat Anda menulis aturan yang cocok dengan
request.path, sebaiknya Anda menormalisasi jalur
untuk memfasilitasi sintaksis pencocokan jika terjadi encoding URL, variasi huruf,
atau garis miring terbalik.
Untuk informasi dan contoh selengkapnya, lihat
Penjelajahan
dan normalisasi jalur. |
request.scheme |
string | Skema URL HTTP seperti http atau https.
Nilai untuk atribut ini berupa huruf kecil. |
request.query |
string | Kueri URL HTTP dalam format
name1=value&name2=value2, seperti yang muncul di baris pertama
permintaan HTTP. Tidak ada decoding yang dijalankan.
|
origin.region_code |
string | Kode negara Unicode yang terkait dengan IP klien, seperti
US. Jika Anda membuat aturan atau ekspresi yang menggunakan
kode negara atau region
ISO 3166-1 alpha 2, Cloud Armor memperlakukan setiap kode
secara terpisah. Aturan dan ekspresi Cloud Armor secara eksplisit
menggunakan kode region tersebut untuk mengizinkan atau menolak permintaan.
|
origin.asn |
integer | Nomor sistem otonom (ASN) yang terkait dengan alamat IP klien. ASN yang unik secara global ditentukan berdasarkan operator jaringan yang mendukung awalan alamat IP yang berisi alamat IP klien. |
Contoh ekspresi
Untuk setiap ekspresi berikut, tindakan yang diambil bergantung pada apakah ekspresi tersebut disertakan dalam aturan penolakan atau aturan izin.
Mengizinkan atau menolak akses berdasarkan rentang alamat IP di IPv4 atau IPv6
Ekspresi berikut cocok dengan permintaan dari rentang alamat IP
198.51.100.0/24:inIpRange(origin.ip, '198.51.100.0/24')
Ekspresi berikut cocok dengan permintaan dari rentang alamat IP
2001:db8::/32:inIpRange(origin.ip, '2001:db8::/32')
Mengizinkan atau menolak akses berdasarkan rentang alamat IP klien kustom di belakang proxy upstream
Jika telah mengonfigurasi operator origin.user_ip, Anda dapat mencocokkan berdasarkan
nilai header yang ditentukan di kolom
advancedOptionsConfig.userIpRequestHeaders[].
Ekspresi berikut cocok dengan permintaan yang berasal dari rentang alamat IP
192.0.2.0/24:inIpRange(origin.user_ip, '192.0.2.0/24')
Ekspresi berikut cocok dengan permintaan yang berasal dari rentang alamat IP
2001:db8::/32:inIpRange(origin.user_ip, '2001:db8::/32')
Mengizinkan atau menolak traffic dengan cookie tertentu
Ekspresi berikut cocok dengan permintaan yang memiliki cookie yang berisi
80=BLAH:has(request.headers['cookie']) && request.headers['cookie'].contains('80=BLAH')
Mengizinkan atau menolak traffic dengan header referer yang tidak kosong
Ekspresi berikut cocok dengan permintaan yang memiliki header
refereryang tidak kosong:has(request.headers['referer']) && request.headers['referer'] != ""
Mengizinkan atau menolak traffic berdasarkan header host
Anda dapat mengizinkan atau menolak traffic berdasarkan nilai header Host dalam permintaan.
Ekspresi berikut cocok dengan permintaan ke URL tertentu menggunakan
==:request.headers['host'].lower() == 'test.example.com'
Ekspresi berikut cocok dengan permintaan ke URL tertentu menggunakan
endsWith:request.headers['host'].lower().endsWith('.example.com')Ekspresi berikut cocok dengan permintaan ke URL tertentu menggunakan
contains:request.headers['host'].lower().contains('test.example.com')
Ekspresi berikut cocok dengan permintaan ke beberapa domain menggunakan
contains:request.headers['host'].lower().contains('test.example.com') || request.headers['host'].lower().contains('test22.example.com')Ekspresi berikut cocok dengan permintaan ke domain dan subdomainnya menggunakan
matches:request.headers['host'].matches('(?i:(?:sub\.)?test\.example\.com)')
Mengizinkan atau menolak traffic dari region tertentu
Jika aplikasi web Anda tidak tersedia di region AU, semua permintaan dari region tersebut harus diblokir.
Dalam aturan penolakan, gunakan ekspresi berikut yang cocok dengan permintaan dari region
AU:origin.region_code == 'AU'
Sebaliknya, jika aplikasi web Anda hanya tersedia di region AU,
permintaan dari semua region lain harus diblokir.
Dalam aturan penolakan, gunakan ekspresi berikut yang cocok dengan permintaan dari semua region selain region
AU:origin.region_code != 'AU'
Kode region didasarkan pada kode
ISO 3166-1 alpha 2. Dalam beberapa kasus, region sesuai dengan negara, tetapi tidak selalu demikian. Misalnya, kode US mencakup semua negara bagian Amerika Serikat, satu distrik, dan enam area terpencil.
Mengizinkan atau menolak traffic dari ASN tertentu
Jika aplikasi web Anda perlu diblokir untuk pelanggan yang dilayani oleh operator jaringan tertentu, Anda dapat menggunakan nomor ASN operator jaringan untuk memblokir.
Dalam aturan penolakan, gunakan ekspresi berikut, yang cocok dengan permintaan dari ASN tertentu:
origin.asn == 123
Sebaliknya, jika aplikasi web Anda hanya tersedia untuk pelanggan di belakang operator jaringan tertentu, permintaan dari semua operator jaringan lainnya harus diblokir.
Dalam aturan penolakan, gunakan ekspresi berikut yang cocok dengan semua operator jaringan lainnya selain yang ingin Anda izinkan:
origin.asn != 123
Beberapa ekspresi
Untuk menyertakan beberapa kondisi dalam satu aturan, gabungkan beberapa subekspresi.
Dalam contoh berikut, permintaan dari
1.2.3.0/24(seperti penguji alpha Anda) di regionAUcocok dengan ekspresi berikut:origin.region_code == "AU" && inIpRange(origin.ip, '1.2.3.0/24')
Ekspresi berikut cocok dengan permintaan dari
1.2.3.4saat agen pengguna berisi stringWordPress:inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('WordPress')
Mengizinkan atau menolak traffic untuk URI permintaan yang cocok dengan ekspresi reguler
Ekspresi berikut cocok dengan permintaan yang berisi string
/example_path/di URI:request.path.matches('/example_path/')Ekspresi berikut cocok dengan permintaan yang memiliki
Chromedi kolom headerUser-Agent:request.headers['user-agent'].matches('Chrome')Ekspresi berikut menunjukkan pencocokan yang tidak peka huruf besar/kecil untuk header
User-Agentyang berisiwordpress; ekspresi ini cocok denganUser-Agent:WordPress/605.1.15,User-Agent:wordPress, dan variasiwordpresslainnya:request.headers['user-agent'].matches('(?i:wordpress)')
Mengizinkan atau menolak traffic yang berisi nilai yang didekode base64 tertentu
Ekspresi berikut cocok dengan permintaan yang memiliki nilai
myValueyang didekode base64 untuk headeruser-id:has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
Mengizinkan atau menolak traffic yang berisi nilai string dengan panjang tertentu
Ekspresi berikut cocok dengan permintaan yang memiliki panjang URL lebih dari 10 karakter:
size(request.path) > 10
Ekspresi berikut cocok dengan permintaan yang memiliki panjang header
x-datalebih besar dari atau sama dengan 1.024 karakter:size(request.headers['x-data']) >= 1024
Mengizinkan atau menolak traffic yang memiliki nol content-length di isi HTTP
Ekspresi berikut cocok dengan permintaan yang memiliki
content-lengthnol di isi HTTP:int(request.headers["content-length"]) == 0
Mengizinkan atau menolak traffic yang berisi nilai yang dienkode URL tertentu
Ekspresi berikut cocok dengan permintaan yang memiliki nilai cookie yang berisi
%3c:has(request.headers['cookie']) && request.headers['cookie'].urlDecode().contains('<')
Mengizinkan atau menolak traffic yang berisi nilai string Unicode yang dienkode URL tertentu
Ekspresi berikut cocok dengan permintaan yang memiliki nilai cookie yang sama dengan
Match%2BValueatauMatch%u002BValue:has(request.headers['cookie']) && request.headers['cookie'].urlDecodeUni() == 'Match+Value'
Mengizinkan atau menolak traffic yang berisi string Unicode tertentu dari teks UTF-8
Ekspresi berikut cocok dengan permintaan yang memiliki nilai cookie sama dengan
¬:has(request.headers['cookie']) && request.headers['cookie'].utf8ToUnicode() == '%u00ac'
Mengizinkan atau menolak traffic berdasarkan sidik jari JA4 yang diketahui
Ekspresi berikut cocok dengan permintaan yang memiliki sidik jari JA4 yang sama dengan
t13d1516h2_8daaf6152771_b186095e22b6:origin.tls_ja4_fingerprint == 't13d1516h2_8daaf6152771_b186095e22b6'
Mengizinkan atau menolak traffic berdasarkan daftar sidik jari JA4
Ekspresi berikut cocok dengan permintaan yang memiliki sidik jari JA4 yang sama dengan salah satu sidik jari JA4 berikut:
t00d0000h0_000000000000_000000000000t13d1516h2_8daaf6152771_b186095e22b6
origin.tls_ja4_fingerprint == 't00d0000h0_000000000000_000000000000' || origin.tls_ja4_fingerprint == 't13d1516h2_8daaf6152771_b186095e22b6'
Mengizinkan atau menolak traffic berdasarkan konten isi permintaan
Ekspresi berikut cocok dengan permintaan POST yang berisi
malicious-valuedalam isi permintaan:request.method == 'POST' && request.body.contains('malicious-value')Ekspresi berikut cocok dengan permintaan yang diawali dengan
<!DOCTYPE html>:request.body.startsWith('<!DOCTYPE html>')Ekspresi berikut cocok dengan permintaan yang isinya cocok dengan ekspresi reguler
\w+@\w+.com:request.body.matches('\w+@\w+.com')
Mengizinkan atau menolak traffic berdasarkan parameter permintaan
Ekspresi berikut cocok dengan permintaan yang tidak berisi parameter bernama
category:!has(request.params.category)
Ekspresi berikut cocok dengan permintaan yang parameter
category-nya adalahelectronics:request.params.category == 'electronics'
Ekspresi berikut cocok dengan permintaan yang semua parameter value-nya tidak kosong:
request.params.all(k, request.params[k] != '')
Ekspresi berikut cocok dengan permintaan yang parameternya berisi string
admin:request.params.exists(k, request.params[k].contains('admin'))Ekspresi berikut cocok dengan permintaan yang hanya memiliki satu nama parameter yang berisi
admin:request.params.exists_one(k, k.contains('admin'))Ekspresi berikut cocok dengan permintaan yang setidaknya satu nama parameternya berisi
id:size(request.params.filter(k, k.contains('id'))) > 0Ekspresi berikut cocok dengan permintaan yang nilai parameternya menyertakan string
admin:request.params.map(k, request.params[k]).contains('admin')
Mengizinkan atau menolak traffic berdasarkan data terstruktur dalam isi permintaan
Ekspresi berikut cocok dengan permintaan saat kolom
passworddalam isi permintaan JSON berisi123:has(request.params.password) && request.params.password.contains('123')Ekspresi berikut cocok dengan permintaan yang memiliki kolom
citydalam data formulir bernilaiNewYork:has(request.params.city) && request.params.city == 'NewYork'
Ekspresi berikut cocok dengan permintaan yang kolom
newsletterbertingkatnya adalahtrue:has(request.params.preferences) && has(request.params.preferences.newsletter) && request.params.preferences.newsletter == true
Ekspresi berikut cocok dengan permintaan saat kolom
namedari elemen pertama dalam arrayfriendsadalahjohndoe:request.params['friends'][0]['name'] == 'johndoe'
Aturan WAF yang telah dikonfigurasi sebelumnya
Aturan WAF yang telah dikonfigurasi sebelumnya menggunakan signature statis, ekspresi reguler, atau keduanya yang telah dikonfigurasi sebelumnya untuk mencocokkan isi permintaan HTTP, header permintaan HTTP, dan parameter kueri. Aturan WAF yang telah dikonfigurasi sebelumnya yang tersedia didasarkan pada OWASP Core Rule Set 4.22. Cloud Armor menyediakan beberapa aturan WAF yang telah dikonfigurasi dan ditentukan sebelumnya. Untuk mengetahui daftar lengkap aturan WAF yang telah dikonfigurasi sebelumnya, lihat Ringkasan aturan WAF yang telah dikonfigurasi sebelumnya oleh Cloud Armor.
Untuk mencantumkan semua aturan WAF yang telah dikonfigurasi sebelumnya yang tersedia, lihat Mencantumkan aturan WAF yang telah dikonfigurasi sebelumnya yang tersedia.
Untuk mengetahui informasi selengkapnya tentang aturan WAF yang telah dikonfigurasi sebelumnya, lihat kasus penggunaan Mencegah serangan pada lapisan aplikasi menggunakan aturan WAF yang telah dikonfigurasi sebelumnya.
Nama aturan WAF yang telah dikonfigurasi sebelumnya
Nama aturan WAF yang telah dikonfigurasi sebelumnya memiliki format
<attack category>-<OWASP CRS version>-<version field>. Kategori serangan menentukan jenis serangan yang ingin Anda lindungi, seperti xss (pembuatan skrip lintas situs) atau sqli (injeksi SQL).
Kolom versi yang didukung adalah stable dan canary. Penambahan dan
modifikasi pada aturan dirilis terlebih dahulu di versi canary. Jika penambahan dan modifikasi dianggap aman dan stabil, maka akan dipromosikan ke versi stable.
ID anggota aturan WAF yang telah dikonfigurasi sebelumnya
Aturan WAF yang telah dikonfigurasi sebelumnya berisi beberapa ekspresi, yang masing-masing memiliki signature-nya.
Misalnya, aturan WAF yang telah dikonfigurasi sebelumnya xss-v422-stable mencakup ekspresi
yang disebut owasp-crs-v042200-id941100-xss, yang sesuai dengan ID aturan id941100
untuk versi 4.22. Anda dapat menggunakan signature untuk mengecualikan ekspresi tertentu agar tidak digunakan, yang berguna jika ekspresi tertentu sering memicu positif palsu. Untuk mengetahui informasi selengkapnya, lihat informasi pemecahan masalah positif palsu.
Untuk mengetahui informasi tentang core rule set dan penyesuaian pada berbagai tingkat sensitivitas, lihat Menyesuaikan aturan WAF Cloud Armor.
Operator untuk aturan WAF yang telah dikonfigurasi sebelumnya
| Ekspresi | Deskripsi |
|---|---|
evaluatePreconfiguredWaf(string, MAP<string, dyn>) |
Menampilkan true jika salah satu signature WAF dalam set aturan WAF yang ditentukan menampilkan true. Argumen pertama adalah nama set aturan WAF, seperti xss-v422-stable. Argumen kedua
(opsional) adalah peta dengan kunci berupa string dan nilai bertipe
dinamis tergantung pada kuncinya. Tujuan argumen ini adalah untuk menyesuaikan secara detail signature WAF yang dievaluasi. Kunci yang diterima adalah
sebagai berikut:
Kunci |
evaluatePreconfiguredWaf(string, LIST) |
Menampilkan Argumen pertama adalah nama aturan WAF yang telah dikonfigurasi sebelumnya, seperti
|
Contoh aturan WAF yang telah dikonfigurasi sebelumnya
Ekspresi berikut menggunakan aturan WAF
xss-v422-stableyang telah dikonfigurasi sebelumnya untuk mengurangi serangan XSS:evaluatePreconfiguredWaf('xss-v422-stable')Ekspresi berikut menggunakan semua ekspresi dari aturan WAF
xss-v422-stableyang telah dikonfigurasi sebelumnya kecuali untuk ID anggota941100dan941110:evaluatePreconfiguredWaf('xss-v422-stable', {'opt_out_rule_ids': ['owasp-crs-v042200-id941100-xss', 'owasp-crs-v042200-id941110-xss']})Ekspresi berikut menggunakan aturan WAF yang telah dikonfigurasi sebelumnya untuk memitigasi serangan SQLi dari rentang alamat IP
198.51.100.0/24:inIpRange(origin.ip, '198.51.100.0/24') && evaluatePreconfiguredWaf('sqli-v422-stable')Ekspresi berikut menggunakan aturan WAF
xss-v422-stableyang telah dikonfigurasi sebelumnya untuk mengurangi serangan XSS untuk permintaan keexample.com, tidak termasuk jalur yang dimulai dengan/login/api/:request.headers['host'].lower() == 'example.com' && !request.path.startswith('/login/api/') && evaluatePreconfiguredWaf('xss-v422-stable')
Operator lainnya
| Ekspresi | Deskripsi |
|---|---|
evaluateThreatIntelligence(string)evaluateThreatIntelligence(string, LIST)evaluateThreatIntelligence(string, string, LIST)
|
Menampilkan Argumen pertama adalah nama feed
Google Threat Intelligence, seperti |
evaluateAddressGroup(string, string)evaluateAddressGroup(string, string, LIST)evaluateOrganizationAddressGroup(string, string)evaluateOrganizationAddressGroup(string, string, LIST)
|
Menampilkan Argumen pertama adalah nama grup alamat. Argumen
kedua menentukan dari mana alamat IP diambil, dan dapat berupa
|
evaluateAdaptiveProtection(string) |
Menampilkan Argumennya adalah ID peringatan tertentu yang dihasilkan oleh Perlindungan Adaptif saat mendeteksi serangan. |
evaluateAdaptiveProtectionAutoDeploy() |
Menampilkan |
Contoh
Ekspresi berikut mencocokkan permintaan masuk terhadap feed
iplist-known-malicious-ipsGoogle Threat Intelligence untuk perlindungan dari daftar IP berbahaya yang diketahui:evaluateThreatIntelligence('iplist-known-malicious-ips')Ekspresi berikut mencocokkan permintaan masuk terhadap feed
iplist-known-malicious-ipsGoogle Threat Intelligence untuk perlindungan dari daftar IP berbahaya yang diketahui, kecuali IP di203.0.113.0/24:evaluateThreatIntelligence('iplist-known-malicious-ips', ['203.0.113.0/24'])Ekspresi berikut mencocokkan header permintaan kustom untuk IP pengguna terhadap grup alamat bernama
my-own-list-of-bad-ips:evaluateAddressGroup('my-own-list-of-bad-ips', origin.user_ip)