Mengumpulkan log AWS WAF
Dokumen ini menjelaskan cara mengumpulkan log AWS Web Application Firewall (WAF) dengan menyiapkan feed Google Security Operations. Parser mengubah log berformat JSON mentah menjadi format terstruktur yang sesuai dengan UDM Google SecOps. Alat ini mengekstrak kolom seperti alamat IP, URL, agen pengguna, dan detail aturan keamanan, serta memetakan kolom tersebut ke kolom UDM yang sesuai untuk representasi dan analisis yang konsisten.
Sebelum memulai
- Pastikan Anda memiliki instance Google Chronicle.
- Pastikan Anda memiliki akses dengan hak istimewa ke AWS.
Mengonfigurasi bucket Amazon S3
- Buat bucket Amazon S3 dengan mengikuti panduan pengguna ini: Membuat bucket
- Simpan Nama dan Region bucket untuk digunakan nanti.
- Buat pengguna dengan mengikuti panduan pengguna ini: Membuat pengguna IAM.
- Pilih Pengguna yang dibuat.
- Pilih tab Kredensial keamanan.
- Klik Create Access Key di bagian Access Keys.
- Pilih Layanan pihak ketiga sebagai Kasus penggunaan.
- Klik Berikutnya.
- Opsional: tambahkan tag deskripsi.
- Klik Create access key.
- Klik Download file CSV untuk menyimpan Kunci Akses dan Kunci Akses Rahasia untuk digunakan nanti.
- Klik Selesai.
- Pilih tab Izin.
- Klik Tambahkan izin di bagian Kebijakan izin.
- Pilih Tambahkan izin.
- Pilih Lampirkan kebijakan secara langsung.
- Telusuri dan pilih kebijakan AmazonS3FullAccess.
- Klik Berikutnya.
- Klik Tambahkan izin.
Membuat ACL (Daftar Kontrol Akses) web WAF
Jika belum menyiapkan AWS WAF, Anda harus membuat ACL web (Daftar Kontrol Akses) WAF. Untuk penyiapan yang sudah ada, Anda dapat langsung ke prosedur berikutnya.
- Di AWS Console, telusuri dan pilih AWS WAF & Shield.
- Klik Create web ACL.
- Berikan setelan berikut:
- Nama: beri nama ACL (misalnya,
my-waf-web-acl
). - Region: pilih region tempat Anda ingin menerapkan WAF.
- Metrik CloudWatch: mengaktifkan pengumpulan metrik untuk melacak aktivitas dan aturan yang dipicu.
- Nama: beri nama ACL (misalnya,
- Setelah dibuat, pilih ACL web yang ingin Anda aktifkan logging-nya.
Mengonfigurasi Logging AWS WAF
- Di AWS WAF Console, buka tab Logging di ACL web Anda.
- Klik Aktifkan Logging.
- Pilih Amazon S3 sebagai tujuan untuk log Anda.
- Pilih bucket S3 yang dibuat sebelumnya untuk menyimpan log.
- Opsional: konfigurasikan awalan log untuk mengatur log (misalnya,
waf-logs/
). - Klik Simpan.
Memverifikasi Izin untuk Bucket S3
Pastikan bucket S3 memiliki izin yang tepat agar AWS WAF dapat menulis log.
- Buka Konsol S3.
- Pilih bucket tempat log akan disimpan.
Di tab Permissions, tambahkan Kebijakan Bucket berikut untuk mengizinkan AWS WAF menulis log:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "wafv2.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-log-bucket-name/*" } ] }
- Klik Simpan.
Mengonfigurasi feed di Google SecOps untuk menyerap log AWS WAF
- Buka Setelan SIEM > Feed.
- Klik Tambahkan baru.
- Di kolom Feed name, masukkan nama untuk feed (misalnya, AWS WAF Logs).
- Pilih Amazon S3 sebagai Source type.
- Pilih AWS WAF sebagai Jenis log.
- Klik Berikutnya.
Tentukan nilai untuk parameter input berikut:
- Region: region tempat bucket Amazon S3 berada.
- S3 URI: URI bucket.
s3://your-log-bucket-name/waf-logs/
- Ganti kode berikut:
your-log-bucket-name
: nama sebenarnya dari bucket.
- Ganti kode berikut:
- URI adalah: pilih Direktori atau Direktori yang menyertakan subdirektori.
- Opsi penghapusan sumber: pilih opsi penghapusan sesuai preferensi Anda.
- Access Key ID: Kunci akses pengguna dengan akses ke bucket S3.
- Kunci Akses Rahasia: kunci rahasia Pengguna dengan akses ke bucket S3.
- Namespace aset: namespace aset.
- Label penyerapan: label yang akan diterapkan ke peristiwa dari feed ini.
Klik Berikutnya.
Tinjau konfigurasi feed baru Anda di layar Finalize, lalu klik Submit.
Tabel Pemetaan UDM
Kolom log | Pemetaan UDM | Logika |
---|---|---|
action | security_result.action | Jika tindakannya adalah ALLOW, tetapkan security_result.action ke ALLOW dan security_result.severity ke INFORMATIONAL. Jika tindakannya adalah BLOCK, tetapkan security_result.action ke BLOCK. Jika tindakan adalah CAPTCHA dan captchaResponse.responseCode adalah 405, tetapkan security_result.action ke BLOCK dan security_result.action_details ke "CAPTCHA {captchaResponse.failureReason}". |
captchaResponse.failureReason | security_result.action_details | Digunakan bersama dengan action dan captchaResponse.responseCode untuk menentukan security_result.action_details. |
captchaResponse.responseCode | security_result.action_details | Digunakan bersama dengan action dan captchaResponse.failureReason untuk menentukan security_result.action_details. |
httpRequest.clientIp | principal.ip, principal.asset.ip | Dipetakan langsung ke principal.ip dan principal.asset.ip. |
httpRequest.headers | target.hostname, target.asset.hostname, network.http.user_agent, network.http.parsed_user_agent, network.http.referral_url, target.location.country_or_region, target.resource.attribute.labels, target.user.userid | Melakukan iterasi melalui setiap header di httpRequest.headers. Jika nama header adalah "host" atau "Host", nilai akan dipetakan ke target.hostname dan target.asset.hostname. Jika nama headernya adalah "User-Agent" atau "user-agent", nilainya akan dipetakan ke network.http.user_agent dan diuraikan menjadi network.http.parsed_user_agent. Jika nama headernya adalah "Referer" atau "referer", nilainya akan dipetakan ke network.http.referral_url. Jika nama headernya adalah "(?i)time-zone", nilainya akan dipetakan ke target.location.country_or_region. Jika nama headernya adalah "authorization", nilainya akan didekode dan nama pengguna diekstrak serta dipetakan ke target.user.userid. Semua header lainnya ditambahkan sebagai pasangan nilai kunci ke target.resource.attribute.labels. |
httpRequest.httpMethod | network.http.method | Dipetakan langsung ke network.http.method. |
httpRequest.requestId | network.session_id | Dipetakan langsung ke network.session_id. |
httpRequest.uri | target.url | Dipetakan langsung ke target.url. |
httpSourceId | target.resource.name | Dipetakan langsung ke target.resource.name. |
httpSourceName | metadata.product_event_type | Dipetakan langsung ke metadata.product_event_type. |
label | security_result.rule_labels | Melakukan iterasi pada setiap label dalam label. Jika nama label tidak kosong, nama tersebut akan ditambahkan sebagai pasangan nilai kunci ke security_result.rule_labels. |
nonTerminatingMatchingRules | security_result.action_details, security_result.rule_labels | Melakukan iterasi melalui setiap aturan di nonTerminatingMatchingRules. Jika tindakannya adalah ALLOW dan tindakan aturannya adalah CAPTCHA, tetapkan security_result.action_details ke "CAPTCHA SUCCESSFUL" dan tambahkan ID aturan ke security_result.rule_labels dengan kunci "nonTerminatingCaptchaRuleName". Jika tindakannya adalah BLOCK atau ALLOW dan tindakan aturannya adalah COUNT, tetapkan security_result.action_details ke "COUNT RULE" dan tambahkan ID aturan ke security_result.rule_labels dengan kunci "nonTerminatingCountRuleName". Jika tindakannya adalah BLOCK atau ALLOW dan tindakan aturannya adalah CHALLENGE, tetapkan security_result.action_details ke "COUNT RULE" dan tambahkan ID aturan ke security_result.rule_labels dengan kunci "nonTerminatingChallengeRuleName". |
rateBasedRuleList | security_result.rule_id, security_result.rule_name, security_result.description | Jika terminatingRuleType adalah "RATE_BASED", ulangi setiap aturan dalam rateBasedRuleList. Jika terminatingRuleId cocok dengan nama aturan, ID aturan, nama aturan, dan deskripsi akan dipetakan ke security_result.rule_id, security_result.rule_name, dan security_result.description. |
responseCodeSent | network.http.response_code | Langsung dipetakan ke network.http.response_code dan dikonversi menjadi bilangan bulat. |
ruleGroupList | intermediary.labels, security_result.rule_id, security_result.rule_name, security_result.description, security_result.detection_fields | Melakukan iterasi melalui setiap grup aturan di ruleGroupList. ID grup aturan ditambahkan sebagai pasangan nilai kunci ke intermediary.labels. Jika terminatingRuleType adalah "MANAGED_RULE_GROUP" dan terminatingRuleId cocok dengan ID grup aturan, ID aturan, nama aturan, dan deskripsi akan dipetakan ke security_result.rule_id, security_result.rule_name, dan security_result.description. Jika terminatingRuleType adalah "GROUP", ID aturan penghentian akan diekstrak dan dipetakan ke security_result.rule_name dan security_result.description. ID grup aturan penghentian ditambahkan ke security_result.rule_labels dengan kunci "terminatingRuleGroupName". Jika terminatingRuleType adalah "REGULAR", tindakan aturan penghentian diekstrak dan ditambahkan ke kolom security_result.detectiondengan kunci "terminatingRuleAction{index}". |
terminatingRuleId | security_result.rule_id, security_result.rule_name, security_result.description | Jika terminatingRuleType adalah "RATE_BASED", "MANAGED_RULE_GROUP", atau "REGULAR", terminatingRuleId akan dipetakan ke security_result.rule_id, security_result.rule_name, dan digunakan untuk membuat security_result.description. |
terminatingRuleMatchDetails | security_result.description, security_result.category_details, security_result.detection_fields | Melakukan iterasi melalui setiap kecocokan di terminatingRuleMatchDetails. Menetapkan security_result.description ke "Terminating Rule". Jika tidak kosong, jenis kondisi akan ditambahkan ke security_result.category_details. Jika tidak kosong, lokasi akan ditambahkan ke security_result.detection_fields dengan kunci "location". Untuk setiap elemen data yang cocok, elemen tersebut akan ditambahkan ke security_result.detection_fields dengan kunci "matchedData". |
terminatingRuleType | security_result.rule_type | Dipetakan langsung ke security_result.rule_type. |
timestamp | metadata.event_timestamp | Dikonversi menjadi stempel waktu dan dipetakan ke metadata.event_timestamp. |
webaclId | intermediary.resource.name | Dipetakan langsung ke intermediary.resource.name. |
metadata.vendor_name | Tetapkan ke "AMAZON". | |
metadata.product_name | Tetapkan ke "AWS Web Application Firewall". | |
metadata.log_type | Tetapkan ke "AWS_WAF". | |
network.application_protocol | Tetapkan ke "HTTP". | |
metadata.event_type | Tetapkan ke "NETWORK_HTTP" jika httpRequest.headers berisi header "host" atau "Host". Jika tidak, tetapkan ke "STATUS_UPDATE". |
Perubahan
2024-03-14
- Peningkatan penanganan karakter escape yang tidak valid dalam pesan log untuk memastikan pemformatan JSON yang tepat.
2023-12-29
- Menstandarkan pemetaan informasi "agen pengguna" ke kolom UDM yang sesuai.
- Mengekstrak ID pengguna dari header "authorization" dalam permintaan HTTP.
2023-12-08
- Memperbaiki beberapa bug terkait pemetaan nama host, ekstraksi URL target, dan pemrosesan aturan.
- Peningkatan penanganan error di bagian tertentu dari parser.
2023-12-11
- Menambahkan dukungan untuk format log baru dengan memperkenalkan pola Grok baru.
2023-08-16
- Meningkatkan pemetaan tindakan aturan keamanan ke kolom UDM untuk kolom deteksi.
2022-12-16
- Mengoptimalkan logika pemfilteran tanggal dan meningkatkan penanganan data JSON yang tidak valid.
- Informasi agen pengguna yang dipetakan dari header HTTP ke kolom UDM khusus.
2022-12-11
- Menghapus logika yang tidak perlu untuk menangani log pesan CSV dan SYSLOG.
2022-07-22
- Ini menandai pembuatan awal parser.
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.