本教程介绍如何执行下列操作:
- 创建 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 管理中心。
浏览到 Entra ID>监控与健康>诊断设置。
选择“添加诊断设置”。
在“诊断设置”页上,执行以下步骤:
为该诊断设置提供一个名称。
在“日志”下,选择“AuditLogs”和“SigninLogs”。
在“目标详细信息”下,选择“发送到 Log Analytics”,然后选择新的 Log Analytics 工作区 。
选择“保存”。
您所选的日志可能需要最多 15 分钟才能在 Log Analytics 工作区中填充。
在 Log Analytics 中运行查询
当您的日志流式传输至 Log Analytics 工作区后,您可以使用 Kusto 查询语言(KQL) 来运行查询。 运行查询的最低特权角色是 报表读取者 角色
浏览到 Entra ID>监控与健康>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