HackerOne のログを収集する

以下でサポートされています。

このドキュメントでは、Webhook を使用してログを Google Security Operations に push するように HackerOne を構成する方法について説明します。

HackerOne は、組織とセキュリティ研究者を結び付け、セキュリティの脆弱性を特定して修正するための脆弱性調整とバグ報奨金プラットフォームです。このプラットフォームは、バグ報奨金プログラム、脆弱性開示プログラム、ペンテスト、ソフトウェア開発ライフサイクル全体にわたる継続的なセキュリティ テストを提供します。

始める前に

次の前提条件を満たしていることを確認します。

  • Google SecOps インスタンス
  • Professional または Enterprise 階層の HackerOne プログラム(これらの階層でのみ webhook を利用可能)
  • HackerOne プログラム設定への管理者アクセス権

Google SecOps で Webhook フィードを作成する

フィードを作成する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [Add New Feed] をクリックします。
  3. 次のページで [単一のフィードを設定] をクリックします。
  4. [フィード名] フィールドに、フィードの名前を入力します(例: HackerOne Vulnerability Reports)。
  5. [Source type] として [Webhook] を選択します。
  6. [ログタイプ] として [HackerOne] を選択します。
  7. [次へ] をクリックします。
  8. 次の入力パラメータの値を指定します。
    • Split delimiter(省略可): 空白のままにします。各 Webhook リクエストには、単一の JSON イベントが含まれます。
    • アセットの名前空間: アセットの名前空間
    • Ingestion labels: このフィードのイベントに適用されるラベル。
  9. [次へ] をクリックします。
  10. [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。

秘密鍵を生成して保存する

フィードを作成したら、認証用のシークレット キーを生成する必要があります。

  1. フィードの詳細ページで、[シークレット キーを生成] をクリックします。
  2. ダイアログに秘密鍵が表示されます。
  3. 秘密鍵をコピーして安全に保存します。

フィード エンドポイントの URL を取得する

  1. フィードの [詳細] タブに移動します。
  2. [エンドポイント情報] セクションで、[フィード エンドポイント URL] をコピーします。
  3. URL の形式は次のとおりです。

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

    または

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  4. 次の手順で使用するため、この URL を保存します。

  5. [完了] をクリックします。

Google Cloud API キーを作成する

Chronicle では、認証に API キーが必要です。Google Cloud コンソールで制限付き API キーを作成します。

API キーを作成する

  1. Google Cloud コンソールの [認証情報] ページに移動します。
  2. プロジェクト(Chronicle インスタンスに関連付けられているプロジェクト)を選択します。
  3. [認証情報を作成> API キー] をクリックします。
  4. API キーが作成され、ダイアログに表示されます。
  5. [API キーを編集] をクリックして、キーを制限します。

API キーを制限する

  1. [API キー] 設定ページで、次の操作を行います。
    • 名前: わかりやすい名前を入力します(例: Chronicle HackerOne Webhook API Key)。
  2. [API の制限] で次の操作を行います。
    1. [キーを制限] を選択します。
    2. [API を選択] リストで、[Google SecOps API](または [Chronicle API])を検索して選択します。
  3. [保存] をクリックします。
  4. ページ上部の [API キー] フィールドから API キーの値をコピーします。
  5. API キーを安全に保存します。

HackerOne Webhook を構成する

Webhook URL を作成する

  • Chronicle エンドポイント URL と API キーを組み合わせます。

    <ENDPOINT_URL>?key=<API_KEY>
    
    • 例:

      https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
      

HackerOne で Webhook を作成する

  1. HackerOne にログインして、プログラムに移動します。
  2. [エンゲージメント] に移動し、設定するプログラムのケバブメニューをクリックして、[設定] をクリックします。
  3. [Automation] > [Webhooks] に移動します。
  4. [新しい Webhook] をクリックします。
  5. 次の構成の詳細を指定します。
    • ペイロード URL: 上記の API キーを含む完全なエンドポイント URL を貼り付けます。
    • Secret: Chronicle フィードの作成で生成されたシークレット キーを貼り付けます。
    • Webhook をトリガーするイベントを選択します: 次のいずれかを選択します。
      • Send me everything: すべてのイベントで Webhook がトリガーされます。
      • Let me specify individual events: Chronicle に送信する特定のイベントを選択します。セキュリティ モニタリングの推奨イベント:
        • report_created: ハッカーが新しい脆弱性レポートを送信したとき
        • report_triaged: レポートがトリアージされたとき
        • report_resolved: レポートが解決されたとき
        • report_bounty_awarded: 報奨金が授与された場合
        • report_swag_awarded: スワッグが贈られたとき
        • program_hacker_joined: ハッカーがプログラムに参加したとき
        • program_hacker_left: ハッカーがプログラムを離脱した場合
  6. [Add webhook] をクリックします。

Webhook をテストする

  1. Webhook の構成ページで、[テスト リクエスト] を選択して、構成されたペイロード URL にリクエストの例を送信します。
  2. レスポンスが HTTP 200 であることを確認します。
  3. 1 ~ 2 分以内に Chronicle フィードでテストイベントを確認します。

Webhook が機能していることを確認する

HackerOne ウェブフックのステータスを確認する

  1. HackerOne コンソールにログインします。
  2. [エンゲージメント] に移動し、プログラムのケバブメニューをクリックして、[設定] をクリックします。
  3. [Automation] > [Webhooks] に移動します。
  4. Webhook をクリックして詳細を表示します。
  5. [Recent deliveries] セクションで、最近の配信が成功ステータス(HTTP 200)で表示されていることを確認します。
  6. 配信をクリックすると、POST ペイロード リクエストが表示されます。

Chronicle フィードのステータスを確認する

  1. Chronicle の [SIEM 設定] > [フィード] に移動します。
  2. HackerOne の Webhook フィードを見つけます。
  3. [ステータス] 列を確認します([有効] になっているはずです)。
  4. [Events received] のカウントを確認します(増加しているはずです)。
  5. [Last succeeded on](最後に成功した日時)のタイムスタンプを確認します(最新である必要があります)。

Chronicle でログを確認する

  1. [検索> UDM 検索] に移動します。
  2. 次のクエリを使用してください。

    metadata.vendor_name = "HACKERONE" AND metadata.product_name = "HACKERONE"
    
  3. 期間を過去 1 時間に調整します。

  4. 結果にイベントが表示されることを確認します。

認証方法のリファレンス

Chronicle ウェブフック フィードは、複数の認証方法をサポートしています。HackerOne ウェブフックは、クエリ パラメータと署名検証を組み合わせて使用します。

HackerOne は、構成されたペイロード URL に Webhook を送信します。認証は次の方法で処理されます。

  • URL 内の API キー: Chronicle API キーがペイロード URL にクエリ パラメータとして追加されます。
  • シークレット署名の検証: HackerOne は、構成されたシークレットで署名されたリクエスト本文の HMAC SHA256 hexdigest を含む X-H1-Signature ヘッダーを生成します。

    • URL 形式:

      <ENDPOINT_URL>?key=<API_KEY>
      
    • リクエストの形式:

      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": {...}
        }
      }
      
  • メリット:

    • 二重認証: Chronicle アクセス用の API キーとペイロード検証用の署名
    • HackerOne には署名生成機能が組み込まれています
    • 安全なペイロードの完全性検証

署名の検証

  • HackerOne は、各 Webhook リクエストに次のヘッダーを含めます。

    • X-H1-Signature: リクエスト本文の HMAC SHA256 16 進ダイジェスト(形式: sha256=<hexdigest>
    • X-H1-Event: Webhook をトリガーしたイベントタイプ
    • X-H1-Delivery: 配達の一意の識別子
  • 受信側エンドポイントの署名を検証するには:

    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)
    

Webhook イベントタイプ

HackerOne は、次の Webhook イベントタイプをサポートしています。

イベントタイプ 説明
report_created ハッカーが新しい脆弱性レポートを送信したときにトリガーされます
report_triaged レポートがトリアージされたときにトリガーされます
report_resolved レポートが解決されたときにトリガーされます
report_bounty_awarded レポートに対して報奨金が授与されたときにトリガーされます
report_swag_awarded レポートに対してグッズが贈られたときにトリガーされます
report_became_public レポートが公開されたときにトリガーされます
program_hacker_joined ハッカーがプログラムに参加したときにトリガーされます
program_hacker_left ハッカーがプログラムを離脱したときにトリガーされます

UDM マッピング テーブル

ログフィールド UDM マッピング ロジック
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 Key-Value ラベルとして統合
timestamp metadata.event_timestamp yyyy-MM-dd'T'HH:mm:ss.SSSZ 形式の日付フィルタを使用して解析されます
metadata.event_type has_principal が true の場合は「STATUS_UPDATE」、has_principal_user_user が true の場合は「USER_UNCATEGORIZED」、それ以外の場合は「GENERIC_EVENT」に設定します。
id metadata.product_log_id 値を直接コピー
relationships.structured_scope.data.attributes.asset_identifier principal.asset.asset_id 「ASSET:」の接頭辞が付いています。
attributes.email_alias principal.user.email_addresses 統合済み
relationships.reporter.data.id principal.user.employee_id 値を直接コピー
relationships.reporter.data.attributes.name principal.user.first_name 値を直接コピー
attributes.username、relationships.reporter.data.attributes.username principal.user.user_display_name relationships.reporter.data.attributes.username が空でない場合はその値、それ以外の場合は attributes.username
relationships.severity.data.attributes.user_id principal.user.userid 値を直接コピー
relationships.severity.data.id security_result.rule_id 値を直接コピー
relationships.severity.data.attributes.max_severity security_result.severity 大文字に変換
attributes.vulnerability_information security_result.summary 値を直接コピー

さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。