Mengumpulkan log HackerOne
Dokumen ini menjelaskan cara mengonfigurasi HackerOne untuk mengirimkan log ke Google Security Operations menggunakan webhook.
HackerOne adalah platform koordinasi kerentanan dan program penemuan bug yang menghubungkan organisasi dengan peneliti keamanan untuk mengidentifikasi dan memperbaiki kerentanan keamanan. Platform ini menyediakan program bug bounty, program pengungkapan kerentanan, pengujian penetrasi, dan pengujian keamanan berkelanjutan di seluruh siklus proses pengembangan software.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps
- Program HackerOne dengan tingkat Profesional atau Enterprise (webhook hanya tersedia untuk tingkat ini)
- Akses administratif ke setelan program HackerOne Anda
Membuat feed webhook di Google SecOps
Buat feed
- Buka Setelan SIEM > Feed.
- Klik Tambahkan Feed Baru.
- Di halaman berikutnya, klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
HackerOne Vulnerability Reports). - Pilih Webhook sebagai Jenis sumber.
- Pilih HackerOne sebagai Jenis log.
- Klik Berikutnya.
- Tentukan nilai untuk parameter input berikut:
- Pemisah pemisahan (opsional): Biarkan kosong. Setiap permintaan webhook berisi satu peristiwa JSON.
- Namespace aset: Namespace aset.
- Label penyerapan: Label yang akan diterapkan ke peristiwa dari feed ini.
- Klik Berikutnya.
- Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.
Buat dan simpan kunci rahasia
Setelah membuat feed, Anda harus membuat kunci rahasia untuk autentikasi:
- Di halaman detail feed, klik Buat Kunci Rahasia.
- Dialog akan menampilkan kunci rahasia.
- Salin dan simpan kunci rahasia dengan aman.
Mendapatkan URL endpoint feed
- Buka tab Detail untuk feed tersebut.
- Di bagian Endpoint Information, salin Feed endpoint URL.
Format URL-nya adalah:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateatau
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateSimpan URL ini untuk langkah berikutnya.
Klik Done.
Buat kunci Google Cloud API
Chronicle memerlukan kunci API untuk autentikasi. Buat kunci API yang dibatasi di Konsol Google Cloud.
Buat kunci API
- Buka halaman Credentials Google Cloud Console.
- Pilih project Anda (project yang terkait dengan instance Chronicle Anda).
- Klik Create credentials > API key.
- Kunci API dibuat dan ditampilkan dalam dialog.
- Klik Edit API key untuk membatasi kunci.
Membatasi kunci API
- Di halaman setelan kunci API:
- Name: Masukkan nama deskriptif (misalnya,
Chronicle HackerOne Webhook API Key).
- Name: Masukkan nama deskriptif (misalnya,
- Di bagian Pembatasan API:
- Pilih Restrict key.
- Di daftar Select APIs, telusuri dan pilih Google SecOps API (atau Chronicle API).
- Klik Simpan.
- Salin nilai kunci API dari kolom Kunci API di bagian atas halaman.
Simpan kunci API dengan aman.
Mengonfigurasi webhook HackerOne
Buat URL webhook
Gabungkan URL endpoint Chronicle dan kunci API:
<ENDPOINT_URL>?key=<API_KEY>Contoh:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
Membuat webhook di HackerOne
- Login ke HackerOne dan buka program Anda.
- Buka Interaksi, klik menu tiga titik untuk program yang ingin Anda konfigurasi, lalu klik Setelan.
- Buka Otomatisasi > Webhook.
- Klik Webhook baru.
- Berikan detail konfigurasi berikut:
- URL Payload: Tempel URL endpoint lengkap dengan kunci API dari atas.
- Secret: Tempelkan kunci rahasia dari pembuatan feed Chronicle.
- Pilih peristiwa yang ingin Anda gunakan untuk memicu webhook: Pilih salah satu opsi berikut:
- Kirimkan semuanya kepada saya: Semua peristiwa akan memicu webhook.
- Izinkan saya menentukan peristiwa satu per satu: Pilih peristiwa tertentu yang ingin Anda kirim ke Chronicle. Peristiwa yang direkomendasikan untuk pemantauan keamanan:
- report_created: Saat peretas mengirimkan laporan kerentanan baru
- report_triaged: Saat laporan telah di-triage
- report_resolved: Saat laporan diselesaikan
- report_bounty_awarded: Saat hadiah diberikan
- report_swag_awarded: Saat merchandise diberikan
- program_hacker_joined: Saat peretas bergabung dalam program
- program_hacker_left: Saat peretas keluar dari program
- Klik Tambahkan webhook.
Menguji webhook
- Di halaman konfigurasi webhook, pilih Test request untuk mengirim contoh permintaan ke URL Payload yang dikonfigurasi.
- Verifikasi bahwa responsnya adalah HTTP 200.
- Periksa feed Chronicle untuk peristiwa pengujian dalam waktu 1 hingga 2 menit.
Memverifikasi bahwa webhook berfungsi
Memeriksa status webhook HackerOne
- Login ke konsol HackerOne.
- Buka Engagement, klik menu tiga titik untuk program Anda, lalu klik Setelan.
- Buka Otomatisasi > Webhook.
- Klik webhook Anda untuk melihat detailnya.
- Di bagian Pengiriman terbaru, pastikan pengiriman terbaru menampilkan status berhasil (HTTP 200).
- Klik pengiriman mana pun untuk melihat permintaan payload POST.
Memeriksa status feed Chronicle
- Buka SIEM Settings > Feeds di Chronicle.
- Temukan feed webhook HackerOne Anda.
- Periksa kolom Status (seharusnya Aktif).
- Periksa jumlah Peristiwa yang diterima (harus bertambah).
- Periksa stempel waktu Terakhir berhasil pada (seharusnya baru).
Memverifikasi log di Chronicle
- Buka Penelusuran > Penelusuran UDM.
Gunakan kueri berikut:
metadata.vendor_name = "HACKERONE" AND metadata.product_name = "HACKERONE"Sesuaikan rentang waktu ke 1 jam terakhir.
Pastikan peristiwa muncul di hasil.
Referensi metode autentikasi
Feed webhook Chronicle mendukung beberapa metode autentikasi. Webhook HackerOne menggunakan kombinasi parameter kueri dan validasi tanda tangan.
Metode 1: Parameter kueri dengan validasi tanda tangan (Direkomendasikan untuk HackerOne)
HackerOne mengirim webhook ke URL Payload yang dikonfigurasi. Autentikasi ditangani melalui:
- Kunci API di URL: Kunci Chronicle API ditambahkan sebagai parameter kueri ke URL Payload.
Validasi tanda tangan rahasia: HackerOne membuat header X-H1-Signature yang berisi hexdigest HMAC SHA256 dari isi permintaan yang ditandatangani dengan rahasia yang dikonfigurasi.
Format URL:
<ENDPOINT_URL>?key=<API_KEY>Format permintaan:
POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1 Content-Type: application/json X-H1-Signature: sha256=<HMAC_HEXDIGEST> X-H1-Event: <EVENT_TYPE> X-H1-Delivery: <DELIVERY_ID> { "data": { "activity": {...}, "report": {...} } }
Kelebihan:
- Autentikasi ganda: Kunci API untuk akses Chronicle dan tanda tangan untuk validasi payload
- HackerOne menyediakan pembuatan tanda tangan bawaan
- Verifikasi integritas payload yang aman
Validasi tanda tangan
HackerOne menyertakan header berikut dengan setiap permintaan webhook:
- X-H1-Signature: hexdigest HMAC SHA256 dari isi permintaan (format:
sha256=<hexdigest>) - X-H1-Event: Jenis peristiwa yang memicu webhook
- X-H1-Delivery: ID unik untuk pengiriman
- X-H1-Signature: hexdigest HMAC SHA256 dari isi permintaan (format:
Untuk memvalidasi tanda tangan di endpoint penerima:
import hmac import hashlib def validate_request(request_body, secret, signature): _, digest = signature.split('=') generated_digest = hmac.new( secret.encode(), request_body.encode(), hashlib.sha256 ).hexdigest() return hmac.compare_digest(digest, generated_digest)
Jenis peristiwa webhook
HackerOne mendukung jenis peristiwa webhook berikut:
| Jenis Peristiwa | Deskripsi |
|---|---|
| report_created | Dipicu saat peretas mengirimkan laporan kerentanan baru |
| report_triaged | Dipicu saat laporan diseleksi |
| report_resolved | Dipicu saat laporan diselesaikan |
| report_bounty_awarded | Dipicu saat hadiah diberikan untuk laporan |
| report_swag_awarded | Dipicu saat suvenir diberikan untuk laporan |
| report_became_public | Dipicu saat laporan menjadi publik |
| program_hacker_joined | Dipicu saat peretas bergabung dengan program |
| program_hacker_left | Dipicu saat peretas keluar dari program |
Tabel pemetaan UDM
| Kolom Log | Pemetaan UDM | Logika |
|---|---|---|
| attributes.cleared, attributes.rules_of_engagement_signed, attributes.identity_verified, attributes.background_checked, attributes.citizenship_verified, attributes.residency_verified, type, attributes.title, attributes.main_state, attributes.state, relationships.reporter.data.type, relationships.reporter.data.attributes.reputation, relationships.reporter.data.attributes.signal, relationships.reporter.data.attributes.impact, relationships.reporter.data.attributes.disabled, relationships.reporter.data.attributes.profile_picture.62x62, relationships.reporter.data.attributes.profile_picture.82x82, relationships.reporter.data.attributes.profile_picture.110x110, relationships.reporter.data.attributes.profile_picture.260x260, relationships.reporter.data.attributes.hackerone_triager, relationships.program.data.id, relationships.program.data.type, relationships.program.data.attributes.handle, relationships.severity.data.type, relationships.severity.data.attributes.rating, relationships.severity.data.attributes.author_type, relationships.severity.data.attributes.calculation_method, relationships.weakness.data.id, relationships.weakness.data.type, relationships.weakness.data.attributes.name, relationships.weakness.data.attributes.description, relationships.weakness.data.attributes.external_id, relationships.structured_scope.data.id, relationships.structured_scope.data.type, relationships.structured_scope.data.attributes.asset_type, relationships.structured_scope.data.attributes.eligible_for_bounty, relationships.structured_scope.data.attributes.eligible_for_submission, relationships.structured_scope.data.attributes.instruction, relationships.structured_scope.data.attributes.max_severity, relationships.structured_scope.data.attributes.confidentiality_requirement, relationships.structured_scope.data.attributes.integrity_requirement, relationships.structured_scope.data.attributes.availability_requirement, relationships.inboxes.data.id, relationships.inboxes.data.type, relationships.inboxes.data.attributes.name, relationships.inboxes.data.attributes.type | additional.fields | Digabungkan sebagai label nilai kunci |
| timestamp | metadata.event_timestamp | Diuraikan menggunakan filter tanggal dengan format yyyy-MM-dd'T'HH:mm:ss.SSSZ |
| metadata.event_type | Disetel ke "STATUS_UPDATE" jika has_principal benar, "USER_UNCATEGORIZED" jika has_principal_user_user benar, atau "GENERIC_EVENT" | |
| id | metadata.product_log_id | Nilai disalin secara langsung |
| relationships.structured_scope.data.attributes.asset_identifier | principal.asset.asset_id | Diawali dengan "ASSET:" |
| attributes.email_alias | principal.user.email_addresses | Digabung |
| relationships.reporter.data.id | principal.user.employee_id | Nilai disalin secara langsung |
| relationships.reporter.data.attributes.name | principal.user.first_name | Nilai disalin secara langsung |
| attributes.username, relationships.reporter.data.attributes.username | principal.user.user_display_name | Nilai dari relationships.reporter.data.attributes.username jika tidak kosong, atau attributes.username |
| relationships.severity.data.attributes.user_id | principal.user.userid | Nilai disalin secara langsung |
| relationships.severity.data.id | security_result.rule_id | Nilai disalin secara langsung |
| relationships.severity.data.attributes.max_severity | security_result.severity | Dikonversi menjadi huruf besar |
| attributes.vulnerability_information | security_result.summary | Nilai disalin secara langsung |
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.