本教程介绍如何执行下列操作:
- 创建 Log Analytics 工作区
- 配置诊断设置以将登录日志与 Log Analytics 工作区集成
- 使用 Kusto 查询语言 (KQL) 运行查询
先决条件
若要使用 Log Analytics 分析活动日志,需要以下角色和要求:
- Azure Monitor 的相应角色: - 监视读取者
- Log Analytics 读取者
- 监视参与者
- Log Analytics 参与者
 
- Microsoft Entra ID 的相应角色: - 报告读取者
- 安全读取者
- 全球读者
- 安全管理员
 
创建 Log Analytics 工作区
在此步骤中,你将创建一个 Log Analytics 工作区,该工作区最终会发送登录日志。 在创建工作区之前,需要一个 Azure 资源组。
- 以至少具有 Log Analytics 参与者权限的安全管理员身份登录到 Azure 门户。 
- 浏览到 Log Analytics 工作区。 
- 选择创建。   
- 在“创建 Log Analytics 工作区”页上,执行以下步骤: - 选择订阅。 
- 选择一个资源组。 
- 为工作区命名。 
- 选择区域。 
   
- 选择“查看 + 创建” 。 
- 选择“创建”并等待部署。 可能需要刷新页面才能看到新的工作区。 
配置诊断设置
若要将标识日志信息发送到新工作区,需要配置诊断设置。 Azure 和 Microsoft Entra 有不同的诊断设置选项,因此对于下一组步骤,让我们切换到 Microsoft Entra 管理中心,以确保所有内容都与标识相关。
- 至少以安全管理员身份登录到 Microsoft Entra 管理中心。 
- 浏览到“标识”“监视和运行状况”>“诊断设置”>。 
- 选择“添加诊断设置”。   
- 在“诊断设置”页上,执行以下步骤: - 为该诊断设置提供一个名称。 
- 在“日志”下,选择“AuditLogs”和“SigninLogs”。 
- 在“目标详细信息”下,选择“发送到 Log Analytics”,然后选择新的 Log Analytics 工作区 。 
- 选择“保存”。 
   
您所选的日志可能需要最多 15 分钟才能在 Log Analytics 工作区中填充。
在 Log Analytics 中运行查询
当您的日志流式传输至 Log Analytics 工作区后,您可以使用 Kusto 查询语言(KQL) 来运行查询。 运行查询的最低特权角色是 报表读取者 角色
- 浏览到“标识”“监视和运行状况”>“Log Analytics”。> 
- 在“搜索”文本框中,键入查询,然后选择“运行”。 
Kusto 查询示例
从输入数据中随机选取 10 个条目:
- SigninLogs | take 10
查看条件访问成功的登录:
- SigninLogs | where ConditionalAccessStatus == "success" | project UserDisplayName, ConditionalAccessStatus
成功次数计数:
- SigninLogs | where ConditionalAccessStatus == "success" | project UserDisplayName, ConditionalAccessStatus | count
用户按天累计的成功登录次数:
- SigninLogs | where ConditionalAccessStatus == "success" | summarize SuccessfulSign-ins = count() by UserDisplayName, bin(TimeGenerated, 1d)
查看用户在特定时间段内执行特定操作的次数:
- AuditLogs | where TimeGenerated > ago(30d) | where OperationName contains "Add member to role" | summarize count() by OperationName, Identity
根据操作名称透视结果:
- AuditLogs | where TimeGenerated > ago(30d) | where OperationName contains "Add member to role" | project OperationName, Identity | evaluate pivot(OperationName)
使用内部联接合并审核和登录日志:
- AuditLogs |where OperationName contains "Add User" |extend UserPrincipalName = tostring(TargetResources[0].userPrincipalName) | |project TimeGenerated, UserPrincipalName |join kind = inner (SigninLogs) on UserPrincipalName |summarize arg_min(TimeGenerated, *) by UserPrincipalName |extend SigninDate = TimeGenerated
按客户端应用类型查看登录数:
- SigninLogs | summarize count() by ClientAppUsed
按天对登录进行计数:
- SigninLogs | summarize NumberOfEntries=count() by bin(TimeGenerated, 1d)
随机选取 5 个条目,并在结果中投射出你希望看到的列:
- SigninLogs | take 5 | project ClientAppUsed, Identity, ConditionalAccessStatus, Status, TimeGenerated
选取以降序排列的前 5 个条目,并投射出你希望看到的列:
- SigninLogs | take 5 | project ClientAppUsed, Identity, ConditionalAccessStatus, Status, TimeGenerated
通过将这些值合并到其他两列来创建新的列:
- SigninLogs | limit 10 | extend RiskUser = strcat(RiskDetail, "-", Identity) | project RiskUser, ClientAppUsed