收集 Azure AD 登录日志
支持的平台:
Google SecOps
SIEM
本文档介绍了如何使用 Azure 存储账号将 Azure AD 登录日志导出到 Google 安全运营中心。解析器会接受 JSON 格式的原始日志,并将其转换为符合统一数据模型 (UDM) 的结构化格式。它会提取相关字段、规范化值、处理不同的时间戳,并使用安全相关上下文(例如用户信息、IP 地址和条件式访问权限政策)来丰富数据。
准备工作
- 确保您拥有 Google SecOps 实例。
- 确保您拥有有效的 Azure 租户。
- 确保您拥有对 Azure 的特权访问权限。
配置 Azure 存储账号
- 在 Azure 控制台中,搜索存储账号。
- 点击 + 创建。
- 为以下输入参数指定值:
- 订阅:选择相应订阅。
- 资源组:选择资源组。
- 地区:选择地区。
- 效果:选择效果(推荐“标准”)。
- 冗余:选择冗余级别(建议使用 GRS 或 LRS)。
- 存储账号名称:为新存储账号输入名称。
- 点击 Review + create(检查 + 创建)。
- 查看账号概览,然后点击创建。
- 在存储账号概览页面上,选择安全 + 网络中的访问密钥子菜单。
- 点击 key1 或 key2 旁边的显示
- 点击复制到剪贴板以复制密钥。
- 将密钥保存在安全的位置,以备日后使用。
- 在存储账号概览页面中,选择设置中的端点子菜单。
- 点击复制到剪贴板,复制 Blob 服务端点网址(例如
https://<storageaccountname>.blob.core.windows.net
) - 将端点网址保存在安全的位置,以备日后使用。
为 Azure AD 登录日志配置日志导出
- 使用特权账号登录 Azure 门户。
- 依次前往 Microsoft Entra ID > 监控 > 诊断设置。
- 点击添加诊断设置。
- 为诊断设置输入描述性名称。
- 选择登录日志。
- 选择归档到存储账号复选框作为目标位置。
- 指定订阅和存储空间账号。
在 Google SecOps 中配置 Feed 以提取 Azure 登录日志
- 依次前往 SIEM 设置 > Feed。
- 点击新增。
- 在Feed 名称字段中,输入 Feed 的名称(例如 Azure 登录日志)。
- 选择 Microsoft Azure Blob Storage 作为来源类型。
- 选择 Azure 登录作为日志类型。
- 点击下一步。
为以下输入参数指定值:
- Azure URI:Blob 端点网址。
ENDPOINT_URL/BLOB_NAME
- 替换以下内容:
ENDPOINT_URL
:blob 端点网址 (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
:blob 的名称(例如insights-logs-<logname>
)
- URI 是:根据日志流配置选择 URI 类型(单个文件 | 目录 | 包含子目录的目录)。
来源删除选项:根据您的偏好选择删除选项。
共享密钥:Azure Blob Storage 的访问密钥。
资源命名空间:资源命名空间。
提取标签:要应用于此 Feed 中的事件的标签。
- Azure URI:Blob 端点网址。
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
UDM 映射表
日志字段 | UDM 映射 | 逻辑 |
---|---|---|
AppDisplayName | read_only_udm.target.application | 直接从原始日志中的 AppDisplayName 字段映射。 |
AppId | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 AppId 字段映射而来。该键设置为 appId 。 |
类别 | read_only_udm.security_result.category_details | 直接从原始日志中的 Category 字段映射。 |
ConditionalAccessPolicies[].displayName | read_only_udm.security_result.rule_name | 直接从原始日志中的 ConditionalAccessPolicies 数组内的 displayName 字段映射而来。 |
ConditionalAccessPolicies[].enforcedGrantControls[] | read_only_udm.security_result.rule_labels.value | 直接从原始日志中的 ConditionalAccessPolicies 数组内的 enforcedGrantControls 数组映射而来。该键设置为 applied_conditional_access_policies_enforced_grant_controls 。 |
ConditionalAccessPolicies[].enforcedSessionControls[] | read_only_udm.security_result.rule_labels.value | 直接从原始日志中的 ConditionalAccessPolicies 数组内的 enforcedSessionControls 数组映射而来。该键设置为 applied_conditional_access_policies_enforced_session_controls 。 |
ConditionalAccessPolicies[].id | read_only_udm.security_result.rule_id | 直接从原始日志中的 ConditionalAccessPolicies 数组内的 id 字段映射而来。 |
ConditionalAccessPolicies[].Result | read_only_udm.security_result.rule_labels.value | 直接从原始日志中的 ConditionalAccessPolicies 数组内的 Result 字段映射而来。该键设置为 applied_conditional_access_policies_result 。 |
ConditionalAccessStatus | read_only_udm.additional.fields.value.string_value | 直接从原始日志中的 ConditionalAccessStatus 字段映射而来。该键设置为 conditionalAccessStatus 。 |
CorrelationId | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 CorrelationId 字段映射而来。该键设置为 correlationId 。 |
DurationMs | read_only_udm.additional.fields.value.string_value | 直接从原始日志中的 DurationMs 字段映射而来。该键设置为 durationMs 。 |
HomeTenantId | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 HomeTenantId 字段映射而来。该键设置为 HomeTenantId 。 |
IPAddress | read_only_udm.principal.asset.ip、read_only_udm.principal.ip | 直接从原始日志中的 IPAddress 字段映射。 |
ID | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 Id 字段映射而来。该键设置为 id 。 |
身份 | read_only_udm.target.resource.attribute.labels.value | 直接从原始日志中的 Identity 字段映射而来。该键设置为 identity 。 |
级别 | read_only_udm.security_result.severity、read_only_udm.security_result.severity_details | 直接从原始日志中的 Level 字段映射而来。严重程度基于 Level 的值确定:Information 、Informational 、0 或 4 映射到 INFORMATIONAL ;Warning 、1 或 3 映射到 MEDIUM ;Error 或 2 映射到 ERROR ;Critical 映射到 CRITICAL 。 |
OperationName | read_only_udm.metadata.product_event_type | 直接从原始日志中的 OperationName 字段映射。 |
ResourceGroup | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 ResourceGroup 字段映射而来。该键设置为 ResourceGroup 。 |
ResultSignature | read_only_udm.additional.fields.value.string_value | 直接从原始日志中的 ResultSignature 字段映射而来。该键设置为 resultSignature 。 |
ResultType | read_only_udm.additional.fields.value.string_value | 直接从原始日志中的 ResultType 字段映射而来。该键设置为 resultType 。 |
TenantId | read_only_udm.metadata.product_deployment_id | 直接从原始日志中的 TenantId 字段映射。 |
TimeGenerated | read_only_udm.metadata.event_timestamp.seconds、read_only_udm.metadata.event_timestamp.nanos | 直接从原始日志中的 TimeGenerated 字段映射而来。该字段会解析为时间戳,并用于填充 seconds 和 nanos 字段。 |
TokenIssuerType | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 TokenIssuerType 字段映射而来。该键设置为 TokenIssuerType 。 |
UniqueTokenIdentifier | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 UniqueTokenIdentifier 字段映射而来。该键设置为 UniqueTokenIdentifier 。 |
UserAgent | read_only_udm.network.http.user_agent、read_only_udm.network.http.parsed_user_agent | 直接从原始日志中的 UserAgent 字段映射而来。该字段会解析为用户代理字符串,并用于填充 parsed_user_agent 对象。 |
UserDisplayName | read_only_udm.target.user.user_display_name | 直接从原始日志中的 UserDisplayName 字段映射。 |
UserId | read_only_udm.target.user.userid | 直接从原始日志中的 UserId 字段映射。 |
UserPrincipalName | read_only_udm.target.user.email_addresses | 直接从原始日志中的 UserPrincipalName 字段映射而来,但前提是该字段与电子邮件地址模式匹配。 |
UserType | read_only_udm.target.user.attribute.roles.name | 直接从原始日志中的 UserType 字段映射。 |
_Internal_WorkspaceResourceId | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 _Internal_WorkspaceResourceId 字段映射而来。该键设置为 Internal_WorkspaceResourceId 。 |
_ItemId | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 _ItemId 字段映射而来。该键设置为 ItemId 。 |
properties.appId | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 properties 对象的 appId 字段映射而来。该键设置为 appId 。 |
properties.authenticationDetails[].authenticationMethod | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 authenticationDetails 数组内的 authenticationMethod 字段映射而来。该键设置为 authenticationMethod 。 |
properties.authenticationDetails[].authenticationMethodDetail | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 authenticationDetails 数组内的 authenticationMethodDetail 字段映射而来。该键设置为 authenticationMethodDetail 。 |
properties.authenticationDetails[].authenticationStepDateTime | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 authenticationDetails 数组内的 authenticationStepDateTime 字段映射而来。该键设置为 authenticationStepDateTime 。 |
properties.authenticationDetails[].authenticationStepRequirement | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 authenticationDetails 数组内的 authenticationStepRequirement 字段映射而来。该键设置为 authenticationStepRequirement 。 |
properties.authenticationDetails[].authenticationStepResultDetail | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 authenticationDetails 数组内的 authenticationStepResultDetail 字段映射而来。该键设置为 authenticationStepResultDetail 。 |
properties.authenticationDetails[].succeeded | read_only_udm.security_result.action、read_only_udm.security_result.action_details | 直接从原始日志中的 authenticationDetails 数组内的 succeeded 字段映射而来。如果值为 true ,则操作设置为 ALLOW ;否则,操作设置为 BLOCK 。 |
properties.conditionalAccessStatus | read_only_udm.additional.fields.value.string_value | 直接从原始日志中的 properties 对象的 conditionalAccessStatus 字段映射而来。该键设置为 conditionalAccessStatus 。 |
properties.id | read_only_udm.security_result.detection_fields.value | 直接从原始日志中的 properties 对象的 id 字段映射而来。该键设置为 id 。 |
properties.status.errorCode | read_only_udm.security_result.action | 如果值为 0,则将操作设置为 ALLOW ;否则,将其设置为 BLOCK 。 |
properties.userId | read_only_udm.target.user.userid | 直接从原始日志中的 properties 对象内的 userId 字段映射而来。 |
properties.userPrincipalName | read_only_udm.target.user.email_addresses | 直接从原始日志中的 properties 对象内的 userPrincipalName 字段映射而来,但前提是该字段与电子邮件地址模式匹配。 |
resourceId | read_only_udm.target.resource.name | 直接从原始日志中的 resourceId 字段映射。 |
时间 | read_only_udm.metadata.event_timestamp.seconds、read_only_udm.metadata.event_timestamp.nanos | 直接从原始日志中的 time 字段映射而来。该字段会被解析为时间戳,并用于填充 seconds 和 nanos 字段。 |
read_only_udm.extensions.auth.type | 该值设置为 AUTHTYPE_UNSPECIFIED 。 |
|
read_only_udm.metadata.event_type | 该值取决于 principal.ip 和 target.user.userid 字段是否存在:如果这两个字段都存在,则类型设置为 USER_LOGIN ;如果仅存在 principal.ip ,则类型设置为 STATUS_UPDATE ;否则,类型设置为 GENERIC_EVENT 。 |
变化
2024-05-07
- 新创建的解析器
需要更多帮助?向社区成员和 Google SecOps 专业人士寻求解答。