GitLab ログを収集する
以下でサポートされています。
Google SecOpsSIEM
概要
このパーサーは、GitLab JSON ログからフィールドを抽出し、統合データモデル(UDM)に正規化して、追加のコンテキストでデータを拡充します。さまざまな GitLab イベントタイプを処理し、ユーザー アクション、リソース アクセス、セキュリティ結果に重点を置きながら、ネットワークとアプリケーション関連の情報も処理します。また、解析ツールは GitLab 内のロールとアクションに基づいてロジックを実行し、イベントを分類して適切な重大度を割り当てます。
始める前に
- Google SecOps インスタンスがあることを確認します。
- GitLab への特権アクセス権があることを確認します。
GitLab ログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [新しく追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: GitLab ログ)。
- [ソースタイプ] として [Webhook] を選択します。
- [Log type] として [Gitlab] を選択します。
- [次へ] をクリックします。
- 省略可: 次の入力パラメータの値を指定します。
- 分割区切り文字: ログ行を区切るために使用される区切り文字(
\n
など)。 - アセットの名前空間: アセットの名前空間。
- 取り込みラベル: このフィードのイベントに適用されるラベル。
- 分割区切り文字: ログ行を区切るために使用される区切り文字(
- [次へ] をクリックします。
- [Finalize] 画面でフィードの設定を確認し、[送信] をクリックします。
- [秘密鍵を生成する] をクリックして、このフィードを認証するためのシークレット キーを生成します。
- シークレット キーをコピーして保存します。この秘密鍵を再び表示することはできません。必要に応じて、新しい秘密鍵を再生成できますが、この操作により以前の秘密鍵は無効になります。
- [詳細] タブで、[エンドポイント情報] フィールドから、フィードのエンドポイント URL をコピーします。このエンドポイント URL は、クライアント アプリケーションで指定する必要があります。
- [完了] をクリックします。
Webhook フィードの API キーを作成する
Google Cloud コンソール > [認証情報] に移動します。
[認証情報を作成] をクリックして [API キー] を選択します。
API キーのアクセスを Google Security Operations 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 プロジェクトに移動します。
- プロジェクトで、[設定] > [Webhooks] に移動します。
- [Add new webhook] をクリックします。
- [URL] フィールドに、Google SecOps エンドポイントの URL を貼り付けます。
- [カスタム ヘッダーを追加] をクリックします。
- [Header Name] フィールドに「X-Webhook-Access-Key」と入力します。
- [Header Value] フィールドに、Google SecOps フィード構成時に生成されたシークレット キーをコピーします。
- [カスタム ヘッダーを追加] をクリックします。
- [Header Name] フィールドに「X-goog-api-key」と入力します。
- [Header Value] フィールドに、Google SecOps フィード構成時に生成された API キーをコピーします。注: セキュリティを強化するには、シークレット トークンを生成し、GitLab Webhook 構成と対応する Google SecOps フィード構成の両方に追加します。これにより、受信した Webhook の真正性を確認できます。
- Webhook をトリガーする GitLab イベントを選択します。たとえば、[Push events] を選択すると、コードがリポジトリに push されるたびに Google SecOps にデータが送信されます。セキュリティ モニタリングのニーズに関連するイベントを慎重に検討してください。イベントが多すぎると、不要な負荷が発生する可能性があります。
- Webhook の目的を明確にするために、Google SecOps Webhook など、わかりやすい名前を付けます。
- [Enable SSL verification] チェックボックスがオンになっていることを確認します。これは、安全な通信に不可欠です。
- [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.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 |
「有効」でない場合、整数に変換されます。 |
jsonPayload.ua |
network.http.user_agent |
未加工のログフィールド値。 |
jsonPayload.username |
principal.user.userid |
未加工のログフィールドの値。 |
jsonPayload.worker_id |
principal.application |
未加工のログフィールド値。 |
labels.instance_name |
principal.hostname 、principal.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_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 |
キー「リソースをリクエスト」のラベルとして追加されました。 |
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」に設定します。 |
変更点
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
- 新しく作成されたパーサー。