Mengumpulkan log WAF Fastly
Ringkasan
Parser ini mengekstrak kolom dari log JSON Fastly WAF, mengubah dan mengganti namanya, serta memetakan ke UDM. Fungsi ini menangani berbagai jenis data, mengonversi tingkat keparahan, dan mengategorikan peristiwa berdasarkan informasi nama host dan IP yang tersedia. Fungsi ini juga menangani potensi kegagalan penguraian dan menghapus entri log yang salah format.
Sebelum memulai
- Pastikan Anda memiliki instance Google Chronicle.
- Akun Fastly dengan akses untuk mengonfigurasi setelan WAF.
Mengonfigurasi feed di Google SecOps untuk menyerap log WAF Fastly
- Buka Setelan SIEM > Feed.
- Klik Tambahkan baru.
- Di kolom Feed name, masukkan nama untuk feed (misalnya, Fastly WAF Logs).
- Pilih Webhook sebagai Jenis sumber.
- Pilih Fastly WAF sebagai Jenis log.
- Klik Berikutnya.
- Opsional: Tentukan nilai untuk parameter input berikut:
- Pemisah pemisahan: pembatas yang digunakan untuk memisahkan baris log, seperti
\n
. - Namespace aset: namespace aset.
- Label penyerapan: label yang diterapkan ke peristiwa dari feed ini.
- Pemisah pemisahan: pembatas yang digunakan untuk memisahkan baris log, seperti
- Klik Berikutnya.
- Tinjau konfigurasi feed di layar Finalize, lalu klik Submit.
- Klik Buat Kunci Rahasia untuk membuat kunci rahasia guna mengautentikasi feed ini.
- Salin dan simpan kunci rahasia. Anda tidak dapat melihat kunci rahasia ini lagi. Jika perlu, Anda dapat membuat ulang kunci rahasia baru, tetapi tindakan ini akan membuat kunci rahasia sebelumnya tidak berlaku lagi.
- Di tab Detail, salin URL endpoint feed dari kolom Endpoint Information. Anda perlu menentukan URL endpoint ini di aplikasi klien.
- Klik Done.
Membuat kunci API untuk feed webhook
Buka Konsol Google Cloud > Kredensial.
Klik Create credentials, lalu pilih API key.
Batasi akses kunci API ke Google Security Operations API.
Menentukan URL endpoint
- Di aplikasi klien, tentukan URL endpoint HTTPS yang diberikan di feed webhook.
Aktifkan autentikasi dengan menentukan kunci API dan kunci secret sebagai bagian dari header kustom dalam format berikut:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
Rekomendasi: Tentukan kunci API sebagai header, bukan menentukannya di URL.
Jika klien webhook Anda tidak mendukung header kustom, Anda dapat menentukan kunci API dan kunci rahasia menggunakan parameter kueri dalam format berikut:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Ganti kode berikut:
ENDPOINT_URL
: URL endpoint feed.API_KEY
: kunci API untuk mengautentikasi ke Google Security Operations.SECRET
: kunci rahasia yang Anda buat untuk mengautentikasi feed.
Mengonfigurasi webhook di Fastly
- Login ke Fastly.
- Opsional: Pilih situs di menu Situs (jika Anda memiliki lebih dari satu situs).
- Pilih Kelola > Integrasi Situs.
- Klik Tambahkan integrasi situs.
- Pilih Webhook Generik.
- Webhook URL: masukkan ENDPOINT_URL Google SecOps, diikuti dengan API_KEY dan SECRET.
- Penempatan Notifikasi: pilih Semua aktivitas atau Aktivitas tertentu.
- Opsional: Jika Anda memilih Aktivitas tertentu, buka Menu aktivitas dan pilih jenis aktivitas yang ingin dikirim webhook.
- Klik Buat integrasi situs.
Tabel Pemetaan UDM
Kolom Log | Pemetaan UDM | Logika |
---|---|---|
anomaly_score |
security_result.detection_fields[].key : "anomaly"security_result.detection_fields[].value : anomaly_score |
Jika waf.score.anomaly adalah 0 atau kosong dan anomaly_score tidak kosong atau 0, nilai anomaly_score akan digunakan untuk mengisi array security_result.detection_fields dengan kunci "anomali" dan nilai kolom anomaly_score . |
cache_status |
additional.fields[].key : "cache_status"additional.fields[].value.string_value : cache_status |
Nilai cache_status digunakan untuk mengisi array additional.fields dengan kunci "cache_status" dan nilai kolom cache_status . |
client_ip |
principal.ip : client_ip |
Kolom client_ip dipetakan ke principal.ip . |
connection.fastly_is_edge |
additional.fields[].key : "fastly_is_edge"additional.fields[].value.bool_value : connection.fastly_is_edge |
Nilai connection.fastly_is_edge digunakan untuk mengisi array additional.fields dengan kunci "fastly_is_edge" dan nilai kolom connection.fastly_is_edge . |
connection.fastly_is_shield |
additional.fields[].key : "fastly_is_shield"additional.fields[].value.bool_value : connection.fastly_is_shield |
Nilai connection.fastly_is_shield digunakan untuk mengisi array additional.fields dengan kunci "fastly_is_shield" dan nilai kolom connection.fastly_is_shield . |
connection.request_tls_version |
network.tls.version : connection.request_tls_version |
Kolom connection.request_tls_version dipetakan ke network.tls.version . |
fastly.server |
target.hostname : fastly.server |
Kolom fastly.server dipetakan ke target.hostname . |
fastly.service_id |
additional.fields[].key : "service_id"additional.fields[].value.string_value : fastly.service_id |
Nilai fastly.service_id digunakan untuk mengisi array additional.fields dengan kunci "service_id" dan nilai kolom fastly.service_id . |
geo.city |
principal.location.city : geo.city |
Kolom geo.city dipetakan ke principal.location.city . |
geo.country |
principal.location.country_or_region : geo.country |
Kolom geo.country dipetakan ke principal.location.country_or_region . |
geo.location |
principal.location.region_latitude : diekstrak dari geo.location principal.location.region_longitude : diekstrak dari geo.location |
Lintang dan bujur diekstrak dari kolom geo.location menggunakan ekspresi reguler dan dipetakan ke principal.location.region_latitude dan principal.location.region_longitude . |
geo.region |
principal.location.state : geo.region |
Kolom geo.region dipetakan ke principal.location.state . |
host |
principal.hostname : host |
Kolom host dipetakan ke principal.hostname . |
request_headers.accept_charset |
additional.fields[].key : "accept_charset"additional.fields[].value.string_value : request_headers.accept_charset |
Nilai request_headers.accept_charset digunakan untuk mengisi array additional.fields dengan kunci "accept_charset" dan nilai kolom request_headers.accept_charset . |
request_headers.accept_language |
additional.fields[].key : "accept_language"additional.fields[].value.string_value : request_headers.accept_language |
Nilai request_headers.accept_language digunakan untuk mengisi array additional.fields dengan kunci "accept_language" dan nilai kolom request_headers.accept_language . |
request_headers.referer |
network.http.referral_url : request_headers.referer |
Kolom request_headers.referer dipetakan ke network.http.referral_url . |
request_headers.user_agent |
network.http.user_agent : request_headers.user_agent |
Kolom request_headers.user_agent dipetakan ke network.http.user_agent . |
request_id |
metadata.product_log_id : request_id |
Kolom request_id dipetakan ke metadata.product_log_id . |
request_method |
network.http.method : request_method |
Kolom request_method dipetakan ke network.http.method . |
response_headers.cache_control |
additional.fields[].key : "cache_control"additional.fields[].value.string_value : response_headers.cache_control |
Nilai response_headers.cache_control digunakan untuk mengisi array additional.fields dengan kunci "cache_control" dan nilai kolom response_headers.cache_control . |
response_headers.content_type |
additional.fields[].key : "content_type"additional.fields[].value.string_value : response_headers.content_type |
Nilai response_headers.content_type digunakan untuk mengisi array additional.fields dengan kunci "content_type" dan nilai kolom response_headers.content_type . |
response_state |
additional.fields[].key : "response_state"additional.fields[].value.string_value : response_state |
Nilai response_state digunakan untuk mengisi array additional.fields dengan kunci "response_state" dan nilai kolom response_state . |
response_status |
network.http.response_code : response_status |
Kolom response_status dipetakan ke network.http.response_code jika kolom status kosong. |
rule_id |
security_result.rule_id : rule_id |
Jika waf.rule_id kosong, nilai rule_id akan digunakan untuk mengisi security_result.rule_id . |
severity |
waf.severity : severity |
Nilai kolom severity disalin ke waf.severity . |
size_bytes.request_header |
network.sent_bytes : size_bytes.request_header |
Kolom size_bytes.request_header dipetakan ke network.sent_bytes . |
size_bytes.response_header |
network.received_bytes : size_bytes.response_header |
Kolom size_bytes.response_header dipetakan ke network.received_bytes . |
status |
network.http.response_code : status |
Kolom status dipetakan ke network.http.response_code . |
timestamp |
metadata.event_timestamp : timestamp |
Kolom timestamp diuraikan dan dipetakan ke metadata.event_timestamp . |
url |
target.url : url |
Kolom url dipetakan ke target.url . |
waf.blocked |
security_result.action : turunan |
Jika waf.blocked salah, security_result.action ditetapkan ke "ALLOW". Jika waf.blocked bernilai benar, security_result.action ditetapkan ke "BLOCK". |
waf.executed |
security_result.detection_fields[].key : "executed"security_result.detection_fields[].value : waf.executed |
Nilai waf.executed digunakan untuk mengisi array security_result.detection_fields dengan kunci "executed" dan nilai kolom waf.executed . |
waf.failures |
security_result.detection_fields[].key : "failures"security_result.detection_fields[].value : waf.failures |
Nilai waf.failures digunakan untuk mengisi array security_result.detection_fields dengan kunci "failures" dan nilai kolom waf.failures . |
waf.logged |
security_result.detection_fields[].key : "logged"security_result.detection_fields[].value : waf.logged |
Nilai waf.logged digunakan untuk mengisi array security_result.detection_fields dengan kunci "logged" dan nilai kolom waf.logged . |
waf.message |
metadata.description : waf.message |
Jika tidak kosong, waf.message akan dipetakan ke metadata.description . |
waf.rule_id |
security_result.rule_id : waf.rule_id |
Jika tidak kosong, waf.rule_id akan dipetakan ke security_result.rule_id . |
waf.score.anomaly |
security_result.detection_fields[].key : "anomaly"security_result.detection_fields[].value : waf.score.anomaly |
Jika waf.score.anomaly bukan 0 dan tidak kosong, nilai tersebut akan digunakan untuk mengisi array security_result.detection_fields dengan kunci "anomali" dan nilai kolom waf.score.anomaly . |
waf.score.http_violation |
security_result.detection_fields[].key : "http_violation"security_result.detection_fields[].value : waf.score.http_violation |
Jika waf.score.http_violation bukan 0 dan tidak kosong, nilai tersebut akan digunakan untuk mengisi array security_result.detection_fields . |
waf.score.lfi |
security_result.detection_fields[].key : "lfi"security_result.detection_fields[].value : waf.score.lfi |
Logika yang serupa dengan waf.score.http_violation . |
waf.score.php_injection |
security_result.detection_fields[].key : "php_injection"security_result.detection_fields[].value : waf.score.php_injection |
Logika yang serupa dengan waf.score.http_violation . |
waf.score.rce |
security_result.detection_fields[].key : "rce"security_result.detection_fields[].value : waf.score.rce |
Logika yang serupa dengan waf.score.http_violation . |
waf.score.rfi |
security_result.detection_fields[].key : "rfi"security_result.detection_fields[].value : waf.score.rfi |
Logika yang serupa dengan waf.score.http_violation . |
waf.score.session_fixation |
security_result.detection_fields[].key : "session_fixation"security_result.detection_fields[].value : waf.score.session_fixation |
Logika yang serupa dengan waf.score.http_violation . |
waf.score.sql_injection |
security_result.detection_fields[].key : "sql_injection"security_result.detection_fields[].value : waf.score.sql_injection |
Logika yang serupa dengan waf.score.http_violation . |
waf.score.xss |
security_result.detection_fields[].key : "xss"security_result.detection_fields[].value : waf.score.xss |
Logika yang serupa dengan waf.score.http_violation . |
waf.severity |
security_result.severity : turunansecurity_result.severity_details : waf.severity |
Jika waf.severity tidak kosong, nilai security_result.severity akan ditentukan berdasarkan rentang (<=3: TINGGI, >3 dan <=6: SEDANG, >6 dan <=8: RENDAH, jika tidak: UNKNOWN_SEVERITY). Nilai waf.severity asli juga dipetakan ke security_result.severity_details . |
waf_message |
metadata.description : waf_message |
Jika waf.message kosong dan waf_message tidak kosong, waf.message akan dipetakan ke metadata.description . Jika client_ip atau host dan fastly.server tidak kosong, metadata.event_type ditetapkan ke "NETWORK_HTTP". Jika client_ip atau host tidak kosong, metadata.event_type akan ditetapkan ke "STATUS_UPDATE". Jika tidak, nilai ini akan ditetapkan ke "GENERIC_EVENT". Nilai hardcode. Nilai hardcode. Nilai hardcode. |
Perubahan
2022-06-06
- Parser yang baru dibuat.