HackerOne ログを収集する
このドキュメントでは、Webhook を使用してログを Google Security Operations に push するように HackerOne を構成する方法について説明します。
HackerOne は、脆弱性の調整とバグ報奨金プラットフォームであり、組織とセキュリティ研究者を結び付けてセキュリティの脆弱性を特定し、修正します。このプラットフォームは、バグ報奨金プログラム、脆弱性開示プログラム、ペンテスト、ソフトウェア開発ライフサイクル全体にわたる継続的なセキュリティ テストを提供します。
始める前に
次の前提条件を満たしていることを確認してください。
Google SecOps インスタンス
Professional または Enterprise 階層の HackerOne プログラム(Webhook はこれらの階層でのみ使用できます)
HackerOne プログラム設定に対する管理者権限
Google Cloud コンソールへのアクセス(API キーの作成用)
Google SecOps で Webhook フィードを作成する
フィードを作成する
- [SIEM 設定] > [フィード] に移動します。
- [新しいフィードを追加] をクリックします。
- 次のページで、[単一フィードを構成する] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
HackerOne Webhook)。 - [ソースタイプ] として [Webhook] を選択します。
- [ログタイプ] として [HackerOne] を選択します。
- [次へ] をクリックします。
- 次の入力パラメータの値を指定します。
- Split delimiter: 空のままにします。各 Webhook リクエストには、単一の JSON イベントが含まれています。
- Asset namespace: アセットの名前空間
- 取り込みラベル: このフィードのイベントに適用されるラベル
- [次へ] をクリックします。
- [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
秘密鍵を生成して保存する
フィードを作成したら、認証用の秘密鍵を生成する必要があります。
- フィードの詳細ページで、[シークレット キーを生成する] をクリックします。
- ダイアログに秘密鍵が表示されます。
- 秘密鍵をコピーして安全に保存 します。
重要: 秘密鍵は一度しか表示されず、後で取得することはできません。紛失した場合は、新しい秘密鍵を生成する必要があります。
フィード エンドポイント URL を取得する
- フィードの [詳細] タブに移動します。
- [エンドポイント情報] セクションで、フィード エンドポイント URL をコピーします。
URL の形式は次のとおりです。
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateまたはリージョン エンドポイントの場合:
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate次の手順で使用するため、この URL を保存します。
[完了] をクリックします。
Google Cloud API キーを作成する
Chronicle では、認証に API キーが必要です。Google Cloud コンソールで制限付き API キーを作成します。
API キーを作成する
- [Google Cloud コンソール認証情報] ページに移動します。
- プロジェクト(Google SecOps インスタンスに関連付けられているプロジェクト)を選択します。
- [認証情報を作成] > [API キー] をクリックします。
- API キーが作成され、ダイアログに表示されます。
- [API キーを編集] をクリックして、キーを制限します。
API キーを制限する
- [API キー] 設定ページで、次の操作を行います。
- 名前: わかりやすい名前を入力します(例:
Chronicle HackerOne Webhook API Key)。
- 名前: わかりやすい名前を入力します(例:
- [API の制限]:
- [キーを制限] を選択します。
- [API の選択] プルダウンで [Google SecOps API](または [Chronicle API])を検索して選択します。
- [保存] をクリックします。
- ページ上部の [API キー] フィールドから API キーの値をコピー します。
API キーを安全に保存します。
HackerOne Webhook を構成する
Webhook URL を作成する
Google SecOps エンドポイント URL、API キー、秘密鍵を 1 つの URL に結合します。API キーと秘密鍵の両方をクエリ パラメータとして追加する必要があります。
URL 形式:
```none
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
```
例:
```none
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
```
以下を置き換えます:
- <ENDPOINT_URL>: [フィード エンドポイント URL を取得する] セクションのフィード エンドポイント URL。
- <API_KEY>: [**Google Cloud API キーを作成する**] セクションの Google Cloud API キー。- <SECRET_KEY>: [秘密鍵を生成して保存する] セクションの秘密鍵。
重要: Google SecOps の秘密鍵を HackerOne の [Secret] フィールドに入力しないでください。HackerOne の [Secret] フィールドは、HMAC ペイロード署名検証(X-H1-Signature ヘッダー)に使用されます。これは、Google SecOps Webhook 認証とは別のメカニズムです。Google SecOps の秘密鍵を HackerOne の [Secret] フィールドに配置すると、HackerOne がその値を Google SecOps 認証情報として渡さないため、403 Forbidden エラーが発生します。代わりに、key と secret の両方をクエリ パラメータとして [ペイロード URL] に追加します。
HackerOne で Webhook を作成する
- HackerOne にログインし、プログラムに移動します。
- [Engagements] に移動し、構成するプログラムのケバブメニューをクリックして、[Settings] をクリックします。
- [Automation] > [Webhooks] に移動します。
- [New webhook] をクリックします。
- 次の構成情報を提供してください。
- ペイロード URL: 上記の API キーと秘密鍵を含む完全な URL を貼り付けます(例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...)。 - Secret: このフィールドは空白 のままにします。
- ペイロード URL: 上記の API キーと秘密鍵を含む完全な URL を貼り付けます(例:
- Webhook をトリガーするイベントを選択します。次のいずれかを選択します。
- Send me everything: すべてのイベントで Webhook がトリガーされます。
- 個別のイベントを指定する: Google SecOps に送信する特定のイベントを選択します。
[Add webhook] をクリックします。
Webhook をテストする
- Webhook 構成ページで [Test request] をクリックして、構成済みのペイロード URL にリクエストの例を送信します。
- レスポンスが HTTP 200 であることを確認します。
- Webhook をクリックして詳細を表示します。
- [Recent deliveries] セクションで、最近の配信が成功ステータス(HTTP 200)であることを確認します。
- 配信をクリックして、POST ペイロード リクエストを表示します。
エラーが発生した場合:
- HTTP 403: API キーと秘密鍵がペイロード URL のクエリ パラメータとして正しく追加されていることを確認します。HackerOne の [Secret] フィールドが空白であることを確認します。
- HTTP 401: API キーが有効で、Google SecOps API に制限されていることを確認します。
- HTTP 404: エンドポイント URL が正しく、完全なパス(/v2/unstructuredlogentries:batchCreate)が含まれていることを確認します。
Google SecOps で取り込みを確認する
- Google SecOps で [SIEM 設定] > [フィード] に移動します。
- HackerOne Webhook フィードを見つけます。
- [ステータス] 列を確認します([有効] になっている必要があります)。
- [受信したイベント] の数を確認します(増加している必要があります)。
- [最後に成功した日時] のタイムスタンプを確認します(最近の日付である必要があります)。
Webhook の上限とベスト プラクティス
リクエストに関する上限
| Limit | Value |
|-------|-------|
| **Max request size** | 4 MB |
| **Max QPS (queries per second)** | 15,000 |
| **Request timeout** | 30 seconds |
| **Retry behavior** | Automatic with exponential backoff |
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 のプロフェッショナルから回答を得ることができます。