GitLab ログを収集する
概要
このパーサーは、GitLab JSON ログからフィールドを抽出し、統合データモデル(UDM)に正規化して、追加のコンテキストでデータを拡充します。さまざまな GitLab イベントタイプを処理し、ユーザー アクション、リソース アクセス、セキュリティ結果に重点を置きながら、ネットワークとアプリケーション関連の情報も処理します。また、パーサーは GitLab 内のロールとアクションに基づいてロジックを実行し、イベントを分類して適切な重大度を割り当てます。
始める前に
次の前提条件を満たしていることを確認します。
- Google SecOps インスタンス。
- GitLab への特権アクセス。
フィードを設定する
Google SecOps プラットフォームでフィードを設定するには、次の 2 つのエントリ ポイントがあります。
- [SIEM 設定] > [フィード]
- [Content Hub] > [Content Packs]
[SIEM 設定] > [フィード] でフィードを設定する
フィードを構成する手順は次のとおりです。
- [SIEM Settings] > [Feeds] に移動します。
- [Add New Feed] をクリックします。
- 次のページで [単一のフィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: GitLab Logs)。
- [Source type] として [Webhook] を選択します。
- [ログタイプ] として [Gitlab] を選択します。
- [次へ] をクリックします。
- 省略可: 次の入力パラメータの値を指定します。
- 分割区切り文字: ログ行を区切るために使用される区切り文字(
\n
など)。 - Asset namespace: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
- 分割区切り文字: ログ行を区切るために使用される区切り文字(
- [次へ] をクリックします。
- [Finalize] 画面でフィードの設定を確認し、[Submit] をクリックします。
- [秘密鍵を生成する] をクリックして、このフィードを認証するためのシークレット キーを生成します。
- 秘密鍵をコピーして保存します。この秘密鍵を再び表示することはできません。必要に応じて、新しい秘密鍵を再生成できますが、この操作により以前の秘密鍵は無効になります。
- [詳細] タブで、[エンドポイント情報] フィールドから、フィードのエンドポイント URL をコピーします。このエンドポイント URL をクライアント アプリケーション内で指定する必要があります。
- [完了] をクリックします。
コンテンツ ハブからフィードを設定する
次のフィールドに値を指定します。
- Split delimiter: ログ行を区切るために使用される区切り文字(
\n
など)。
詳細オプション
- フィード名: フィードを識別する事前入力された値。
- ソースタイプ: Google SecOps にログを収集するために使用される方法。
- アセットの名前空間: フィードに関連付けられた名前空間。
Ingestion Labels: このフィードのすべてのイベントに適用されるラベル。
[秘密鍵を生成する] をクリックして、このフィードを認証するためのシークレット キーを生成します。
秘密鍵をコピーして保存します。この秘密鍵を再び表示することはできません。必要に応じて、新しい秘密鍵を再生成できますが、この操作により以前の秘密鍵は無効になります。
[詳細] タブで、[エンドポイント情報] フィールドから、フィードのエンドポイント URL をコピーします。このエンドポイント URL をクライアント アプリケーション内で指定する必要があります。
Webhook フィード用の API キーを作成する
Google Cloud コンソール > [認証情報] に移動します。
[認証情報を作成] をクリックして [API キー] を選択します。
API キーのアクセスを Chronicle API に制限します。
エンドポイント URL を指定する
- クライアント アプリケーション内で、Webhook フィードで提供される HTTPS エンドポイント URL を指定します。
次の形式でカスタム ヘッダーの一部として 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 を構成する
- ウェブブラウザを開き、Webhook を構成する GitLab プロジェクトに移動します。
- プロジェクトで、[設定] > [Webhook] に移動します。
- [新しい Webhook を追加] をクリックします。
- [URL] フィールドに、Google SecOps エンドポイントの URL を貼り付けます。
- [カスタム ヘッダーを追加] をクリックします。
- [ヘッダー名] フィールドに「X-Webhook-Access-Key」と入力します。
- [ヘッダー値] フィールドに、Google SecOps フィード構成時に生成されたシークレット キーをコピーします。
- [カスタム ヘッダーを追加] をクリックします。
- [ヘッダー名] フィールドに「X-goog-api-key」と入力します。
- [ヘッダー値] フィールドに、Google SecOps フィード構成時に生成された API キーをコピーします。注: セキュリティを強化するには、シークレット トークンを生成して、GitLab Webhook 構成と対応する Google SecOps フィード構成の両方に追加します。これにより、受信ウェブフックの信頼性を確認できます。
- Webhook をトリガーする GitLab イベントを選択します。たとえば、[push イベント] を選択すると、コードがリポジトリに push されるたびに Google SecOps にデータが送信されます。セキュリティ モニタリングのニーズに関連するイベントを慎重に検討します。イベントが多すぎると、不要な負荷が発生する可能性があります。
- Webhook の目的をよりよく理解できるように、Google SecOps Webhook などのわかりやすい名前を付けます。
- [SSL 認証を有効にする] チェックボックスがオンになっていることを確認します。これは安全な通信に不可欠です。
- [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 が「Owner」の場合は「ADMINISTRATOR」、details.as が「Developer」、「Maintainer」、「Reporter」の場合は「SERVICE_ACCOUNT」、details.as が「Guest」の場合は「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.ip 、principal.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.ip 、principal.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.ip 、principal.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 |
「ACTIVE」でない場合、整数に変換されます。 |
jsonPayload.ua |
network.http.user_agent |
未加工ログ フィールドの値。 |
jsonPayload.username |
principal.user.userid |
未加工ログ フィールドの値。 |
jsonPayload.worker_id |
principal.application |
未加工ログ フィールドの値。 |
labels.instance_name |
principal.hostname 、principal.asset.hostname |
未加工ログ フィールド値。メッセージに「Removing user」が含まれている場合に使用されます。 |
logName |
security_result.category_details |
未加工ログ フィールドの値。 |
message |
security_result.summary |
未加工ログ フィールドの値。jsonPayload.severity が「ERROR」の場合に使用されます。 |
protoPayload.@type |
additional.fields |
キーが「protoPayload type」、値が文字列のフィールドとして追加されます。 |
protoPayload.authenticationInfo.principalEmail |
principal.user.email_addresses 、principal.user.userid |
未加工ログ フィールドの値。 |
protoPayload.authenticationInfo.principalSubject |
additional.fields |
キーが「authenticationInfo principalSubject」、値が文字列のフィールドとして追加されます。 |
protoPayload.authenticationInfo.serviceAccountKeyName |
additional.fields |
キーが「authenticationInfo serviceAccountKeyName」、値が文字列のフィールドとして追加されます。 |
protoPayload.authorizationInfo |
target.resource.attribute.labels 、security_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 |
キー「Request resource」のラベルとして追加されます。 |
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.fields 、target.user.email_addresses 、target.user.userid |
キーが「protoPayload status message」、値が文字列のフィールドとして追加されます。メールアドレスがメッセージから抽出できる場合は、target.user.email_addresses と target.user.userid に追加されます。 |
receiveTimestamp |
metadata.event_timestamp 、timestamp |
イベント タイムスタンプとして解析されます。 |
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」に設定します。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。