如何在Azure Log Analytics中获取全局管理员角色所有用户的日志
Log Analytics中筛选全局管理员操作日志的KQL实现方案
你已经完成Azure Activity日志、AAD审计日志接入Log Analytics的前提下,按以下步骤操作即可筛选出全局管理员角色用户产生的所有操作记录:
核心固定参数
AAD内置全局管理员角色的模板ID为全租户通用固定值:62e90394-69f5-4237-9190-012177145e10,所有筛选逻辑都基于这个ID匹配角色。
筛选AAD审计日志中的全局管理员操作
根据你的需求精度选对应查询即可:
方案1:全量匹配(含PIM临时激活场景)
这个方案会自动关联角色分配/激活记录,覆盖永久分配全局管理员角色、PIM临时激活全局管理员角色的所有用户操作,不会遗漏临时提权行为:
AuditLogs | extend InitiatorObjectId = tostring(Initiator.user.id) | join kind=inner ( AuditLogs | where Category == "RoleManagement" | where ActivityDisplayName in ("Assign eligible role to user", "Assign active role to user", "Activate eligible role") | extend RoleId = tostring(parse_json(tostring(TargetResources[0].modifiedProperties[?PropertyName == "RoleTemplateId"].newValue))[0]) | where RoleId == "62e90394-69f5-4237-9190-012177145e10" | extend AssignedUserId = tostring(TargetResources[0].id) | project AssignedUserId, RoleAssignmentTime = TimeGenerated ) on $left.InitiatorObjectId == $right.AssignedUserId | where TimeGenerated >= RoleAssignmentTime // 排除服务主体操作,只保留用户操作可加下一行 // | where isnotempty(Initiator.user.userPrincipalName) | project TimeGenerated, OperationName = ActivityDisplayName, InitiatorUPN = Initiator.user.userPrincipalName, InitiatorObjectId, TargetResources, Result
方案2:简易匹配(仅匹配当前全局管理员)
如果只需要筛选当前租户内已经被授予全局管理员角色的用户产生的日志,不需要回溯历史角色分配/临时激活场景,可以先导出当前全局管理员的用户Object ID填入查询,查询效率更高:
// 将括号内替换为你租户当前所有全局管理员的用户Object ID let CurrentGlobalAdminIds = dynamic([ "替换为用户1的Object ID", "替换为用户2的Object ID" ]); AuditLogs | extend InitiatorObjectId = tostring(Initiator.user.id) | where InitiatorObjectId in (CurrentGlobalAdminIds) | project TimeGenerated, OperationName = ActivityDisplayName, InitiatorUPN = Initiator.user.userPrincipalName, Result
筛选Azure Activity管理日志中的全局管理员操作
和AAD日志逻辑一致,全量匹配(含PIM场景)的查询如下:
AzureActivity | extend InitiatorObjectId = tostring(CallerObjectId) | join kind=inner ( AuditLogs | where Category == "RoleManagement" | where ActivityDisplayName in ("Assign eligible role to user", "Assign active role to user", "Activate eligible role") | extend RoleId = tostring(parse_json(tostring(TargetResources[0].modifiedProperties[?PropertyName == "RoleTemplateId"].newValue))[0]) | where RoleId == "62e90394-69f5-4237-9190-012177145e10" | extend AssignedUserId = tostring(TargetResources[0].id) | project AssignedUserId, RoleAssignmentTime = TimeGenerated ) on $left.InitiatorObjectId == $right.AssignedUserId | where TimeGenerated >= RoleAssignmentTime // 排除服务主体、托管身份操作,只保留用户操作可加下一行 // | where CallerType == "User" | project TimeGenerated, OperationName = OperationNameValue, InitiatorName = Caller, InitiatorObjectId, ResourceGroup, ResourceProvider, SubscriptionId, ActivityStatus = ActivityStatusValue
注意事项
- 上述全量匹配查询依赖AAD角色管理类审计日志的完整性,请确认你的Log Analytics中
AuditLogs表的RoleManagement类别日志留存周期覆盖你要查询的时间范围 - 如果需要统计用户被分配全局管理员角色之前的操作,删除或调整
where TimeGenerated >= RoleAssignmentTime条件即可 - 简易匹配方案需要你定期更新
CurrentGlobalAdminIds里的用户列表,避免人员变动导致筛选结果不准 - 如果需要跨表统一查询两类日志,可以用
union把两个查询结果合并,注意对齐输出字段结构即可
内容的提问来源于stack exchange,提问作者Jcircuit
相关产品推荐
相关产品推荐

