Microsoft Graph 介绍
Microsoft Graph 是微软为整合 Microsoft 365(包括 Azure AD、Exchange、SharePoint、Teams、OneDrive,以及 Microsoft Defender 安全产品等)而推出的一套统一 API 接口。通过 Microsoft Graph,开发者能够以标准 HTTP REST API 的形式,直接对微软云服务中的用户、邮件、文件、安全事件等数据进行编程访问与自动化操作。
Microsoft Graph 提供:
- 单点入口:用一套 API 覆盖近乎所有 Microsoft 365 和 Azure 相关的数据与服务。
- 丰富安全与合规接口:包括合规内容搜索、安全告警、身份与权限、设备合规等接口。
- 多语言、多平台支持:标准 REST API、本地SDK、开源工具和丰富文档。
- 强身份认证:基于 OAuth 2.0 协议,支持 Azure AD 账号、应用注册、委托/应用权限等多种方式保障数据安全。
通过 Microsoft Graph,企业IT人员和开发者能够实现自动化管理、数据抓取、报警联动、合规审计等场景,大幅提升日常运维与安全运营效率。
实验目的:
本实验目标:
- 了解 Microsoft Graph 的核心概念和 API 使用流程;
- 熟悉如何进行 Azure AD 应用注册与权限授权;
- 掌握如何通过 Microsoft Graph API 获取 Microsoft 365 环境下的安全告警数据(如 Microsoft Defender 安全告警),实现安全数据的自动拉取与分析;
- 理解 Graph API 鉴权方式,掌握 API Token 的获取和使用技巧;
- 为后续实现 M365 自动化运维、安全告警整合等场景打下基础。
本实验流程模拟了在真实企业环境下,通过合法授权、API 调用的方式,自动化地提取并分析 M365 安全告警的典型操作,为后续的 SIEM 集成、告警联动、自动响应等高级场景做好准备。
其实就是客户想使用API来获取M365上安全告警日志,要我们给个demo,我就顺手记录鉴权过程
web页面获取的警告信息有限如果想获取到全部的信息就需要使用 Microsoft Graph 来获取认证
实验步骤
1. 注册Azure AD 应用
新注册一个app
注册完后查看相关的信息
应用程序(客户端)ID ——-> client_id
目录(租户)ID ——-> tenant_id
推荐使用英文界面,这样对这些参数的理解更好一些
微软的机翻有的时候会误导人,尤其你使用一些api来做一些事情的时候
2. 权限申请
我们去申请权限
主要需要的权限有:
SecurityEvents.Read.All
# 或者
SecurityEvents.ReadWrite.All
注册相应的权限 并让 管理员批准一下,我们实验的时候本身就是管理员直接操作一下就行
- 管理员勾选授权即可
3. 获取密钥
选择 Certificates & secrets 【证书和密钥】
我们创建一个新的,创建的时候 记得一定一定要copy一下对应的 value
注意!!!!
除了刚刚创建时,之后无法查看客户端密码值。请务必在创建时保存密码,然后再离开该页面。
获取脚本如下:
万事俱备只欠东风,使用这个脚本即可获取到对应的详细 json 数据
import requests
# 你的 Azure AD 信息
# zh: 目录(租户) ID
tenant_id = ''
# zh: 应用程序(客户端) ID
client_id = ''
# zh: 密钥的value
client_secret = ''
# 获取Token
token_url = f'https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token'
token_data = {
'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret,
'scope': 'https://graph.microsoft.com/.default'
}
token_response = requests.post(token_url, data=token_data)
access_token = token_response.json().get('access_token')
if not access_token:
print('获取token失败:', token_response.text)
exit(1)
# 获取告警数据
headers = {
'Authorization': f'Bearer {access_token}'
}
alerts_url = 'https://graph.microsoft.com/v1.0/security/alerts_v2?$top=5' # 获取前10条告警
alerts_response = requests.get(alerts_url, headers=headers)
alerts = alerts_response.json()
if 'value' not in alerts:
print('获取警报失败:', alerts)
else:
for alert in alerts['value']:
print('Alert ID:', alert['id'], '| Title:', alert.get('title'))
def get_json():
alert_id = input("请输入告警ID: ")
alerts_url = f'https://graph.microsoft.com/v1.0/security/alerts_v2/{alert_id}'
response = requests.get(alerts_url, headers=headers)
response.raise_for_status()
alerts = response.json()
print(alerts)
get_json()
官方文档
Microsoft Graph 概述
Microsoft Graph 身份验证和授权基础知识
Microsoft Graph 列出alerts_v2
Microsoft Graph 获取警报
Microsoft Graph 快速开启