GitGuardian Enterprise のログを収集する

パーサーのバージョン: 1.0

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

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

GitGuardian Enterprise は、ソースコード リポジトリ、CI/CD パイプライン、デベロッパー ワークステーションをモニタリングして、公開された認証情報や機密データを検出して修正するプラットフォームです。シークレットが検出されるとリアルタイムでアラートが送信され、セキュリティ チームがインシデントの修復ワークフローを管理するのに役立ちます。

始める前に

次の前提条件を満たしていることを確認してください。

  • Google SecOps インスタンス
  • GitGuardian Enterprise ワークスペース(管理者アクセスレベル)
  • Google Cloud コンソールへのアクセス(API キーの作成用)
  • GitGuardian Business プラン以上(カスタム Webhook のサポート)

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

フィードを作成する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [Add New Feed] をクリックします。
  3. 次のページで、[単一のフィードを構成する] をクリックします。
  4. [フィード名] フィールドに、フィードの名前を入力します(例: GitGuardian Enterprise Incidents)。
  5. [Source type] として [Webhook] を選択します。
  6. [ログタイプ] として [GitGuardian Enterprise] を選択します。
  7. [次へ] をクリックします。
  8. 次の入力パラメータの値を指定します。

    • Split delimiter(省略可): 空白のままにします(各 Webhook リクエストには 1 つのイベントが含まれます)。
    • Asset namespace: アセットの名前空間。
    • Ingestion labels: このフィードのイベントに適用されるラベル
  9. [次へ] をクリックします。

  10. [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。

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

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

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

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

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

    https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import
    

    ここで、{region} は Google SecOps インスタンスのリージョン(us、europe、asia-southeast1 など)で、{parent} は projects/<PROJECT_ID>/locations/<LOCATION>/instances/<INSTANCE_ID>/logTypes/<LOG_TYPE> 形式のリソースパスです。

  4. 次の手順で使用するために、この URL を保存します。

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

Google Cloud API キーを作成する

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

API キーを作成する

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

API キーを制限する

  1. [API キー] 設定ページで、次の操作を行います。

    • 名前: わかりやすい名前を入力します(例: Google SecOps GitGuardian Webhook API Key)。
  2. [API の制限] で次の操作を行います。

    1. [キーを制限] を選択します。
    2. [API を選択] プルダウンで、[Google SecOps API](または [Chronicle API])を検索して選択します。
  3. [保存] をクリックします。

  4. ページ上部の [API キー] フィールドから API キーの値をコピーします。

  5. API キーを安全に保存します。

GitGuardian Enterprise Webhook を構成する

Webhook URL を作成する

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

    <ENDPOINT_URL>?key=<API_KEY>
    

    例:

    https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...
    

GitGuardian でカスタム Webhook を作成する

個人用ワークスペースの場合:

  1. GitGuardian ダッシュボードにログインします。
  2. [Settings] > [Workspace] > [Integrations] > [Destinations] > [Custom webhook] に移動します。
  3. [カスタム Webhook を追加] または [新しいカスタム Webhook を作成] をクリックします。
  4. 次の構成情報を提供してください。

    • [名前]: わかりやすい名前を入力します(例: Google SecOps SIEM Integration)。
    • URL: 上記の API キーを含む完全なエンドポイント URL を貼り付けます。
    • 署名トークン: Google SecOps フィードの作成時に取得した秘密鍵を貼り付けます。
    • カスタム ヘッダー(省略可): 環境タグまたはサービスタグを指定する必要がある場合を除き、空白のままにします。
  5. [Event Subscription] セクションで、Google SecOps に送信するイベントを選択します。

    • インシデント:
      • ☑ 新しいインシデントが検出されました
      • ☑ 新しい発生を検出しました
      • ☑ インシデントが解決した
      • ☑ インシデントが無視された
      • ☑ インシデントが再開された
      • ☑ インシデントの回帰
      • ☑ インシデントの割り当て
      • ☑ インシデントの再割り当て
      • ☑ インシデントが割り当てられていない
      • ☑ インシデントの重大度が変更された
      • ☑ インシデントの有効性が変更された
      • ☑ インシデントへのアクセス権が付与されました
      • ☑ インシデントへのアクセス権が取り消されました
      • ☑ インシデントが一般公開されている
      • ☑ インシデントが一般公開されていない
      • ☑ フィードバックを送信しました
      • ☑ インシデントに関する新しいコメント
  6. [作成] または [保存] をクリックします。

  7. GitGuardian は、Webhook が動作していることを確認するためにテスト メッセージを送信します。

ビジネス ワークスペースの場合:

  1. GitGuardian ダッシュボードにログインします。
  2. Webhook のスコープを決定します。

    • ワークスペース内のすべてのインシデントの場合: [All-incidents team] に移動します。
    • 特定のチームのインシデントの場合: 目的のチームに移動します。
  3. [Settings] > [Workspace] > [Integrations] > [Destinations] > [Custom webhook] に移動します。

    • または、チームページから [Integrations] > [Custom webhook] に移動します。
  4. [カスタム Webhook を追加] または [新しいカスタム Webhook を作成] をクリックします。

  5. 次の構成情報を提供してください。

    • [名前]: わかりやすい名前を入力します(例: Google SecOps SIEM Integration)。
    • URL: 上記の API キーを含む完全なエンドポイント URL を貼り付けます。
    • 署名トークン: Google SecOps フィードの作成時に取得した秘密鍵を貼り付けます。
    • カスタム ヘッダー(省略可): 環境タグまたはサービスタグを指定する必要がある場合を除き、空白のままにします。
  6. [Event Subscription] セクションで、Google SecOps に送信するイベントを選択します。

    • インシデント:
      • ☑ 新しいインシデントが検出されました
      • ☑ 新しい発生を検出しました
      • ☑ インシデントが解決した
      • ☑ インシデントが無視された
      • ☑ インシデントが再開された
      • ☑ インシデントの回帰
      • ☑ インシデントの割り当て
      • ☑ インシデントの再割り当て
      • ☑ インシデントが割り当てられていない
      • ☑ インシデントの重大度が変更された
      • ☑ インシデントの有効性が変更された
      • ☑ インシデントへのアクセス権が付与されました
      • ☑ インシデントへのアクセス権が取り消されました
      • ☑ インシデントが一般公開されている
      • ☑ インシデントが一般公開されていない
      • ☑ フィードバックを送信しました
      • ☑ インシデントに関する新しいコメント
  7. [作成] または [保存] をクリックします。

  8. GitGuardian は、Webhook が動作していることを確認するためのテスト メッセージを送信します。

Webhook の配信を確認する

  1. GitGuardian ダッシュボードで、カスタム Webhook 構成に移動します。
  2. [テスト メッセージを送信] または [Webhook をテスト] をクリックします。
  3. GitGuardian が Google SecOps にサンプル ペイロードを送信します。
  4. Google SecOps コンソールで、[SIEM 設定] > [フィード] に移動します。
  5. GitGuardian フィードを見つけて、テストイベントが受信されたことを確認します。
  6. [Feed Status] に [Active] と表示され、最近の取り込みのタイムスタンプが表示されていることを確認します。

認証方法のリファレンス

Google SecOps の Webhook フィードは、複数の認証方法をサポートしています。ベンダーがサポートしている方法を選択してください。

GitGuardian のカスタム Webhook は、URL に認証情報を追加すると最適に機能します。

  • URL 形式:

    <ENDPOINT_URL>?key=<API_KEY>
    

    例:

    https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...
    

    GitGuardian Webhook の構成:

    • URL: API キー パラメータを含む完全なエンドポイント URL
    • 署名トークン: Google SecOps 秘密鍵(HMAC 検証用)
  • リクエストの形式:

    POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1
    Content-Type: application/json
    Timestamp: 1234567890
    Gitguardian-Signature: sha256=abc123...
    
    {
        "source": "GitGuardian",
        "timestamp": "2025-01-15T10:30:00Z",
        "action": "incident_triggered",
        "incident": {...}
    }
    

方法 2: カスタム ヘッダー(代替)

認証情報を URL に含めないようにするには、カスタム ヘッダーを使用します。

  • リクエストの形式:

    POST <ENDPOINT_URL> HTTP/1.1
    Content-Type: application/json
    x-goog-chronicle-auth: <API_KEY>
    Timestamp: 1234567890
    Gitguardian-Signature: sha256=abc123...
    
    {
        "source": "GitGuardian",
        "timestamp": "2025-01-15T10:30:00Z",
        "action": "incident_triggered",
        "incident": {...}
    }
    

GitGuardian Webhook 署名の検証

GitGuardian は、HMAC-SHA256 を使用してすべての Webhook ペイロードに署名し、真正性を確保して改ざんを防止します。

署名ヘッダー

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

  • Gitguardian-Signature: sha256=<hex_digest> 形式の HMAC-SHA256 署名
  • Timestamp: リクエストが送信されたときの Unix タイムスタンプ
  • X-GitGuardian-Signature: 非推奨のヘッダー(下位互換性のために引き続きサポートされています)

署名アルゴリズム

  • 署名は次のように計算されます。

    HMAC-SHA256(key=timestamp + signature_token, message=payload)
    

    ここで

    • timestamp: Timestamp ヘッダーの値
    • signature_token: GitGuardian Webhook 設定で構成されたシークレット キー
    • payload: UTF-8 文字列としての未加工の JSON リクエスト本文

検証の例(Python)

import hmac
import hashlib

def verify_signature(signature: str, timestamp: str, signature_token: str, payload: str) -> bool:
    if not signature.startswith("sha256="):
        return False
    
    signature = signature.split("sha256=")[-1]
    
    hmac_digest = hmac.new(
        key=bytes(timestamp + signature_token, "utf-8"),
        msg=bytes(payload, "utf-8"),
        digestmod=hashlib.sha256
    ).hexdigest()
    
    return hmac.compare_digest(signature, hmac_digest)

リプレイ攻撃保護

  • Timestamp ヘッダーはリプレイ攻撃を防ぎます。現在のタイムスタンプと Webhook のタイムスタンプの差が数秒(推奨: 300 秒)を超える場合は、リクエストを拒否します。

イベントタイプとペイロード構造

GitGuardian は、インシデントのライフサイクルの変化に基づいて、さまざまなイベントタイプを送信します。

インシデント イベント

イベントタイプ アクション値 説明
新しいインシデントが検出されました incident_triggered 新しいシークレット インシデントが検出されました
新しい発生が検出されました new_occurrence 既存のインシデントの新しい発生が見つかりました
インシデントが解決しました incident_resolved インシデントが解決済みとしてマークされました
インシデントが無視されました incident_ignored インシデントが無視としてマークされました
インシデントが再開されました incident_reopened 以前にクローズされたインシデントが再開されました
インシデント回帰 incident_regression このインシデントについて新しい回帰が見つかりました
Incident assigned incident_assigned インシデントがユーザーに割り当てられました
インシデントが再割り当てされました incident_reassigned インシデントが別のユーザーに再割り当てされました
インシデントの割り当て解除 incident_unassigned ユーザーがこのインシデントから割り当て解除されました
重大度が変更されました incident_severity_changed 重大度レベルが更新されました
有効期間の変更 incident_validity_changed 有効性ステータスが更新されました
アクセスが許可される incident_access_granted ユーザーにこのインシデントへのアクセス権が付与されました
アクセス権が取り消されました incident_access_revoked ユーザーのこのインシデントへのアクセス権が取り消された
一般公開で共有 incident_shared_publicly 公開共有リンクが生成されました
一般公開の共有を解除 incident_unshared_publicly 公開共有リンクが無効になりました
フィードバックを送信しました issue_feedback_received このインシデントに関するフィードバックが送信されました
新しいコメント incident_note_created このインシデントに関する新しいメモが作成されました

ペイロード構造の例

  • すべての Webhook ペイロードは次の構造に従います。

    {
        "source": "GitGuardian",
        "timestamp": "2025-01-15T10:30:00.123456Z",
        "action": "incident_triggered",
        "message": "A new incident has been detected.",
        "target_user": "john.doe@example.com",
        "target_team": "Security Team",
        "custom_webhook_name": "Google SecOps SIEM Integration",
        "incident": {
            "id": 12345,
            "date": "2025-01-15T10:29:58.123456Z",
            "detector": {
                "name": "aws_iam",
                "display_name": "AWS Keys",
                "nature": "specific",
                "family": "credentials"
            },
            "secret_hash": "abc123...",
            "secret_revoked": false,
            "validity": "valid",
            "occurrence_count": 1,
            "status": "triggered",
            "assignee_email": null,
            "severity": "high",
            "gitguardian_url": "https://dashboard.gitguardian.com/workspace/1/incidents/12345"
        }
    }
    

Webhook の制限とベスト プラクティス

リクエストに関する上限

上限 値
最大リクエスト サイズ 4 MB
最大 QPS(秒間クエリ数) 15,000
リクエストのタイムアウト 30 秒
再試行の動作 指数バックオフによる自動再試行

ベスト プラクティス

  • イベントの選択: セキュリティ運用に関連するイベントのみをサブスクライブして、ノイズを低減します。
  • チーム スコープ: ビジネス ワークスペースの場合、チームレベルで Webhook を作成して、チームの所有権でインシデントをフィルタします。
  • 署名の検証: 署名トークンを安全に保存し、ソースコードにコミットしないようにします。
  • モニタリング: GitGuardian ダッシュボードで webhook の配信ステータスを定期的に確認します。
  • テスト: テスト メッセージ機能を使用して、本番環境で使用する前に Webhook 構成を検証します。

配信の保証

重要: Webhook の配信はベスト エフォートであり、保証されません。Google SecOps エンドポイントにアクセスできない場合や、ネットワークの問題がある場合、Webhook イベントが受信されないことがあります。一般的に、Webhook は信頼性が高いですが、配信は保証されません。

重要なユースケースでは、ウェブフックに加えて定期的な API ポーリングを行い、インシデントを見逃さないようにすることを検討してください。

UDM マッピング テーブル

ログフィールド UDM マッピング ロジック
日付 metadata.event_timestamp ISO8601 形式を使用して変換
has_user metadata.event_type has_user が true の場合は「USER_UNCATEGORIZED」に設定し、それ以外の場合は「GENERIC_EVENT」に設定します。
event_name metadata.product_event_type 値を直接コピーする
id metadata.product_log_id 値を直接コピーする
metadata.product_name 「GitGuardian Enterprise」に設定します。
metadata.vendor_name 「GitGuardian」に設定します。
member_email principal.user.email_addresses member_email から統合
member_name principal.user.user_display_name 値を直接コピーする
member_id principal.user.userid 文字列に変換しました
action_type security_result.action_details 値が直接コピーされる
target_ids target.resource.product_object_id target_ids の最初の要素からの値

変更ログ

このパーサーの変更ログを表示する

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