如何通过Python导出Azure日志并获取Azure Portal所有用户会话
可用于Azure Portal相关操作的Python库
azure-mgmt-monitor:Azure官方监控管理库,用于拉取活动日志、用户操作日志等平台侧日志数据azure-identity:Azure官方身份验证库,支持服务主体、托管身份等多种认证方式,用于完成Azure API访问的身份鉴权azure-mgmt-resourcegraph:适用于跨订阅、跨资源的批量数据查询,可提升日志拉取效率msgraph-sdk-python:Microsoft Graph官方Python SDK,用于拉取Azure AD侧的用户登录、会话相关数据
需求实现步骤
1. 前置准备
首先在Azure AD中注册应用,为应用分配以下权限并完成管理员同意:
- Azure Monitor的
Monitor Reader权限 - Azure AD的
AuditLog.Read.All、Directory.Read.All权限
获取应用对应的客户端ID、租户ID、客户端密钥,以及目标订阅ID用于后续接口调用。
2. 初始化认证与客户端
示例代码如下:
from azure.identity import ClientSecretCredential from azure.mgmt.monitor import MonitorManagementClient from msgraph import GraphServiceClient import datetime import csv # 替换为实际参数 TENANT_ID = "你的Azure租户ID" CLIENT_ID = "注册应用的客户端ID" CLIENT_SECRET = "注册应用的客户端密钥" SUBSCRIPTION_ID = "目标Azure订阅ID" # 初始化认证凭证 credential = ClientSecretCredential( tenant_id=TENANT_ID, client_id=CLIENT_ID, client_secret=CLIENT_SECRET ) # 初始化Azure Monitor客户端 monitor_client = MonitorManagementClient(credential, SUBSCRIPTION_ID) # 初始化Microsoft Graph客户端 graph_scopes = ["https://graph.microsoft.com/.default"] graph_client = GraphServiceClient(credentials=credential, scopes=graph_scopes)
3. 导出Azure平台全部用户日志
用户在Azure平台的所有操作记录存储在Monitor活动日志中,拉取导出示例:
# 定义拉取时间范围,示例为过去30天 end_time = datetime.datetime.utcnow() start_time = end_time - datetime.timedelta(days=30) filter_str = f"eventTimestamp ge '{start_time.isoformat()}' and eventTimestamp le '{end_time.isoformat()}'" # 拉取活动日志 activity_logs = monitor_client.activity_logs.list( filter=filter_str, select="eventTimestamp,caller,operationName,resourceGroupName,status" ) # 导出到CSV文件 with open('azure_user_operation_logs.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['时间戳(UTC)', '操作用户', '操作名称', '所属资源组', '操作状态']) for log in activity_logs: if log.caller: # 过滤系统级操作,仅保留用户触发的操作 writer.writerow([ log.event_timestamp, log.caller, log.operation_name.localized_value, log.resource_group_name, log.status.localized_value ])
4. 获取Azure Portal用户会话及会话时长
Azure Portal的用户登录、会话数据存储在Azure AD登录日志中,通过Microsoft Graph接口拉取,示例:
# 拉取登录日志 sign_in_records = graph_client.audit_logs.sign_ins.get().await_result() # 过滤Azure Portal会话、计算会话时长并导出 with open('azure_portal_user_sessions.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['用户UPN', '登录时间(UTC)', '最后活动时间(UTC)', '会话时长(分钟)', '登录IP', '登录状态']) for record in sign_in_records.value: # 过滤仅Azure Portal的登录会话 if record.app_display_name != "Azure Portal": continue login_time = record.created_date_time last_active = record.last_non_interactive_sign_in_date_time if record.last_non_interactive_sign_in_date_time else login_time session_duration = round((last_active - login_time).total_seconds()/60, 2) status = "成功" if record.status.error_code is None else f"失败,错误码:{record.status.error_code}" writer.writerow([ record.user_principal_name, login_time, last_active, session_duration, record.ip_address, status ])
注意:默认Azure AD登录日志仅保留30天,若需要拉取更久的历史会话数据,需提前配置Azure AD日志导出到Log Analytics工作区或存储账号,再通过对应API查询历史数据;所有接口调用的权限需配置为应用权限,而非委托权限,否则无法拉取全租户的日志数据。
内容的提问来源于stack exchange,提问作者Hassan Turi
相关产品推荐
相关产品推荐

