Azure DevOps 監査ログを収集する
概要
このパーサーは、JSON 形式の Azure DevOps 監査ログを処理します。ネストされた JSON 構造と最上位の JSON 構造からフィールドを抽出し、UDM にマッピングします。特定のフィールド値に基づく条件ロジックにより、イベントが分類され、関連するセキュリティ情報で出力が拡充されます。パーサーは、grok パターンを使用して JSON ペイロードの抽出を試みることで、JSON 形式以外のメッセージも処理します。
始める前に
次の前提条件を満たしていることを確認します。
- Google SecOps インスタンス
- アクティブな Azure DevOps 組織
- Azure Devops 組織と Azure への特権アクセス
フィードを設定する
Google SecOps プラットフォームでフィードを設定するには、次の 2 つのエントリ ポイントがあります。
- [SIEM 設定] > [フィード]
- [Content Hub] > [Content Packs]
[SIEM 設定] > [フィード] でフィードを設定する
このプロダクト ファミリー内で異なるログタイプに対して複数のフィードを構成するには、プロダクトごとにフィードを構成するをご覧ください。
1 つのフィードを設定する手順は次のとおりです。
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- 次のページで、[単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: Azure Devops Logs)。
- [Source type] として [Webhook] を選択します。
- [ログタイプ] として [Azure Devops Audit] を選択します。
- [次へ] をクリックします。
- 省略可: 次の入力パラメータの値を指定します。
- Split delimiter: ログ行を区切るために使用される区切り文字(
\n
など)。 - アセットの名前空間: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
- Split delimiter: ログ行を区切るために使用される区切り文字(
- [次へ] をクリックします。
- [Finalize] 画面でフィードの設定を確認し、[Submit] をクリックします。
- [秘密鍵を生成する] をクリックして、このフィードを認証するためのシークレット キーを生成します。
- 秘密鍵をコピーして保存します。この秘密鍵を再び表示することはできません。必要に応じて、新しい秘密鍵を再生成できますが、この操作により以前の秘密鍵は無効になります。
- [詳細] タブで、[エンドポイント情報] フィールドから、フィードのエンドポイント URL をコピーします。このエンドポイント URL をクライアント アプリケーション内で指定する必要があります。
- [完了] をクリックします。
コンテンツ ハブからフィードを設定する
次のフィールドに値を指定します。
- Split delimiter: ログ行を区切るために使用される区切り文字(
\n
など)。
詳細オプション
- フィード名: フィードを識別する事前入力された値。
- ソースタイプ: Google SecOps にログを収集するために使用される方法。
- アセットの名前空間: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
- [次へ] をクリックします。
- [Finalize] 画面でフィードの設定を確認し、[Submit] をクリックします。
- [秘密鍵を生成する] をクリックして、このフィードを認証するためのシークレット キーを生成します。
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
: フィードの認証用に生成した秘密鍵。
Azure DevOps で監査機能を構成する
- 組織(
https://dev.azure.com/{yourorganization}
)にログインします。 - [組織の設定] の歯車アイコンを選択します。
- [セキュリティ] で [ポリシー] を選択します。
- [監査イベントをログに記録する] ボタンを [オン] に切り替えます。
Azure で Event Grid トピックを構成する
- Azure Portal にログインします。
- Event Grid を検索してアクセスします。
- [カスタム イベント] の [トピック] を見つけます。
- [+ 作成] をクリックします。
- サブスクリプションとリソース グループを選択します。名前(例:
DevopsAuditLog
)を指定して、リージョンを選択します。[確認して作成] をクリックします。 - 新しいトピックにアクセスし、トピック エンドポイント URL をコピーします。
- [Settings] > [Access Keys] に移動し、[Key 1] をコピーします。
Azure DevOps ログ ストリームを Event Grid に構成する
- 組織(
https://dev.azure.com/{yourorganization}
)にログインします。 - [組織の設定] の歯車アイコンを選択します。
- [監査] を選択します。
- [ストリーム] タブに移動し、[新しいストリーム] > [Event Grid] を選択します。
- Azure で Event Grid トピックを構成するで作成したトピック エンドポイントとアクセスキーを入力します。
Google SecOps 用に Azure DevOps で Webhook を構成する
- Azure Portal で、Event Grid を検索してアクセスします。
- 以前に作成したトピックを選択します。
- [Entities] > [Event Subscription] に移動します。
- [+ イベント サブスクリプション] をクリックします。
- わかりやすい名前を指定します(*
Google SecOps Integration
など)。 - [Web Hook] を選択し、[エンドポイントを構成] をクリックします。
- エンドポイントを構成します。
- サブスクライバー エンドポイント: Google SecOps API エンドポイント URL を入力します。
- [HTTP ヘッダー] セクションで、次のヘッダーを追加します。
- ヘッダー 1:
- キー:
X-goog-api-key
- 値: Webhook フィード用の API キーを作成するで作成した API キー。
- キー:
- ヘッダー 2:
- キー:
X-Webhook-Access-Key
- 値: Azure Devops のログを取り込むように Google SecOps でフィードを構成するセクションで生成したシークレット キー。
- キー:
- ヘッダー 1:
- Content-Type ヘッダーを
application/json
に設定します。
- [作成] をクリックします。
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_details 、security_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 |
キーが「Conditions」の追加フィールドとして追加されます。 |
Country |
principal.location.country_or_region |
Country フィールドから直接マッピングされます。 |
Data.* |
各種 | Data オブジェクト内のフィールドは、名前とコンテキストに基づいて異なる UDM フィールドにマッピングされます。具体的な例については、以下をご覧ください。 |
Data.AccessLevel |
target.resource.attribute.labels |
キー「AccessLevel」のラベルとして追加されます。 |
Data.AgentId |
target.resource.product_object_id |
PipelineId と AuthorizationId が存在しない場合、target.resource.product_object_id にマッピングされます。 |
Data.AgentName |
target.resource.name |
PipelineName 、NamespaceName 、DisplayName が存在しない場合は、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 |
PipelineName と NamespaceName が存在しない場合、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 |
PipelineId 、AuthorizationId 、AgentId が存在しない場合は、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.name 、target.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_id 、additional.fields |
metadata.product_deployment_id に直接マッピングされます。また、キーが「TenantId」の追加フィールドも追加されます。 |
TimeGenerated |
metadata.event_timestamp |
解析され、metadata.event_timestamp にマッピングされます。 |
UserAgent |
network.http.user_agent 、network.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」に設定します。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。