收集 Microsoft Azure AD 上下文日志
本文档介绍了如何通过设置 Google 安全运维 Feed 来收集 Microsoft Azure Active Directory (AD) 日志。
Azure Active Directory (AZURE_AD
) 现已更名为 Microsoft Entra ID。Azure AD 审核日志 (AZURE_AD_AUDIT
) 现已更名为 Microsoft Entra ID 审核日志。
如需了解详情,请参阅将数据提取到 Google 安全运营中心。
注入标签标识将原始日志数据标准化为结构化 UDM 格式的解析器。
准备工作
如需完成本页中的任务,请确保您拥有以下各项:
- 您可以登录的 Azure 订阅。
- 全局管理员或 Azure AD 管理员角色。
- Azure 中的 Azure AD(租户)。
配置 Azure AD
- 登录 Azure 门户。
- 依次前往首页 > 应用注册,选择已注册的应用,或者如果您尚未创建应用,则注册应用。
- 如需注册应用,请在应用注册部分中,点击新注册。
- 在名称字段中,提供应用的显示名称。
- 在 Supported account types(支持的账号类型)部分,选择所需选项以指定哪些人可以使用该应用或访问该 API。
- 点击注册。
- 前往概览页面,复制应用(客户端)ID 和目录(租户)ID,这些信息是配置 Google Security Operations Feed 所必需的。
- 点击 API 权限。
- 点击添加权限,然后在新窗格中选择 Microsoft Graph。
- 点击应用权限。
- 选择 AuditLog.Read.All、Directory.Read.All 和 SecurityEvents.Read.All 权限。确保权限是应用权限,而不是委托权限。
- 点击为默认目录授予管理员同意书。在用户或管理员在意见征求流程中向应用授予权限后,应用便可以调用 API。
- 依次前往设置 > 管理。
- 点击证书和 Secret。
- 点击 New client secret(新建客户端密钥)。 Value 字段中会显示客户端密钥。
- 复制客户端密钥值。此值仅在创建时显示,并且是进行 Azure 应用注册和配置 Google 安全运营 Feed 所必需的。
在 Google Security Operations 中配置 Feed 以提取 Azure AD 上下文日志
- 依次选择 SIEM 设置 > Feed。
- 点击新增。
- 为Feed 名称输入一个具有唯一性的名称。
- 选择第三方 API 作为来源类型。
- 选择 Azure AD Organizational Context 作为日志类型。
- 点击下一步。
- 配置以下必需的输入参数:
- OAUTH 客户端 ID:指定您之前获取的客户端 ID。
- OAUTH 客户端密钥:指定您之前获取的客户端密钥。
- 租户 ID:指定您之前获得的租户 ID。
- 点击下一步,然后点击提交。
如需详细了解 Google Security Operations Feed,请参阅 Google Security Operations Feed 文档。如需了解每种 Feed 类型的要求,请参阅按类型配置 Feed。如果您在创建 Feed 时遇到问题,请与 Google 安全运营支持团队联系。
字段映射参考文档
此解析器代码会将 Azure Active Directory 中的原始 JSON 格式日志转换为统一数据模型 (UDM)。它会提取用户和经理信息(包括属性、角色、关系和标签),同时处理各种数据不一致问题,并使用标准化字段丰富输出。
UDM 映射表
日志字段 | UDM 映射 | 逻辑 |
---|---|---|
businessPhones | user.phone_numbers | 直接从原始日志中的 businessPhones 字段映射而来。系统会提取多个电话号码,并将其映射为单独的条目。 |
city | user.personal_address.city | 直接从原始日志中的 city 字段映射。 |
companyName | user.company_name | 直接从原始日志中的 companyName 字段映射。 |
国家/地区 | user.personal_address.country_or_region | 直接从原始日志中的 country 字段映射而来。如果 country 为空,则该值取自 usageLocation 。 |
createdDateTime | user.attribute.creation_time | 使用 RFC3339 格式将原始日志中的 createdDateTime 字段转换为时间戳。 |
部门 | user.department | 直接从原始日志中的 department 字段映射而来。系统会提取多个部门,并将其映射为单独的条目。 |
displayName | user.user_display_name | 直接从原始日志中的 displayName 字段映射。 |
employeeId | user.employee_id | 直接从原始日志中的 employeeId 字段映射而来。如果 employeeId 为空,则该值取自 extension_employeeNumber 。 |
employeeType | user.attribute.labels.value(键:employeeType) | 直接从原始日志中的 employeeType 字段映射,并作为键为 employeeType 的标签添加。 |
extension_employeeNumber | user.employee_id | 如果 employeeId 为空,则映射到 user.employee_id 。 |
extension_wfc_AccountType | event.idm.entity.entity.labels.value(键:wfc_AccountType) | 直接从原始日志中的 extension_wfc_AccountType 字段映射,并作为键为 wfc_AccountType 的标签添加。 |
extension_wfc_AccountingUnitName | event.idm.entity.entity.labels.value(键:extension_wfc_AccountingUnitName) | 直接从原始日志中的 extension_wfc_AccountingUnitName 字段映射,并作为键为 extension_wfc_AccountingUnitName 的标签添加。 |
extension_wfc_execDescription | event.idm.entity.entity.labels.value(键:extension_wfc_execDescription) | 直接从原始日志中的 extension_wfc_execDescription 字段映射,并作为键为 extension_wfc_execDescription 的标签添加。 |
extension_wfc_groupDescription | event.idm.entity.entity.labels.value(键:extension_wfc_groupDescription) | 直接从原始日志中的 extension_wfc_groupDescription 字段映射,并作为键为 extension_wfc_groupDescription 的标签添加。 |
extension_wfc_orgDescription | event.idm.entity.entity.labels.value(键:extension_wfc_orgDescription) | 直接从原始日志中的 extension_wfc_orgDescription 字段映射,并作为键为 extension_wfc_orgDescription 的标签添加。 |
givenName | user.first_name | 直接从原始日志中的 givenName 字段映射。 |
gopher-devices | event.idm.entity.relations | gopher-devices 数组中的每台设备都会映射到一个单独的关系条目。deviceId 映射到 product_object_id ,operatingSystem 和 operatingSystemVersion 组合形成 platform_version ,model 直接映射,createdDateTime 转换为时间戳并映射到 created_timestamp 。将关系设置为 OWNS ,并将方向设置为 UNIDIRECTIONAL 。 |
gopher-groups | event.idm.entity.relations | gopher-groups 数组中的每个组都会映射到单独的关系条目。id 会映射到 product_object_id ,displayName 会映射到 group_display_name 。将关系设置为 MEMBER ,并将方向设置为 UNIDIRECTIONAL 。 |
gopher-manager.businessPhones | empmanager.phone_numbers | 如果 manager 为空,则映射到 empmanager.phone_numbers 。 |
gopher-manager.country | empmanager.personal_address.country_or_region | 如果 manager 为空,则映射到 empmanager.personal_address.country_or_region 。如果 gopher-manager.country 和 gopher-manager.usageLocation 均为空,则该字段会留空。 |
gopher-manager.department | empmanager.department | 如果 manager 为空,则映射到 empmanager.department 。 |
gopher-manager.displayName | empmanager.user_display_name | 如果 manager 为空,则映射到 empmanager.user_display_name 。 |
gopher-manager.employeeId | empmanager.employee_id | 如果 manager 为空且 gopher-manager.employeeId 不为空,则映射到 empmanager.employee_id 。 |
gopher-manager.extension_employeeNumber | empmanager.employee_id | 如果 manager 和 gopher-manager.employeeId 为空,而 gopher-manager.extension_employeeNumber 不为空,则映射到 empmanager.employee_id 。 |
gopher-manager.givenName | empmanager.first_name | 如果 manager 为空,则映射到 empmanager.first_name 。 |
gopher-manager.id | empmanager.product_object_id | 如果 manager 为空,则映射到 empmanager.product_object_id 。 |
gopher-manager.jobTitle | empmanager.title | 如果 manager 为空,则映射到 empmanager.title 。 |
gopher-manager.mail | empmanager.email_addresses | 如果 manager 为空,则映射到 empmanager.email_addresses 。 |
gopher-manager.onPremisesImmutableId | user.attribute.labels.value(键:gopher-manager onPremisesImmutableId) | 映射为键为 gopher-manager onPremisesImmutableId 的标签。 |
gopher-manager.onPremisesSamAccountName | empmanager.userid | 如果 manager 为空,则映射到 empmanager.userid 。 |
gopher-manager.onPremisesSecurityIdentifier | empmanager.windows_sid | 如果 manager 为空,则映射到 empmanager.windows_sid 。 |
gopher-manager.proxyAddresses | empmanager.email_addresses, empmanager.group_identifiers | 如果 manager 为空,则 gopher-manager.proxyAddresses 数组中的每个地址都会映射到 empmanager.email_addresses 或 empmanager.group_identifiers ,具体取决于其是以“smtp”还是“SMTP”开头。 |
gopher-manager.refreshTokensValidFromDateTime | empmanager.attribute.labels.value(键:refreshTokensValidFromDateTime) | 如果 manager 为空,则映射为键为 refreshTokensValidFromDateTime 的标签。 |
gopher-manager.streetAddress | empmanager.personal_address.name | 如果 manager 为空,则映射到 empmanager.personal_address.name 。 |
gopher-manager.surname | empmanager.last_name | 如果 manager 为空,则映射到 empmanager.last_name 。 |
gopher-manager.usageLocation | user.attribute.labels.value(键:manager_src_usageLocation) | 映射为键为 manager_src_usageLocation 的标签。 |
gopher-manager.userType | empmanager.attribute.roles.name | 如果 manager 为空,则映射到 empmanager.attribute.roles.name 。 |
id | user.product_object_id | 直接从原始日志中的 id 字段映射。 |
身份 | user.attribute.labels.value(键:signInType)、user.attribute.labels.value(键:userPrincipalName) | signInType 会映射为键为 signInType 的标签。如果 signInType 和 userPrincipalName 不为空,则会合并并映射为键为 userPrincipalName 的标签。 |
jobTitle | user.title | 直接从原始日志中的 jobTitle 字段映射。 |
user.email_addresses | 直接从原始日志中的 mail 字段映射而来。如果 mail 以“svc-”开头,则 user_role.type 会设为 SERVICE_ACCOUNT 。 |
|
mailNickname | user.attribute.labels.value(键:mailNickname) | 直接从原始日志中的 mailNickname 字段映射,并作为键为 mailNickname 的标签添加。 |
manager.businessPhones | empmanager.phone_numbers | 如果 gopher-manager 为空,则映射到 empmanager.phone_numbers 。 |
manager.city | empmanager.personal_address.city | 如果 gopher-manager 为空,则映射到 empmanager.personal_address.city 。 |
manager.companyName | empmanager.company_name | 如果 gopher-manager 为空,则映射到 empmanager.company_name 。 |
manager.country | empmanager.personal_address.country_or_region | 如果 gopher-manager 为空,则映射到 empmanager.personal_address.country_or_region 。如果 manager.country 和 manager.usageLocation 均为空,则该字段会留空。 |
manager.department | empmanager.department | 如果 gopher-manager 为空,则映射到 empmanager.department 。 |
manager.displayName | empmanager.user_display_name | 如果 gopher-manager 为空,则映射到 empmanager.user_display_name 。 |
manager.employeeId | empmanager.employee_id | 如果 gopher-manager 为空且 manager.employeeId 不为空,则映射到 empmanager.employee_id 。 |
manager.extension_employeeNumber | empmanager.employee_id | 如果 gopher-manager 和 manager.employeeId 为空,而 manager.extension_employeeNumber 不为空,则映射到 empmanager.employee_id 。 |
manager.givenName | empmanager.first_name | 如果 gopher-manager 为空,则映射到 empmanager.first_name 。 |
manager.id | empmanager.product_object_id | 如果 gopher-manager 为空,则映射到 empmanager.product_object_id 。 |
manager.jobTitle | empmanager.title | 如果 gopher-manager 为空,则映射到 empmanager.title 。 |
manager.mail | empmanager.email_addresses | 如果 gopher-manager 为空,则映射到 empmanager.email_addresses 。 |
manager.onPremisesSamAccountName | empmanager.userid | 如果 gopher-manager 为空,则映射到 empmanager.userid 。 |
manager.onPremisesSecurityIdentifier | empmanager.windows_sid | 如果 gopher-manager 为空,则映射到 empmanager.windows_sid 。 |
manager.proxyAddresses | empmanager.email_addresses, empmanager.group_identifiers | 如果 gopher-manager 为空,则 manager.proxyAddresses 数组中的每个地址都会映射到 empmanager.email_addresses 或 empmanager.group_identifiers ,具体取决于其是否以“smtp”或“SMTP”开头。 |
manager.refreshTokensValidFromDateTime | empmanager.attribute.labels.value(键:refreshTokensValidFromDateTime) | 如果 gopher-manager 为空,则映射为键为 refreshTokensValidFromDateTime 的标签。 |
manager.state | empmanager.personal_address.state | 如果 gopher-manager 为空,则映射到 empmanager.personal_address.state 。 |
manager.streetAddress | empmanager.personal_address.name | 如果 gopher-manager 为空,则映射到 empmanager.personal_address.name 。 |
manager.surname | empmanager.last_name | 如果 gopher-manager 为空,则映射到 empmanager.last_name 。 |
manager.usageLocation | user.attribute.labels.value(键:manager_src_usageLocation)、empmanager.personal_address.country_or_region | 映射为键为 manager_src_usageLocation 的标签。如果 manager.country 为空,则该值也会映射到 empmanager.personal_address.country_or_region 。 |
manager.userType | empmanager.attribute.roles.name | 如果 gopher-manager 为空,则映射到 empmanager.attribute.roles.name 。 |
onPremisesDistinguishedName | user.attribute.labels.value(键:onPremisesDistinguishedName),user.attribute.labels.value(键:onPremisesDistinguishedName-OU 数据) | 完整标识名会映射为键值为 onPremisesDistinguishedName 的标签。系统会提取标识名的组织部门部分,并将其映射为键为 onPremisesDistinguishedName-OU data 的标签。如果 OU 部分包含“Admin”,则 user_role.type 会设置为 ADMINISTRATOR 。如果它包含“服务账号”,则 user_role.type 会设为 SERVICE_ACCOUNT 。 |
onPremisesDomainName | user.group_identifiers、user.attribute.labels.value(键:onPremisesDomainName) | 直接映射到 user.group_identifiers ,并作为键为 onPremisesDomainName 的标签添加。 |
onPremisesImmutableId | user.attribute.labels.value(键:onPremisesImmutableId) | 直接从原始日志中的 onPremisesImmutableId 字段映射,并作为键为 onPremisesImmutableId 的标签添加。 |
onPremisesSamAccountName | user.userid、user.attribute.labels.value(键:onPremisesSamAccountName) | 如果 sAMAccountName 为空,则映射到 user.userid 。还会作为键为 onPremisesSamAccountName 的标签添加。 |
onPremisesSecurityIdentifier | user.windows_sid | 直接从原始日志中的 onPremisesSecurityIdentifier 字段映射。 |
proxyAddresses | user.email_addresses、user.group_identifiers | proxyAddresses 数组中的每个地址都会映射到 user.email_addresses 或 user.group_identifiers ,具体取决于其是以“smtp”还是“SMTP”开头。如果地址以“smtp”或“SMTP”开头,系统会移除“smtp:”或“SMTP:”前缀,并提取剩余的电子邮件地址并将其映射到 user.email_addresses 。 |
refreshTokensValidFromDateTime | user.attribute.labels.value(键:refreshTokensValidFromDateTime) | 直接从原始日志中的 refreshTokensValidFromDateTime 字段映射,并作为键为 refreshTokensValidFromDateTime 的标签添加。 |
sAMAccountName | user.userid | 直接从原始日志中的 sAMAccountName 字段映射。 |
state | user.personal_address.state | 直接从原始日志中的 state 字段映射。 |
streetAddress | user.personal_address.name | 直接从原始日志中的 streetAddress 字段映射。 |
surname | user.last_name | 直接从原始日志中的 surname 字段映射。 |
usageLocation | user.personal_address.country_or_region | 如果 country 为空,则该值会映射到 user.personal_address.country_or_region 。 |
userPrincipalName | user.email_addresses | 直接从原始日志中的 userPrincipalName 字段映射而来。如果 userPrincipalName 以“svc-”开头,则 user_role.type 会设为 SERVICE_ACCOUNT 。 |
userType | user.attribute.roles.name | 直接从原始日志中的 userType 字段映射并添加到 user.attribute.roles.name 。 |
解析器逻辑 | UDM 映射 | 逻辑 |
不适用 | event.idm.entity.metadata.vendor_name | 设置为“Microsoft”。 |
不适用 | event.idm.entity.metadata.product_name | 设置为“Azure Active Directory”。 |
不适用 | event.idm.entity.metadata.entity_type | 设置为“USER”。 |
不适用 | event.idm.entity.metadata.collected_timestamp | 设置为原始日志中的 create_time 字段。 |
accountEnabled | user.user_authentication_status、user.attribute.labels.value(键:accountEnabled) | 如果 accountEnabled 为 true,则 user.user_authentication_status 会设为“ACTIVE”,并添加键为 accountEnabled 且值为“true”的标签。否则,系统会添加键为 accountEnabled 且值为“false”的标签。 |
empmanager-src.accountEnabled | user.user_authentication_status、user.attribute.labels.value(键:accountEnabled) | 如果 manager 为空且 empmanager-src.accountEnabled 为“true”,则 user.user_authentication_status 会设为“ACTIVE”,并添加一个键为 accountEnabled 且值为“true”的标签。否则,系统会添加键为 accountEnabled 且值为“false”的标签。 |
onPremisesDistinguishedName | user_role.type | 如果标识名的 OU 部分包含“Admin”,则 user_role.type 会设为 ADMINISTRATOR 。如果它包含“服务账号”,则 user_role.type 会设为 SERVICE_ACCOUNT 。 |
userPrincipalName | user_role.type | 如果 userPrincipalName 以“svc-”开头,则 user_role.type 会设为 SERVICE_ACCOUNT 。 |
empmanager-src.onPremisesDistinguishedName | manager_role.type | 如果 gopher-manager 为空,并且经理标识名的 OU 部分包含“Users”,则 manager_role.type 会设为 ADMINISTRATOR 。如果它包含“服务账号”,则 manager_role.type 会设为 SERVICE_ACCOUNT 。 |
empmanager-src.userPrincipalName | manager_role.type | 如果 gopher-manager 为空且 empmanager-src.userPrincipalName 以“svc-”开头,则 manager_role.type 会设为 SERVICE_ACCOUNT 。 |
user_role.type | 如果 mail 以“svc-”开头,则 user_role.type 会设为 SERVICE_ACCOUNT 。 |
变化
2024-04-29
- 将“officeLocation”映射到“entity.location.name”。
- 将“extension_wfc_groupDescription”“extension_wfc_execDescription”“extension_wfc_orgDescription”“extension_wfc_AccountingUnitName”和“extension_wfc_AccountType”映射到“entity.labels”。
2024-05-02
bug 修复:
- 添加了对“accountEnabled”字段的检查,以将正确的值解析为“entity.user.attribute.labels.value”字段。
2024-03-14
- 将“onPremisesImmutableId”映射到“entity.user.attribute.labels”。
- 将“gopher-manager.onPremisesImmutableId”映射到“entity.user.attribute.labels”。
2024-01-12
bug 修复:
- 将“empmanager-src.usageLocation”映射从“entity.user.personal_address.country_or_region”更改为“entity.user.attribute.labels”。
2023-11-24
改进
- 将“employeeType”属性映射到“entity.user.attribute.labels”。
- 丢弃了标记为“TAG_MALFORMED_MESSAGE”的格式有误的 JSON 日志。
2023-10-25
bug 修复
- 添加了 null 检查和针对缺失值的“on_error”检查。
2023-09-25
改进
- 添加了重命名函数(而非替换函数),用于将“group.displayName”映射到“relation_entity.entity.group.group_display_name”。
- 将“country”映射到“user.personal_address.country_or_region”。如果不存在“country”,则将“usageLocation”映射到“user.personal_address.country_or_region”。
2023-02-09
改进
- 在为“onPremisesDistinguishedName”字段映射数据之前添加了 null 检查。
- 添加了 gsub,用于从“proxyAddresses”字段中提取电子邮件地址。
2023-01-23
- 如果“onPremisesExtensionAttributes.extensionAttribute4”为“Employee”,则将“onPremisesExtensionAttributes.extensionAttribute4”映射到“entity.entity.user.attribute.labels”。
- 为“onPremisesDistinguishedName”添加了 gsub,以移除多余的反斜线。
2022-12-15
bug 修复:
- 将“mailNickname”映射到“entity.user.attribute.labels”。
- 如果“empmanager-src.usageLocation”为 null,则仅将“country_n_code”映射到“user.manager.personal_address.country_or_region”。
2022-09-19
- bug 修复:
- 将“entity.user.attribute.roles”映射到“ADMINISTRATOR”,其中 OU 包含“Admin”
2022-08-11
- 将“accountEnabled”映射到“user.attribute.labels”
2022-05-16
- 添加了以下字段的映射:
- “createdDateTime”映射到“entity.user.attribute.creation_time”
- “accountEnabled”已映射到“entity.user.user_authentication_status”
2022-05-09
- 增强功能 - 将以 extension_GUID_sbuxXXXXXXX 开头的字段映射到 user.attribute.labels 或 manager.attribute.labels,具体取决于其在日志中的出现位置。
2022-03-24
- 增强功能 - 添加了一些缺失的字段
- onPremisesSamAccountName、onPremisesDomainName、onPremisesDistinguishedName 已映射到 entity.user.attribute.labels。
- 对于 signInType,userPrincipalName 已映射到 entity.user.attribute.labels。
需要更多帮助?向社区成员和 Google SecOps 专业人士寻求解答。