Azure 子账号管理 微软云如何查看操作日志
你有没有过这种经历:半夜三点收到告警邮件,说某台虚拟机被删了;或者早上一睁眼发现生产数据库的防火墙规则全没了——而你发誓自己没动过鼠标?
别急着背锅,也别立刻截图甩给同事“你看!不是我干的!”——先打开Azure Portal,翻翻操作日志(Activity Log)。它不是你的监控屏保,而是Azure世界里的行车记录仪+保安摄像头+值班日志本三合一,默默记下每一个资源创建、修改、删除的瞬间,连谁用哪个账号、从哪台IP、几点几分点的“删除确认”按钮,都写得清清楚楚。
但问题来了:这玩意儿藏在哪?为啥我点了半天只看到一堆“Microsoft.Resources/subscriptions/…”,像读天书?为什么明明改了NSG规则,日志里却查不到?为什么导出的CSV里时间戳全是UTC,老板问“昨天下午3点”你得掏出计算器倒推8小时?
别慌。这篇不讲PPT式概念,不堆术语,专治“找不着、看不懂、导不出、用不上”四大症状。咱们按真人实操节奏走一遍:从Portal里点哪里开始,怎么过滤才不漏关键动作,命令行怎么一句搞定,以及——最实在的——怎么把日志塞进Log Analytics里自动告警,比如“检测到任何人删除生产环境Key Vault,立刻发Teams消息+短信双提醒”。
Azure 子账号管理 📍 第一站:Azure门户——最直观,但也最容易踩坑
登录portal.azure.com,左上角搜索框输入“活动日志”(注意!不是“操作日志”,也不是“审计日志”,中文界面就叫“活动日志”,英文是Activity Log),回车,点第一个结果。
默认页面会展示最近90天内订阅级操作(注意:是订阅级,不是资源组或单个VM)。这里有个隐藏设定:它不记录数据平面操作(比如你往Storage Account里上传了个文件、SQL Server里执行了DELETE语句),只记录控制平面动作(创建、更新、删除资源本身)。所以别指望在这里查“谁删了表”,但能查“谁删了整个SQL Server实例”。
筛选器是灵魂。别一股脑点“应用筛选器”就完事——先看顶部时间范围,默认是“过去24小时”,但Azure日志延迟可能达5分钟,刚点完删除,日志未必秒出。建议手动设成“过去7天”,再结合右侧“筛选条件”逐层收窄:
- 资源组:锁定事故现场,比如你怀疑是dev-rg搞的鬼,就选它;
- 资源类型:想查所有VM相关操作?选“Virtual Machines”;想抓网络变更?选“Network Security Groups”或“Virtual Networks”;
- 操作名称:这是关键!别只选“Delete”,要展开看子项——
Delete Virtual Machine、Delete Network Security Group、Write Virtual Machine(即创建或更新)都得单独勾选; - 状态:选“Succeeded”看成功操作,“Failed”看误操作失败记录(比如权限不够导致删不动,反而暴露了谁在瞎试);
- 发起人:填邮箱或UPN(如[email protected]),可快速定位责任人——但注意:如果是Service Principal调用API,这里显示的是应用ID,不是人名。
⚠️ 坑点预警:日志保留期默认90天,且不可延长。想存更久?必须转存到Log Analytics工作区或存储账户(后文细说)。另外,免费版Log Analytics有每日100MB摄入限制,大客户记得提前调配配额。
💻 第二站:命令行——批量查、定时跑、脚本化
运维同学请坐直。Portal点来点去太慢?写个脚本一键拉取本周所有删除操作:
Azure CLI(推荐,语法清爽):
az monitor activity-log list \
--start-time "2024-06-01T00:00:00Z" \
--end-time "2024-06-07T23:59:59Z" \
--status "Succeeded" \
--resource-group "prod-rg" \
--query "[?contains(operationName.value, 'delete')].{Time:submissionTimestamp, Caller:caller, Operation:operationName.value, Resource:resourceId}" \
--output table
输出直接是表格,清晰明了。想导出CSV?把--output table换成--output json,再管道给jq或Excel处理即可。
PowerShell(适合Windows生态):
$logs = Get-AzLog \
-StartTime (Get-Date).AddDays(-7) \
-EndTime (Get-Date) \
-Status Succeeded \
-ResourceGroup "prod-rg"
$logs | Where-Object {$_.OperationName.Value -like "*delete*"} |
Select-Object @{n='Time';e={$_.EventTimestamp}},
@{n='User';e={$_.Caller}},
@{n='Action';e={$_.OperationName.Value}} |
Export-Csv -Path "./deletion-audit.csv" -NoTypeInformation
💡 小技巧:把这段脚本加到Windows任务计划里,每天凌晨2点自动生成昨日删除报告,邮件发给你和CTO——从此告别“老板问昨天谁删库”的灵魂拷问。
🔍 第三站:Log Analytics——让日志活起来
Portal和CLI适合临时排查,真要长期盯控,必须上Log Analytics。步骤分三步:
- 创建Log Analytics工作区(免费层够小团队用);
- 在订阅级别启用诊断设置:进“活动日志”→右上角“诊断设置”→新建→选工作区→勾选“AllLogs”→保存;
- 写KQL查(这才是精髓):
比如,查过去24小时所有高危操作:
AzureActivity
| where TimeGenerated > ago(24h)
| where OperationNameValue contains "delete" or OperationNameValue contains "remove" or OperationNameValue contains "disable"
| where ResourceGroup == "prod-rg"
| project TimeGenerated, Caller, OperationNameValue, ResourceId, StatusValue
| sort by TimeGenerated desc
再狠一点:自动标红“非工作时间操作”(晚8点到早8点):
| extend Hour = toint(format_datetime(TimeGenerated, 'HH'))
| where Hour < 8 or Hour > 20
| project-reorder TimeGenerated, Caller, OperationNameValue, ResourceId
最后,设置告警规则:当查询结果数>0时,触发Teams webhook或短信。从此,有人半夜删VM,你手机先震,比监控告警还快半拍。
🔑 权限与安全:别让日志变成摆设
再好的日志,没权限也是白搭。关键RBAC角色:
- Reader:只能看活动日志(够日常审计);
- Monitoring Reader:额外能看指标、诊断设置(推荐给SRE);
- Owner / Contributor:能改诊断设置、导出日志(慎授!);
切记:不要给开发人员“Contributor”权限到整个订阅!最小权限原则——建个专用“Log-Auditor”组,只赋Monitoring Reader,再通过AAD条件访问策略限制IP段,安全感直接拉满。
🎯 结语:日志不是终点,而是起点
查看操作日志,不是为了事后甩锅,而是为了事前预防、事中拦截、事后复盘。当你能10秒内定位一次误删,当你能用KQL画出“谁最爱半夜改生产配置”的热力图,当你把告警从“服务挂了”提前到“有人正试图删Key Vault”——你就从救火队员,升级成了云上守夜人。
最后送一句大实话:Azure控制台每年UI改版三次,但Activity Log的入口永远在左上角搜索框里。记住这句话,比背一百个命令都管用。

