第一章:AZ-500日志分析核心概念解析
Azure Monitor 是实现 AZ-500 认证中日志分析功能的核心服务,它通过集中采集、存储和查询来自 Azure 资源、操作系统及应用程序的日志数据,为安全监控提供基础支持。日志数据主要存储在 Log Analytics 工作区中,以结构化表格形式保存,便于使用 Kusto 查询语言(KQL)进行高效检索与分析。
日志数据的采集机制
Azure 平台支持多种方式将日志数据发送至 Log Analytics 工作区:
- 代理收集:通过部署 Microsoft Monitoring Agent (MMA) 或 Azure Monitor Agent (AMA) 收集虚拟机上的事件日志和性能计数器
- 平台集成:Azure 服务自动将操作日志(Activity Log)和诊断日志流式传输至工作区
- 自定义日志:允许用户上传特定格式的文本日志文件并解析为结构化字段
Kusto 查询语言基础示例
以下代码展示如何使用 KQL 查询过去一小时内所有安全事件 ID 为 4624 的登录成功记录:
// 查询 SecurityEvent 表中事件ID为4624的登录成功记录
SecurityEvent
| where EventID == 4624
| where TimeGenerated > ago(1h)
| project TimeGenerated, Computer, Account, IPAddress
| order by TimeGenerated desc
该查询逻辑依次执行:筛选表数据 → 过滤事件类型和时间范围 → 提取关键字段 → 按时间倒序排列。
常见日志类型对照表
| 日志类型 | 数据来源 | 典型用途 |
|---|
| SecurityEvent | Windows 事件日志 | 检测登录行为与权限变更 |
| AzureActivity | Activity Log | 审计控制平面操作 |
| Perf | 性能计数器 | 识别资源异常消耗 |
graph TD
A[数据源] --> B{采集代理}
B --> C[Log Analytics 工作区]
C --> D[KQL 查询]
D --> E[仪表板/警报]
第二章:Azure Monitor与Log Analytics基础构建
2.1 Azure Monitor架构与日志数据流原理
Azure Monitor 的核心架构由数据采集、存储、查询和告警四大组件构成。数据源包括 Azure 资源、操作系统指标、应用程序遥测等,统一通过代理(如 Log Analytics Agent 或 Azure Monitor Agent)收集并传输至 Log Analytics 工作区。
日志数据流入流程
数据首先被序列化为 JSON 格式,经由 HTTPS 协议发送至 Azure 云服务。以下为典型的日志上传请求示例:
{
"time": "2023-10-01T12:00:00Z",
"resourceId": "/subscriptions/xxx/resourceGroups/rg1/providers/Microsoft.Compute/virtualMachines/vm1",
"customDimensions": {
"Severity": "Error",
"TaskName": "HealthCheck"
}
}
该结构中的
time 字段用于时间索引构建,
resourceId 实现资源上下文关联,
customDimensions 存储业务自定义属性,便于后续高级分析。
数据处理与存储机制
接收服务将日志写入分布式列式存储,支持基于 Kusto 查询语言的高效检索。整个数据流具备高吞吐、低延迟特性,确保监控实时性。
2.2 配置Log Analytics工作区与数据收集实战
创建Log Analytics工作区
在Azure门户中,通过资源组创建Log Analytics工作区是实现集中化日志管理的第一步。指定区域、定价层(如PerGB2018)并启用数据采集规则,为后续代理部署奠定基础。
配置数据收集规则
使用Azure Monitor Agent(AMA)与数据收集规则(DCR)可精确控制日志流入。以下示例为将自定义日志推送到指定表的DCL配置片段:
{
"properties": {
"dataSources": {
"logFiles": [
{
"filePatterns": [ "/var/log/custom-app/*.log" ],
"format": "text",
"settings": {
"text": { "recordStartTimestamp": "YYYY-MM-DD HH:mm:ss" }
},
"streams": [ "Custom-AppLogs" ]
}
]
}
}
}
该配置定义了日志文件路径、时间戳格式及目标流,确保结构化采集。结合DCR关联机制,可将规则绑定至特定虚拟机或规模集,实现细粒度管理。
2.3 使用Kusto查询语言(KQL)进行基础日志检索
初识KQL查询结构
Kusto查询语言(KQL)是Azure Monitor和Log Analytics中用于分析日志数据的核心工具。一个典型的KQL查询由数据源表开始,后接一系列通过管道符号(
|)连接的操作符。
// 查询SecurityEvent表中最近1小时的登录事件
SecurityEvent
| where TimeGenerated > ago(1h)
| where EventID == 4624
| project TimeGenerated, Computer, User
上述代码首先定位到
SecurityEvent 表,筛选过去一小时的数据,再过滤出成功登录事件(EventID 4624),最后仅展示关键字段。其中,
ago(1h) 表示当前时间减去1小时,
project 用于选择输出列。
常用操作符概览
where:按条件过滤行;project:选择或重命名输出列;summarize:聚合数据,如计数、求平均值;order by:对结果排序。
2.4 常见安全日志源解析:Azure AD、NSG、Firewall
在现代云环境中,安全监控依赖于多维度日志数据的采集与分析。Azure 提供了关键服务的日志记录能力,其中 Azure AD、网络安全组(NSG)和防火墙是最核心的安全日志来源。
Azure AD 日志
Azure AD 生成登录和审计日志,用于追踪用户身份验证行为。例如,异常登录可从以下日志字段识别:
{
"userPrincipalName": "user@contoso.com",
"ipAddress": "94.123.87.65",
"status": { "errorCode": 50140 },
"riskDetail": "userAtRisk"
}
该日志显示用户处于风险状态,结合 IP 地址可判断是否存在异地登录或暴力破解尝试。
NSG 与 Firewall 流日志
NSG 流日志记录虚拟网络中的入站/出站流量,而 Azure 防火墙日志提供应用层过滤详情。两者均以 JSON 格式写入 Log Analytics,支持如下结构化查询:
| 字段 | 说明 |
|---|
| srcIP | 源 IP 地址 |
| destPort | 目标端口,如 22、443 |
| protocol | 传输协议(TCP/UDP) |
| flowDirection | 流向(Inbound/Outbound) |
通过关联这些日志源,可实现跨身份、网络与应用层的威胁检测。
2.5 日志保留策略与成本优化实践
日志生命周期管理
合理的日志保留策略需根据业务合规性与排查需求设定分级保留周期。例如,生产环境关键服务日志保留90天,测试环境仅保留7天。
- 短期日志:用于故障排查,存储在高性能SSD中
- 中期归档:压缩后转入低成本对象存储
- 长期合规:加密归档至冷存储,满足审计要求
基于时间的自动清理配置
retention_days: 30
cold_storage_after: 7
delete_after: 90
上述配置表示日志在7天后迁移至冷存储,90天后彻底删除。
cold_storage_after有效降低存储成本,同时保障可追溯性。
成本对比分析
| 存储类型 | 单价(元/GB/月) | 适用场景 |
|---|
| 热存储 | 0.15 | 最近7天访问频繁日志 |
| 冷存储 | 0.03 | 7天以上归档数据 |
第三章:安全事件监测与威胁检测分析
3.1 利用Sentinel实现SIEM的日志聚合与关联分析
Azure Sentinel作为云原生SIEM平台,通过统一日志管理架构实现多源数据的聚合。其核心优势在于内置的威胁情报集成与可扩展分析规则引擎。
数据接入与解析
支持从防火墙、终端检测系统及云服务中摄取日志。例如,通过Syslog或API导入AWS CloudTrail、Microsoft 365 Audit等数据源。
SecurityEvent
| where EventID == 4624
| summarize LoginCount = count() by Account, IPAddress
| where LoginCount > 5
该KQL查询识别异常高频登录行为,用于检测暴力破解尝试。其中
summarize count()按账户与IP分组统计,阈值过滤增强检测精度。
关联分析规则配置
利用Sentinel的Analytics模块创建自定义检测规则,将多个低危事件关联为高危攻击链。例如:结合“端口扫描”与“远程执行”日志触发高级告警。
| 字段 | 说明 |
|---|
| Entity Mapping | 将日志字段映射到IP、主机等实体 |
| Severity | 设定告警等级:Low/Medium/High/Critical |
3.2 检测常见攻击行为:暴力破解、横向移动、恶意IP
暴力破解识别
通过分析认证日志中的高频失败尝试,可识别潜在的暴力破解行为。例如,在Linux系统中,SSH登录失败记录可通过如下命令提取:
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr
该命令统计远程IP在日志中触发失败登录的次数,输出结果中高频出现的IP需进一步审查,建议结合阈值告警机制实现自动化检测。
横向移动监测
攻击者在内网渗透时常使用Pass-the-Hash或远程WMI执行命令。检测此类行为需监控异常进程创建事件,如多台主机短时间内出现相同的命令模式:
- 跨主机执行
wmic /node:指令 - 非运维时段发起的PsExec连接
- 异常账户在多设备间频繁认证
恶意IP关联分析
整合威胁情报(如AlienVault OTX)可实时比对访问源IP。建立动态黑名单机制,自动阻断已知C2服务器通信。
3.3 自定义警报规则与自动化响应流程设计
在现代监控体系中,静态阈值告警已难以满足复杂业务场景的需求。通过 Prometheus 的 PromQL,可灵活定义动态警报规则:
- alert: HighRequestLatency
expr: job:request_latency_ms:mean5m{job="api"} > 100
for: 3m
labels:
severity: critical
annotations:
summary: "高延迟警告"
description: "API 平均延迟超过 100ms,持续超过 3 分钟。"
上述规则基于 5 分钟滑动窗口计算平均延迟,避免瞬时毛刺触发误报。“for”字段确保状态持续稳定后才发出警报,提升准确性。
自动化响应流程集成
警报触发后,Alertmanager 负责路由与去重,并支持多通道通知:
- 通过 webhook 调用运维机器人自动创建工单
- 结合 Ansible Playbook 执行预设修复动作
- 对接 SIEM 系统实现安全事件联动
该机制显著缩短 MTTR,推动运维向自治化演进。
第四章:实战场景下的日志分析应用
4.1 分析Azure虚拟机安全合规性日志实操
在Azure环境中,确保虚拟机符合安全合规标准依赖于对操作日志的深度分析。通过Azure Monitor和Azure Security Center收集的日志数据,可追踪配置变更、登录行为与潜在威胁事件。
启用诊断日志并路由至Log Analytics
需将虚拟机的诊断设置指向Log Analytics工作区,便于集中查询。使用Azure CLI执行如下命令:
az vm diagnostic set \
--resource-group myResourceGroup \
--name myVM \
--settings '{"logs":{"syslog":["*"],"vmInsightsEnabled":true}}' \
--workspace myLogAnalyticsWorkspace
该命令启用系统日志采集,并将数据发送至指定工作区。参数 `--settings` 定义日志类型,`vmInsightsEnabled` 启用来宾级别监控。
常用Kusto查询示例
在Log Analytics中使用Kusto语言检索异常登录尝试:
| 查询语句 | 用途说明 |
|---|
SecurityEvent | where EventID == 4625 | 筛选Windows失败登录事件 |
AzureActivity | where OperationName contains "Update Virtual Machine" | 审计虚拟机配置变更 |
4.2 追踪Azure容器实例的运行时安全事件
Azure容器实例(ACI)虽然轻量高效,但其运行时安全性仍需持续监控。通过集成Azure Monitor与Azure Security Center,可实现对容器实例的实时威胁检测。
启用诊断日志收集
首先需将ACI的日志流输出至Log Analytics工作区:
{
"logAnalytics": {
"workspaceId": "your-workspace-id",
"workspaceKey": "your-workspace-key",
"logType": "ContainerInstanceLogs"
}
}
上述配置启用后,所有容器的标准输出与错误流将被采集,便于后续分析异常行为。
检测典型安全事件
常见运行时风险包括:
- 容器内执行恶意进程
- 异常网络连接(如外连C2服务器)
- 特权模式容器启动
Azure Security Center基于行为基线自动识别上述活动,并生成安全警报,帮助运维人员快速响应潜在入侵。
4.3 结合Notebooks进行高级威胁狩猎(Threat Hunting)
在现代安全运营中,Notebooks(如Jupyter)为威胁狩猎提供了交互式分析环境,支持数据探索、假设验证与可视化联动。
狩猎流程自动化
通过Python脚本集成SIEM与EDR数据源,可快速构建狩猎逻辑。例如,搜索异常登录行为:
import pandas as pd
# 从API加载原始日志
logs = get_security_logs(query="event_id:4625", timeframe="7d")
# 筛选高频失败登录IP
failed_auth = logs.groupby('src_ip').filter(lambda x: len(x) > 10)
print(f"可疑IP数量: {failed_auth.src_ip.nunique()}")
该代码段提取Windows事件ID 4625(登录失败)日志,按源IP聚合并筛选超过10次尝试的记录,辅助识别暴力破解行为。
可视化关联分析
结合Matplotlib或Plotly可在Notebook内生成时间序列图、地理分布热力图,直观揭示攻击模式演化路径,提升研判效率。
4.4 跨订阅日志查询与多租户安全管理
在云原生架构中,跨订阅日志查询是实现多租户安全审计的关键能力。通过统一的日志分析平台,管理员可在不同Azure订阅间执行联合查询,提取分布式系统的操作痕迹。
权限隔离与数据可见性控制
多租户环境下需严格划分数据访问边界。采用基于角色的访问控制(RBAC)策略,确保租户仅能检索自身上下文日志:
union workspace('tenant-a').SecurityEvent, workspace('tenant-b').SecurityEvent
| where TimeGenerated > ago(7d)
| where TenantId == current_tenant_id()
该Kusto查询语句联合多个工作区日志,通过
TenantId过滤保障数据隔离。
current_tenant_id()动态解析调用者所属租户,防止越权访问。
审计日志聚合策略
- 集中式Log Analytics工作区存储跨订阅日志
- 使用托管标识(Managed Identity)进行安全数据摄取
- 启用保留策略与加密传输(TLS 1.2+)
第五章:AZ-500考试趋势与备考策略
随着云安全威胁的持续演进,Microsoft AZ-500认证近年来更加强调实战能力与防御架构设计。考生需掌握从身份保护到数据加密的完整安全链条,尤其在零信任架构和自动化响应方面考察频率显著上升。
最新考试重点分布
- 身份与访问管理(Azure AD Identity Protection)占比达30%
- 平台保护(包括 Defender for Cloud 和安全基线)占25%
- 数据与应用安全(Key Vault、SQL TDE、应用网关WAF)占20%
- 安全操作(Sentinel、日志分析、响应Playbook)占15%
- 网络防护(NSG、Azure Firewall、DDoS防护)占10%
高效备考路径建议
| 阶段 | 时间分配 | 核心任务 |
|---|
| 基础构建 | 2周 | 完成 Microsoft Learn 模块 SC-900 与 AZ-500 学习路径 |
| 动手实验 | 3周 | 部署 Azure Sentinel 日志工作区并配置自动化响应规则 |
| 模拟冲刺 | 1周 | 完成 Whizlabs 与 MeasureUp 的全真模拟测试 |
典型实操代码示例
// 查询未启用MFA的用户登录事件
SecurityEvent
| where EventID == 4624
| join (
SigninLogs
| where MfaDetail != "Success"
) on $left.Account == $right.UserPrincipalName
| project TimeGenerated, UserPrincipalName, IPAddresses, MfaDetail
图示:典型零信任实施流程
许多通过者反馈,在真实环境中使用 Azure Policy 强制执行安全合规策略是关键得分点。例如,通过自定义策略禁止公网IP绑定到虚拟机网卡:
{
"if": {
"field": "type",
"equals": "Microsoft.Network/networkInterfaces"
},
"then": {
"effect": "deny"
}
}