Mengumpulkan log HackerOne

Didukung di:

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

  1. Buka Setelan SIEM > Feed.
  2. Klik Tambahkan Feed Baru.
  3. Di halaman berikutnya, klik Konfigurasi satu feed.
  4. Di kolom Nama feed, masukkan nama untuk feed (misalnya, HackerOne Vulnerability Reports).
  5. Pilih Webhook sebagai Jenis sumber.
  6. Pilih HackerOne sebagai Jenis log.
  7. Klik Berikutnya.
  8. 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.
  9. Klik Berikutnya.
  10. 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:

  1. Di halaman detail feed, klik Buat Kunci Rahasia.
  2. Dialog akan menampilkan kunci rahasia.
  3. Salin dan simpan kunci rahasia dengan aman.

Mendapatkan URL endpoint feed

  1. Buka tab Detail untuk feed tersebut.
  2. Di bagian Endpoint Information, salin Feed endpoint URL.
  3. Format URL-nya adalah:

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    

    atau

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  4. Simpan URL ini untuk langkah berikutnya.

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

  1. Buka halaman Credentials Google Cloud Console.
  2. Pilih project Anda (project yang terkait dengan instance Chronicle Anda).
  3. Klik Create credentials > API key.
  4. Kunci API dibuat dan ditampilkan dalam dialog.
  5. Klik Edit API key untuk membatasi kunci.

Membatasi kunci API

  1. Di halaman setelan kunci API:
    • Name: Masukkan nama deskriptif (misalnya, Chronicle HackerOne Webhook API Key).
  2. Di bagian Pembatasan API:
    1. Pilih Restrict key.
    2. Di daftar Select APIs, telusuri dan pilih Google SecOps API (atau Chronicle API).
  3. Klik Simpan.
  4. Salin nilai kunci API dari kolom Kunci API di bagian atas halaman.
  5. 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

  1. Login ke HackerOne dan buka program Anda.
  2. Buka Interaksi, klik menu tiga titik untuk program yang ingin Anda konfigurasi, lalu klik Setelan.
  3. Buka Otomatisasi > Webhook.
  4. Klik Webhook baru.
  5. 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
  6. Klik Tambahkan webhook.

Menguji webhook

  1. Di halaman konfigurasi webhook, pilih Test request untuk mengirim contoh permintaan ke URL Payload yang dikonfigurasi.
  2. Verifikasi bahwa responsnya adalah HTTP 200.
  3. Periksa feed Chronicle untuk peristiwa pengujian dalam waktu 1 hingga 2 menit.

Memverifikasi bahwa webhook berfungsi

Memeriksa status webhook HackerOne

  1. Login ke konsol HackerOne.
  2. Buka Engagement, klik menu tiga titik untuk program Anda, lalu klik Setelan.
  3. Buka Otomatisasi > Webhook.
  4. Klik webhook Anda untuk melihat detailnya.
  5. Di bagian Pengiriman terbaru, pastikan pengiriman terbaru menampilkan status berhasil (HTTP 200).
  6. Klik pengiriman mana pun untuk melihat permintaan payload POST.

Memeriksa status feed Chronicle

  1. Buka SIEM Settings > Feeds di Chronicle.
  2. Temukan feed webhook HackerOne Anda.
  3. Periksa kolom Status (seharusnya Aktif).
  4. Periksa jumlah Peristiwa yang diterima (harus bertambah).
  5. Periksa stempel waktu Terakhir berhasil pada (seharusnya baru).

Memverifikasi log di Chronicle

  1. Buka Penelusuran > Penelusuran UDM.
  2. Gunakan kueri berikut:

    metadata.vendor_name = "HACKERONE" AND metadata.product_name = "HACKERONE"
    
  3. Sesuaikan rentang waktu ke 1 jam terakhir.

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

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