GitLab ログを収集する

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

概要

このパーサーは、GitLab JSON ログからフィールドを抽出し、統合データモデル(UDM)に正規化して、追加のコンテキストでデータを拡充します。さまざまな GitLab イベントタイプを処理し、ユーザー アクション、リソース アクセス、セキュリティ結果に重点を置きながら、ネットワークとアプリケーション関連の情報も処理します。また、解析ツールは GitLab 内のロールとアクションに基づいてロジックを実行し、イベントを分類して適切な重大度を割り当てます。

始める前に

  • Google SecOps インスタンスがあることを確認します。
  • GitLab への特権アクセス権があることを確認します。

GitLab ログを取り込むように Google SecOps でフィードを構成する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [新しく追加] をクリックします。
  3. [フィード名] フィールドに、フィードの名前を入力します(例: GitLab ログ)。
  4. [ソースタイプ] として [Webhook] を選択します。
  5. [Log type] として [Gitlab] を選択します。
  6. [次へ] をクリックします。
  7. 省略可: 次の入力パラメータの値を指定します。
    • 分割区切り文字: ログ行を区切るために使用される区切り文字(\n など)。
    • アセットの名前空間: アセットの名前空間
    • 取り込みラベル: このフィードのイベントに適用されるラベル。
  8. [次へ] をクリックします。
  9. [Finalize] 画面でフィードの設定を確認し、[送信] をクリックします。
  10. [秘密鍵を生成する] をクリックして、このフィードを認証するためのシークレット キーを生成します。
  11. シークレット キーをコピーして保存します。この秘密鍵を再び表示することはできません。必要に応じて、新しい秘密鍵を再生成できますが、この操作により以前の秘密鍵は無効になります。
  12. [詳細] タブで、[エンドポイント情報] フィールドから、フィードのエンドポイント URL をコピーします。このエンドポイント URL は、クライアント アプリケーションで指定する必要があります。
  13. [完了] をクリックします。

Webhook フィードの API キーを作成する

  1. Google Cloud コンソール > [認証情報] に移動します。

    [認証情報] に移動

  2. [認証情報を作成] をクリックして [API キー] を選択します。

  3. API キーのアクセスを Google Security Operations API に制限します。

エンドポイント URL を指定する

  1. クライアント アプリケーションで、Webhook フィードで指定された HTTPS エンドポイント URL を指定します。
  2. 次の形式でカスタム ヘッダーの一部として API キーとシークレット キーを指定して、認証を有効にします。

    X-goog-api-key = API_KEY
    X-Webhook-Access-Key = SECRET
    

    推奨事項: API キーは URL ではなくヘッダーとして指定してください。Webhook クライアントがカスタム ヘッダーをサポートしていない場合は、次の形式のクエリ パラメータを使用して API キーとシークレット キーを指定できます。

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

次のように置き換えます。

  • ENDPOINT_URL: フィードのエンドポイント URL。
  • API_KEY: Google Security Operations の認証に使用する API キー。
  • SECRET: フィードの認証用に生成したシークレット キー。

Google SecOps 用に GitLab で Webhook を構成する

  1. ウェブブラウザを開き、Webhook を構成する GitLab プロジェクトに移動します。
  2. プロジェクトで、[設定] > [Webhooks] に移動します。
  3. [Add new webhook] をクリックします。
  4. [URL] フィールドに、Google SecOps エンドポイントの URL を貼り付けます。
  5. [カスタム ヘッダーを追加] をクリックします。
  6. [Header Name] フィールドに「X-Webhook-Access-Key」と入力します。
  7. [Header Value] フィールドに、Google SecOps フィード構成時に生成されたシークレット キーをコピーします。
  8. [カスタム ヘッダーを追加] をクリックします。
  9. [Header Name] フィールドに「X-goog-api-key」と入力します。
  10. [Header Value] フィールドに、Google SecOps フィード構成時に生成された API キーをコピーします。注: セキュリティを強化するには、シークレット トークンを生成し、GitLab Webhook 構成と対応する Google SecOps フィード構成の両方に追加します。これにより、受信した Webhook の真正性を確認できます。
  11. Webhook をトリガーする GitLab イベントを選択します。たとえば、[Push events] を選択すると、コードがリポジトリに push されるたびに Google SecOps にデータが送信されます。セキュリティ モニタリングのニーズに関連するイベントを慎重に検討してください。イベントが多すぎると、不要な負荷が発生する可能性があります。
  12. Webhook の目的を明確にするために、Google SecOps Webhook など、わかりやすい名前を付けます。
  13. [Enable SSL verification] チェックボックスがオンになっていることを確認します。これは、安全な通信に不可欠です。
  14. [Webhook を追加] をクリックして構成を保存します。

UDM マッピング テーブル

ログフィールド UDM マッピング ロジック
author_id principal.user.userid 文字列に変換されます。
author_name principal.user.email_addresses 値がメールアドレスの正規表現と一致する場合。
author_name principal.user.user_display_name 値がメールアドレスの正規表現と一致しない場合。
details.as principal.resource.attribute.labels キー「as」のラベルとして追加されました。
details.add principal.resource.attribute.labels キー「add」のラベルとして追加されました。
details.as principal.user.role_name 未加工のログフィールドの値。
details.as principal.user.attribute.roles.type details.as が「オーナー」の場合は「ADMINISTRATOR」、details.as が「デベロッパー」、「メンテナー」、「レポーター」の場合は「SERVICE_ACCOUNT」、details.as が「ゲスト」の場合は「TYPE_UNSPECIFIED」に設定します。
details.custom_message security_result.description 未加工のログフィールド値。
details.custom_message.action security_result.summary 未加工のログフィールドの値。
details.entity_path target.file.full_path 未加工のログフィールド値。
details.target_id target.resource.id 文字列に変換されます。
entity_path target.file.full_path 未加工のログフィールド値。
entity_type target.resource.attribute.labels キー「Entity Type」のラベルとして追加されました。
event_type metadata.product_event_type 未加工のログフィールド値。
insertId metadata.product_log_id 未加工のログフィールドの値。
ip_address principal.ipprincipal.asset.ip 未加工のログフィールド値。
jsonPayload.action additional.fields キーが「action」、値が文字列のフィールドとして追加されました。
jsonPayload.controller additional.fields キーが「controller」で値が文字列のフィールドとして追加されました。
jsonPayload.correlation_id principal.asset_id 「id: 」が接頭辞となる。
jsonPayload.cpu_s additional.fields キー「cpu_s」と文字列値を持つフィールドとして追加されました。
jsonPayload.details.custom_message.protocol network.application_protocol 値が「web」の場合は「UNKNOWN_APPLICATION_PROTOCOL」に設定され、それ以外の場合は大文字に変換されます。また、値が「web」の場合、キー「Application Protocol」の追加フィールドも追加されました。
jsonPayload.mem_total_bytes additional.fields キー「mem_total_bytes」と文字列値を持つフィールドとして追加されました。
jsonPayload.meta_caller_id additional.fields キーが「Caller Id」、値が文字列のフィールドとして追加されました。
jsonPayload.meta_client_id target.user.userid 未加工のログフィールドの値。
jsonPayload.meta_feature_category additional.fields キーが「Feature Category」、値が文字列のフィールドとして追加されました。
jsonPayload.meta_remote_ip principal.ipprincipal.asset.ip 未加工のログフィールド値。JSON 配列として解析され、IP フィールドに統合されます。
jsonPayload.meta_user principal.user.userid jsonPayload.username が空の場合にフォールバックとして使用されます。
jsonPayload.method network.http.method 未加工のログフィールドの値。
jsonPayload.path target.process.file.full_path 未加工のログフィールド値。
jsonPayload.pid target.process.pid 文字列に変換されます。
jsonPayload.remote_ip principal.ipprincipal.asset.ip 未加工のログフィールドの値。
jsonPayload.request_urgency additional.fields キーが「Request Urgency」、値が文字列のフィールドとして追加されました。
jsonPayload.severity security_result.severity 値が「INFO」の場合は「INFORMATIONAL」、値が「ERROR」の場合は「ERROR」、値が「NOTICE」の場合は「MEDIUM」に設定します。
jsonPayload.status network.http.response_code 「有効」でない場合、整数に変換されます。
jsonPayload.ua network.http.user_agent 未加工のログフィールド値。
jsonPayload.username principal.user.userid 未加工のログフィールドの値。
jsonPayload.worker_id principal.application 未加工のログフィールド値。
labels.instance_name principal.hostnameprincipal.asset.hostname 未加工のログフィールド値。メッセージに「ユーザーの削除」が含まれている場合に使用されます。
logName security_result.category_details 未加工のログフィールド値。
message security_result.summary 元のログフィールドの値。jsonPayload.severity が「ERROR」の場合に使用されます。
protoPayload.@type additional.fields キーが「protoPayload type」、値が文字列のフィールドとして追加されました。
protoPayload.authenticationInfo.principalEmail principal.user.email_addressesprincipal.user.userid 未加工のログフィールドの値。
protoPayload.authenticationInfo.principalSubject additional.fields キー「authenticationInfo principalSubject」と文字列値を持つフィールドとして追加されました。
protoPayload.authenticationInfo.serviceAccountKeyName additional.fields キー「authenticationInfo serviceAccountKeyName」と文字列値を持つフィールドとして追加されました。
protoPayload.authorizationInfo target.resource.attribute.labelssecurity_result.action このフィールド内の値は、キーに「authenticationInfo」という接頭辞が付いたラベルとして追加されます。granted 内の値が true の場合、security_result.action は「ALLOW」に設定され、false の場合、「BLOCK」に設定されます。resourceAttributes などのネストされたフィールドも、キーに「authenticationInfo_resourceAttributes」という接頭辞が付いたラベルとして追加されます。
protoPayload.methodName additional.fields キー「protoPayload methodName」と文字列値を持つフィールドとして追加されました。
protoPayload.request.@type additional.fields キーが「Request Type」、値が文字列のフィールドとして追加されました。
protoPayload.request.resource target.resource.attribute.labels キー「リソースをリクエスト」のラベルとして追加されました。
protoPayload.requestMetadata.callerIp additional.fields キー「requestMetadata callerIp」と文字列値を持つフィールドとして追加されました。
protoPayload.requestMetadata.callerSuppliedUserAgent additional.fields キー「requestMetadata callerSuppliedUserAgent」と文字列値を持つフィールドとして追加されました。
protoPayload.serviceName additional.fields キー「serviceName」と文字列値を持つフィールドとして追加されました。
protoPayload.status.code additional.fields キー「protoPayload status code」と文字列値を持つフィールドとして追加されました。
protoPayload.status.message additional.fieldstarget.user.email_addressestarget.user.userid キーが「protoPayload status message」で値が文字列のフィールドとして追加されました。メールアドレスがメッセージから抽出できる場合は、target.user.email_addressestarget.user.userid に追加されます。
receiveTimestamp metadata.event_timestamptimestamp イベントのタイムスタンプとして解析されます。
resource.labels.project_id target.resource.attribute.labels キー「Project id」のラベルとして追加されました。
resource.labels.zone target.cloud.availability_zone 未加工のログフィールド値。
resource.type target.cloud.environment 値が「gce」と一致する場合は、「GOOGLE_CLOUD_PLATFORM」に設定します。
security_result.action security_result.action protoPayload.authorizationInfo.granted から派生しました。
security_result.category_details security_result.category_details logName に統合されました。
security_result.description security_result.description jsonPayload.details.custom_message から派生しました。
security_result.severity security_result.severity severity または jsonPayload.severity から派生した値。
security_result.summary security_result.summary jsonPayload.details.custom_message.action または jsonPayload.message から派生した値。
severity security_result.severity 値が「INFO」の場合は「INFORMATIONAL」、値が「ERROR」の場合は「ERROR」、値が「NOTICE」の場合は「MEDIUM」に設定します。
sourceLocation principal.resource.attribute.labels このフィールド内の値はラベルとして追加されます。
target_details target.resource.attribute.labels キー「Target Details」のラベルとして追加されました。
target_type target.resource.attribute.labels キー「target type」のラベルとして追加されました。
timestamp timestamp 未加工のログフィールドの値。プリンシパルとターゲット フィールドの有無に基づいて設定します。特定の条件が満たされていない場合のデフォルトは「GENERIC_EVENT」です。有効な値は、「USER_RESOURCE_UPDATE_CONTENT」、「USER_RESOURCE_ACCESS」、「USER_UNCATEGORIZED」です。「GITLAB」に設定します。「GITLAB」に設定します。

変更点

2024-04-08

  • 「custom_message.action」を「security_result.summary」にマッピングしました。
  • 「ip_address」を「principal.ip」にマッピングしました。
  • 「applicationProtocol」を「network.application_protocol」にマッピングしました。
  • 「details.author_name」を「principal.user.email_addresses」にマッピングしました
  • 「author_id」を「principal.user.userid」にマッピングしました。
  • 「target_id」を「target.resource.id」にマッピングしました。
  • 「details.entity_path」を「target.file.full_path」にマッピングしました。
  • 「event_type」を「product_event_type」にマッピングしました。
  • 「target_type」、「entity_type」、「target_details」を「resource.attribute.labels」にマッピングしました。

2023-10-20

  • 「db_」で始まるフィールドを「additional_fields」にマッピングしました。
  • 「redis_」で始まるフィールドを「additional_fields」にマッピングしました。
  • 値が「ERROR」または「NOTICE」の場合、「severity」または「jsonPayload.severity」を「security_result.severity」にマッピングしました。
  • 「jsonPayload.correlation_id」を「principal.asset_id」にマッピングしました。
  • 「jsonPayload のマッピングされていないフィールド」を「additional_fields」にマッピングしました。
  • 「jsonPayload.worker_id」を「principal.application」にマッピングしました。
  • 「jsonPayload.method」を「network.http.method」にマッピングしました。
  • 「jsonPayload.pid」を「target.process.pid」にマッピングしました。
  • 「jsonPayload.status」を「network.http.response_code」にマッピングしました。
  • 「resource.labels.zone」を「target.cloud.availability_zone」にマッピングしました。
  • 「resource.type」を「target.cloud.environment」にマッピングしました。
  • 「jsonPayload.meta_user」を「target.user.userid」にマッピングしました。
  • 「jsonPayload.username」を「principal.user.userid」にマッピングしました。
  • 「jsonPayload.remote_ip」を「principal.ip」にマッピングしました。
  • 「jsonPayload.ua」を「network.http.user_agent」にマッピングしました。
  • 「jsonPayload.meta_client_id」を「target.user.userid」にマッピングしました。
  • 「jsonPayload.path」を「target.process.file.full_path」にマッピングしました。
  • 「protoPayload.authenticationInfo.principalEmail」を「principal.user.email_addresses」にマッピングしました。
  • 「protoPayload」の追加フィールドを「additional.fields」にマッピングしました。
  • 「metadata.event_type」をマッピングする前に、必要なマッピングが存在するかどうかの条件チェックを追加しました。

2023-10-10

  • 「jsonPayload.details.as」を「principal.resource.attribute.labels」と「principal.user.role_name」にマッピングしました。
  • 「jsonPayload.details.as」が「Owner」に等しいログの「principal_role.type」を「ADMINISTRATOR」に設定。
  • 「jsonPayload.details.as」が「Developer」、「Maintainer」、「Reporter」のいずれかに設定されているログの「principal_role.type」を「SERVICE_ACCOUNT」に設定しました。
  • 「jsonPayload.details.as」が「Guest」に等しいログの「principal_role.type」を「TYPE_UNSPECIFIED」に設定。
  • 「jsonPayload.details.add」を「principal.resource.attribute.labels」にマッピングしました。
  • 「jsonPayload.entity_type」を「target.resource.attribute.labels」にマッピングしました。

2023-08-31

  • 新しく作成されたパーサー。