Mengumpulkan log WAF Fastly

Didukung di:

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

  1. Buka Setelan SIEM > Feed.
  2. Klik Tambahkan baru.
  3. Di kolom Feed name, masukkan nama untuk feed (misalnya, Fastly WAF Logs).
  4. Pilih Webhook sebagai Jenis sumber.
  5. Pilih Fastly WAF sebagai Jenis log.
  6. Klik Berikutnya.
  7. 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.
  8. Klik Berikutnya.
  9. Tinjau konfigurasi feed di layar Finalize, lalu klik Submit.
  10. Klik Buat Kunci Rahasia untuk membuat kunci rahasia guna mengautentikasi feed ini.
  11. 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.
  12. Di tab Detail, salin URL endpoint feed dari kolom Endpoint Information. Anda perlu menentukan URL endpoint ini di aplikasi klien.
  13. Klik Done.

Membuat kunci API untuk feed webhook

  1. Buka Konsol Google Cloud > Kredensial.

    Buka Kredensial

  2. Klik Create credentials, lalu pilih API key.

  3. Batasi akses kunci API ke Google Security Operations API.

Menentukan URL endpoint

  1. Di aplikasi klien, tentukan URL endpoint HTTPS yang diberikan di feed webhook.
  2. 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.

  3. 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

  1. Login ke Fastly.
  2. Opsional: Pilih situs di menu Situs (jika Anda memiliki lebih dari satu situs).
  3. Pilih Kelola > Integrasi Situs.
  4. Klik Tambahkan integrasi situs.
  5. Pilih Webhook Generik.
  6. Webhook URL: masukkan ENDPOINT_URL Google SecOps, diikuti dengan API_KEY dan SECRET.
  7. Penempatan Notifikasi: pilih Semua aktivitas atau Aktivitas tertentu.
  8. Opsional: Jika Anda memilih Aktivitas tertentu, buka Menu aktivitas dan pilih jenis aktivitas yang ingin dikirim webhook.
  9. 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: turunan
security_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.