Azure DevOps 監査ログを収集する

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

概要

このパーサーは、Azure DevOps 監査ログを JSON 形式で処理します。ネストされた JSON 構造とトップレベルの JSON 構造からフィールドを抽出し、UDM にマッピングします。特定のフィールド値に基づく条件ロジックにより、イベントが分類され、関連するセキュリティ情報によって出力が拡充されます。また、パーサーは、grok パターンを使用して JSON ペイロードの抽出を試行することで、JSON 形式以外のメッセージを処理します。

始める前に

  • Google SecOps インスタンスがあることを確認します。
  • アクティブな Azure DevOps 組織があることを確認します。
  • Azure Devops 組織と Azure への特権アクセス権があることを確認します。

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

  1. [SIEM 設定] > [フィード] に移動します。
  2. [新しく追加] をクリックします。
  3. [フィード名] フィールドに、フィードの名前を入力します(例: Azure Devops Logs)。
  4. [Source type] として [Webhook] を選択します。
  5. [ログタイプ] として [Azure Devops] を選択します。
  6. [次へ] をクリックします。
  7. 省略可: 次の入力パラメータの値を指定します。
    • 分割区切り文字: ログ行を区切るために使用される区切り文字(\n など)。
    • Asset namespace: アセットの名前空間
    • Ingestion labels: このフィードからのイベントに適用されるラベル。
  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: フィードの認証用に生成した秘密鍵。

Azure DevOps で監査機能を構成する

  1. 組織(https://dev.azure.com/{yourorganization})にログインします。
  2. 歯車アイコンを選択して [組織の設定] を開きます。
  3. [セキュリティ] で [ポリシー] を選択します。
  4. [監査イベントをログに記録] ボタンを [オン] に切り替えます。

Azure で Event Grid トピックを構成する

  1. Azure Portal にログインします。
  2. Event Grid を検索してアクセスします。
  3. [カスタム イベント] で [トピック] を見つけます。
  4. [+ 作成] をクリックします。
  5. サブスクリプションリソース グループを選択します。名前(DevopsAuditLog など)を指定し、リージョンを選択します。[確認して作成] をクリックします。
  6. 新しいトピックにアクセスし、トピック エンドポイント URL をコピーします。
  7. [設定] > [アクセスキー] に移動し、[キー 1] をコピーします。

Azure Devops ログストリームを Event Grid に構成する

  1. 組織(https://dev.azure.com/{yourorganization})にログインします。
  2. 歯車アイコンを選択して [組織の設定] を開きます。
  3. [監査] を選択します。
  4. [ストリーム] タブに移動し、[新しいストリーム] > [イベント グリッド] を選択します。
  5. Azure で Event Grid トピックを構成するで作成したトピック エンドポイントアクセスキーを入力します。

Google SecOps 用に Azure DevOps で Webhook を構成する

  1. Azure Portal で [Event Grid] を検索してアクセスします。
  2. 以前に作成したトピックを選択します。
  3. [エンティティ] > [イベント サブスクリプション] に移動します。
  4. [+ イベント サブスクリプション] をクリックします。
  5. わかりやすい名前を指定します(例: Google SecOps Integration)。
  6. [ウェブフック] を選択し、[エンドポイントを構成する] をクリックします。
  7. エンドポイントを構成します。
    • サブスクライバー エンドポイント: Google SecOps API エンドポイント URL を入力します。
    • ペイロード URL に ?key=<API_KEY>&secret=<SECRET_KEY> を追加します。
    • Content-Type ヘッダーを application/json に設定します。
  8. [作成] をクリックします。

UDM マッピング テーブル

ログフィールド UDM マッピング ロジック
ActivityId metadata.product_log_id records フィールドが存在しない場合、未加工ログの Id フィールドから直接マッピングされます。records が存在する場合は、data オブジェクト内の ActivityId フィールドから直接マッピングされます。
ActionId metadata.product_event_type data オブジェクト内の ActionId フィールドから直接マッピングされます。
ActorCUID additional.fields キーが「Actor CUID」の追加フィールドとして追加されます。
ActorDisplayName principal.user.user_display_name 「Azure DevOps Service」でない場合、ActorDisplayName フィールドから直接マッピングされます。「Azure DevOps Service」の場合は、principal.resource.attribute.labels にラベルとして追加されます。
ActorUPN principal.user.email_addresses この値がメールアドレスのパターンと一致する場合、値は ActorUPN フィールドから直接マッピングされます。
ActorUserId principal.user.userid ActorUserId フィールドから直接マッピングされます。
Area target.application Area 値の前に「DevOps」を追加して target.application フィールドを作成するために使用されます。
AuthenticationMechanism extensions.auth.auth_detailssecurity_result.rule_id 解析され、認証の詳細とルール ID が抽出されます。認証の詳細は extensions.auth.auth_details にマッピングされます。抽出されたルール ID は security_result.rule_id にマッピングされます。
CategoryDisplayName security_result.action_details security_result.action_details に直接マッピングされます。
City principal.location.city City フィールドから直接マッピングされます。
Conditions additional.fields キーが「条件」の追加フィールドとして追加されます。
Country principal.location.country_or_region Country フィールドから直接マッピングされます。
Data.* 各種 Data オブジェクト内のフィールドは、名前とコンテキストに基づいて異なる UDM フィールドにマッピングされます。具体的な例については、以下をご覧ください。
Data.AccessLevel target.resource.attribute.labels キー「AccessLevel」のラベルとして追加されます。
Data.AgentId target.resource.product_object_id PipelineIdAuthorizationId が存在しない場合、target.resource.product_object_id にマッピングされます。
Data.AgentName target.resource.name PipelineNameNamespaceNameDisplayName が存在しない場合、target.resource.name にマッピングされます。
Data.AuthorizationId target.resource.product_object_id PipelineId が存在しない場合、target.resource.product_object_id にマッピングされます。
Data.CallerProcedure additional.fields キーが「CallerProcedure」の追加フィールドとして追加されます。
Data.CheckSuiteId additional.fields キーが「CheckSuiteId」の追加フィールドとして追加されます。
Data.CheckSuiteStatus additional.fields キーが「CheckSuiteStatus」の追加フィールドとして追加されます。
Data.ConnectionId additional.fields キーが「ConnectionId」の追加フィールドとして追加されます。
Data.ConnectionName additional.fields キーが「ConnectionName」の追加フィールドとして追加されます。
Data.ConnectionType additional.fields キーが「ConnectionType」の追加フィールドとして追加されます。
Data.DefinitionId additional.fields キーが「DefinitionId」の追加フィールドとして追加されます。
Data.DeploymentResult additional.fields キーが「DeploymentResult」の追加フィールドとして追加されます。
Data.DisplayName target.resource.name PipelineNameNamespaceName が存在しない場合、target.resource.name にマッピングされます。
Data.EndpointIdList additional.fields キーが「EndpointIdList」の追加フィールドとして追加されます。
Data.EnvironmentName additional.fields キーが「EnvironmentName」の追加フィールドとして追加されます。
Data.Filter.continuationToken target.resource.attribute.labels キー「continuation_token」のラベルとして追加されます。
Data.Filter.endTime target.resource.attribute.labels キー「filter_end_time」のラベルとして追加されます。
Data.Filter.startTime target.resource.attribute.labels キー「filter_start_time」のラベルとして追加されます。
Data.FinishTime additional.fields キーが「FinishTime」の追加フィールドとして追加されます。
Data.GroupId target.group.product_object_id Data.Updates.0.GroupId が存在しない場合、target.group.product_object_id に直接マッピングされます。
Data.GroupName target.group.group_display_name target.group.group_display_name に直接マッピングされます。
Data.JobName additional.fields キーが「JobName」の追加フィールドとして追加されます。
Data.MemberId target.user.userid Data.Updates.0.MemberId が存在しない場合、target.user.userid に直接マッピングされます。
Data.MemberDisplayName target.user.user_display_name target.user.user_display_name に直接マッピングされます。
Data.NamespaceId target.resource.product_object_id PipelineIdAuthorizationIdAgentId が存在しない場合、target.resource.product_object_id にマッピングされます。
Data.NamespaceName target.resource.name PipelineName が存在しない場合、target.resource.name にマッピングされます。
Data.ownerDetails additional.fields キーが「OwnerDetails」の追加フィールドとして追加されます。
Data.OwnerId additional.fields キー「OwnerId」の追加フィールドとして追加されました。
Data.PipelineId target.resource.product_object_id target.resource.product_object_id に直接マッピングされます。
Data.PipelineName target.resource.name target.resource.name に直接マッピングされます。
Data.PipelineRevision target.resource.attribute.labels キー「PipelineRevision」のラベルとして追加されます。
Data.PipelineScope target.resource.attribute.labels キー「PipelineScope」のラベルとして追加されます。
Data.PlanType additional.fields キーが「PlanType」の追加フィールドとして追加されます。
Data.PreviousAccessLevel target.resource.attribute.labels キー「PreviousAccessLevel」のラベルとして追加されます。
Data.PublisherName target.resource.attribute.labels キー「PublisherName」のラベルとして追加されます。
Data.Reason additional.fields キーが「Reason」の追加フィールドとして追加されます。
Data.ReleaseId additional.fields キーが「ReleaseId」の追加フィールドとして追加されます。
Data.ReleaseName additional.fields キーが「ReleaseName」の追加フィールドとして追加されます。
Data.RequesterId additional.fields キーが「RequesterId」の追加フィールドとして追加されます。
Data.RetentionLeaseId additional.fields キーが「RetentionLeaseId」の追加フィールドとして追加されます。
Data.RetentionOwnerId additional.fields キーが「RetentionOwnerId」の追加フィールドとして追加されます。
Data.RunName additional.fields キーが「RunName」の追加フィールドとして追加されます。
Data.Scopes target.resource.attribute.labels キー「Scope」のラベルとして追加されます。
Data.StageName additional.fields キーが「StageName」の追加フィールドとして追加されます。
Data.StartTime additional.fields キーが「StartTime」の追加フィールドとして追加されます。
Data.TargetUser target.user.userid target.user.userid に直接マッピングされます。
Data.Timestamp metadata.event_timestamp 解析され、metadata.event_timestamp にマッピングされます。
Data.TokenType target.resource.attribute.labels キー「TokenType」のラベルとして追加されます。
Data.Updates.0.GroupId target.group.product_object_id target.group.product_object_id に直接マッピングされます。
Data.Updates.0.MemberId target.user.userid target.user.userid に直接マッピングされます。
Data.ValidFrom target.resource.attribute.labels キー「ValidFrom」のラベルとして追加されます。
Data.ValidTo target.resource.attribute.labels キー「ValidTo」のラベルとして追加されます。
DewPoint additional.fields キーが「DewPoint」の追加フィールドとして追加されます。
Details metadata.description metadata.description に直接マッピングされます。
Humidity additional.fields キーが「Humidity」の追加フィールドとして追加されます。
Icon additional.fields キーが「Icon」の追加フィールドとして追加されます。
Id metadata.product_log_id metadata.product_log_id に直接マッピングされます。
IpAddress principal.ip principal.ip に直接マッピングされます。
MoonPhase additional.fields キーが「MoonPhase」の追加フィールドとして追加されます。
Moonrise additional.fields キーが「Moonrise」の追加フィールドとして追加されます。
Moonset additional.fields キーが「Moonset」の追加フィールドとして追加されます。
OperationName metadata.product_event_type metadata.product_event_type に直接マッピングされます。
Precipitation additional.fields キーが「Precipitation」の追加フィールドとして追加されます。
Pressure additional.fields キーが「Pressure」の追加フィールドとして追加されます。
ProjectId target.resource_ancestors.product_object_id 祖先が CLOUD_PROJECT 型の場合に、target.resource_ancestors 内の product_object_id フィールドに値を設定するために使用されます。
ProjectName target.resource_ancestors.nametarget.resource.attribute.labels 祖先が CLOUD_PROJECT 型の場合に、target.resource_ancestors 内の name フィールドに値を設定するために使用されます。また、キー「ProjectName」で target.resource.attribute.labels にラベルとして追加されます。
RoleLocation target.location.name target.location.name に直接マッピングされます。
ScopeDisplayName target.resource_ancestors.name 祖先が CLOUD_ORGANIZATION 型の場合に、target.resource_ancestors 内の name フィールドに値を設定するために使用されます。
ScopeId target.resource_ancestors.product_object_id 祖先が CLOUD_ORGANIZATION 型の場合に、target.resource_ancestors 内の product_object_id フィールドに値を設定するために使用されます。
ScopeType additional.fields キーが「ScopeType」の追加フィールドとして追加されます。
Sunrise additional.fields キーが「Sunrise」の追加フィールドとして追加されます。
Sunset additional.fields キーが「Sunset」の追加フィールドとして追加されます。
Temperature additional.fields キーが「Temperature」の追加フィールドとして追加されます。
TenantId metadata.product_deployment_idadditional.fields metadata.product_deployment_id に直接マッピングされます。また、キーが「TenantId」の追加フィールドも追加されます。
TimeGenerated metadata.event_timestamp 解析され、metadata.event_timestamp にマッピングされます。
UserAgent network.http.user_agentnetwork.http.parsed_user_agent network.http.user_agent に直接マッピングされます。解析され、network.http.parsed_user_agent にマッピングされます。
UVIndex additional.fields キーが「UVIndex」の追加フィールドとして追加されます。
Visibility additional.fields キーが「Visibility」の追加フィールドとして追加されます。
WindDirection additional.fields キーが「WindDirection」の追加フィールドとして追加されます。
WindSpeed additional.fields キーが「WindSpeed」の追加フィールドとして追加されます。
_Internal_WorkspaceResourceId additional.fields キーが「workspace_resource_id」の追加フィールドとして追加されます。
なし metadata.event_type OperationName などのフィールドに基づくロジックによって決定されます。特定のイベントタイプが一致しない場合のデフォルトは「GENERIC_EVENT」です。有効な値は、「STATUS_SHUTDOWN」、「RESOURCE_CREATION」、「STATUS_UPDATE」、「USER_RESOURCE_DELETION」、「RESOURCE_READ」、「RESOURCE_WRITTEN」、「RESOURCE_DELETION」、「GROUP_MODIFICATION」です。
なし metadata.vendor_name 「Microsoft」に設定します。
なし metadata.product_name 「Azure DevOps」に設定します。
なし metadata.log_type 「AZURE_DEVOPS」に設定します。
なし principal.user.account_type AuthenticationMechanism に「ServicePrincipal」が含まれている場合は「SERVICE_ACCOUNT_TYPE」に設定し、それ以外の場合は「CLOUD_ACCOUNT_TYPE」に設定します。
なし target.asset.attribute.cloud.environment MICROSOFT_AZURE に設定します。
なし security_result.action 成功したオペレーション(Succeeded、Created、Modified、executed、updated、removed)の場合は「ALLOW」、失敗したオペレーション(Failed、TimedOut)の場合は「BLOCK」に設定します。
なし extensions.auth.mechanism summary が「UserAuthToken」の場合は、「USERNAME_PASSWORD」に設定します。
なし target.resource.resource_type pipeline_id が存在する場合は「SETTING」、authorization_id が存在する場合は「CREDENTIAL」、agent_id が存在する場合は「DEVICE」、namespace_id が存在する場合は「DATABASE」に設定されます。それ以外の場合は、operationName に基づいて「STORAGE_BUCKET」に設定される場合があります。
なし target.resource.resource_subtype pipeline_id が存在する場合は「Pipeline」、authorization_id が存在する場合は「Token」、agent_id が存在する場合は「Agent」、namespace_id が存在する場合は「Namespace」に設定します。

変更点

2024-01-19

  • プリンシパル ユーザーデータとターゲット リソースデータが存在する場合に、「metadata.eventtype」の値を「SERVICE*」から「USER_RESOURCE_UPDATE_CONTENT」に変更しました。
  • 「IpAddress」のマッピングを「target.ip」から「principal.ip」に変更しました。
  • 「ActorCUID」のマッピングを「principal.user.product_object_id」から「additional.fields」に変更しました。
  • 「ScopeId」のマッピングを「principal.asset_id」から「resource_ancestors.product_object_id」に変更しました。
  • 「_Internal_WorkspaceResourceId」のマッピングを「target.resource.product_object_id」から「additional.fields」に変更しました。
  • 「ProjectId」のマッピングを「target.resource.attribute.labels」から「target.resource_ancestors.product_object_id」に変更しました。
  • 「AuthenticationMechanism」のマッピングを「security_result.summary」から「extensions.auth.auth_details」に変更しました。
  • 「CorrelationId」のマッピングを「network.session_id」から「additional.fields」に変更しました。
  • 「ScopeDisplayName」のマッピングを「additional.fields」から「target.resource_ancestors.name」に変更しました。
  • 「PipelineId」のマッピングを「additional.fields」から「target.resource.product_object_id」に変更しました。
  • 「PipelineName」のマッピングを「additional.fields」から「target.resource.name」に変更しました。
  • 「PipelineScope」のマッピングを「additional.fields」から「target.resource.attribute.labels」に変更しました。
  • 「PipelineRevision」のマッピングを「additional.fields」から「target.resource.attribute.labels」に変更しました。
  • 「ProjectId」のマッピングを「target.resource.resource.attribute.labels」から「target.resource_ancestors.product_object_id」に変更しました。
  • 「Area」のマッピングを「additional.fields」から「target.application」に変更しました。
  • 「MICROSOFT_AZURE」値を「target.asset.attribute.cloud.environment」にマッピングしました。
  • 「AuthenticationMechanism」の値が「ServicePrincipal」の場合、「SERVICE_ACCOUNT_TYPE」を「principal.user.account_type」に設定します。それ以外の場合は、「CLOUD_ACCOUNT_TYPE」を「principal.user.account_type」に設定します。
  • 「Category」を「security_result.action_details」にマッピングしました。
  • 「Details」フィールドに基づいて、「ALLOW」または「BLOCK」を「security_result.action」にマッピングしました。
  • 「ActivityId」を「additional.fields」にマッピングしました。

2024-01-09

  • 未解析の JSON ログを解析するための Grok と gsub を追加しました。
  • 「rec.correlationId」、「properties.currentHealthStatus」、「properties.previousHealthStatus」、「properties.type」、「properties.cause」、「properties.title」、「properties.details」、「properties.recommendationType」、「properties.recommendationCategory」、「properties.recommendationImpact」、「properties.recommendationName」、「properties.recommendationResourceLink」、「properties.recommendationSchemaVersion」、「properties.eventCategory」、「properties.hierarchy」、「properties.message」、「properties.entity」、「identity.claims.xms.tcdt」、「identity.claims.aio」、「identity.claims.appid」、「identity.claims.appidacr」、「identity.claims.aud」、「identity.claims.exp」、「identity.claims.iat」、「identity.claims.idtyp」、「identity.claims.iss」、「identity.claims.uti」、「identity.claims.rh」、「identity.claims.ver」、「identity.claims.nbf」、「identity.authorization.evidence.roleAssignmentId」、「identity.authorization.evidence.principalType」、「identity.authorization.evidence.principalId」、「identity.authorization.evidence.roleAssignmentScope」、「identity.authorization.evidence.roleDefinitionId」を「security_result.detection_fields」にマッピングしました。
  • 「resultSignature.label」、「rec.resultType」、「Visibility」、「Humidity」、「Precipitation」、「MoonPhase」、「Moonrise」、「Moonset」、「Pressure」、「WindSpeed」、「UVIndex」、「DewPoint」、「WindDirection」、「Sunrise」、「Sunset」、「Temperature」、「Icon」、「Conditions」を「additional.fields」にマッピングしました。
  • 「level」を「security_result.severity」にマッピングしました。
  • 「appname」を「target.application」にマッピングしました。
  • 「category.details」を「security.result.category.details」にマッピングしました。
  • 「rec.resourceId」を「target.resource.id」にマッピングしました。
  • 「res.extensionResourceName」を「principal.hostname」にマッピングしました。

2023-11-23

  • JSON ログの新しいパターンに対応しました。
  • 「data.TimeGenerated」を「metadata.event_timestamp」にマッピングしました。
  • 「_Internal_WorkspaceResourceId」が存在しない場合、「topic」を「target.resource.product_object_id」にマッピングしました。
  • 「data.Data.ConnectionId」を「additional.fields」にマッピングしました。
  • 「data.Data.ownerDetails」を「additional.fields」にマッピングしました。
  • 「data.Data.DeploymentResult」を「additional.fields」にマッピングしました。
  • 「data.Data.EnvironmentName」を「additional.fields」にマッピングしました。
  • 「data.Data.JobName」を「additional.fields」にマッピングしました。
  • 「data.Data.StageName」を「additional.fields」にマッピングしました。
  • 「data.Data.RunName」を「additional.fields」にマッピングしました。
  • 「data.Data.RetentionLeaseId」を「additional.fields」にマッピングしました。
  • 「data.Data.CheckSuiteId」を「additional.fields」にマッピングしました。
  • 「data.Data.CheckSuiteStatus」を「additional.fields」にマッピングしました。
  • 「data.Data.ApprovalRequest」を「additional.fields」にマッピングしました。
  • 「data.Data.ApprovalType」を「additional.fields」にマッピングしました。
  • 「subject」を「additional.fields」にマッピングしました。
  • 「data.ActorUserId」を「principal.user.userid」にマッピングしました。
  • 「data.ActorDisplayName」を「principal.user.user_display_name」にマッピングしました。
  • 「data.ActorCUID」を「principal.user.product_object_id」にマッピングしました。
  • 「data.ActorUPN」を「principal.user.email_addresses」にマッピングしました。
  • 「data.ScopeId」を「principal.asset_id」にマッピングしました。
  • 「data.CorrelationId」を「network.session_id」にマッピングしました。
  • 「data.UserAgent」を「network.http.user_agent」にマッピングしました。
  • 「data.ProjectId」を「target.resource.attribute.labels」にマッピングしました。
  • 「data.ScopeType」を「additional.fields」にマッピングしました。
  • 「data.ProjectName」を「target.resource.attribute.labels」にマッピングしました。
  • 「data.Details」を「metadata.description」にマッピングしました。
  • 「data.CategoryDisplayName」を「security_result.rule_name」にマッピングしました。
  • 「data.Area」を「additional.fields」にマッピングしました。
  • 「data.Id」を「metadata.product_log_id」にマッピングしました。
  • 「data.ActionId」を「metadata.product_event_type」にマッピングしました。
  • 「data.Timestamp」を「metadata.event_timestamp」にマッピングしました。

2022-06-28

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

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