azure-m365-graph

  1. Microsoft Graph 介绍
  2. 实验目的:
  3. 实验步骤
    1. 1. 注册Azure AD 应用
    2. 2. 权限申请
    3. 3. 获取密钥
    4. 获取脚本如下:
  4. 官方文档

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

image-20250814144004876

注册完后查看相关的信息

image-20250814144240306

应用程序(客户端)ID ——-> client_id

目录(租户)ID ——-> tenant_id

推荐使用英文界面,这样对这些参数的理解更好一些

微软的机翻有的时候会误导人,尤其你使用一些api来做一些事情的时候

image-20250814144538674

2. 权限申请

我们去申请权限

image-20250814144705643

主要需要的权限有:

SecurityEvents.Read.All
# 或者
SecurityEvents.ReadWrite.All

注册相应的权限 并让 管理员批准一下,我们实验的时候本身就是管理员直接操作一下就行

image-20250814145134753

  • 管理员勾选授权即可

image-20250814145222009

3. 获取密钥

选择 Certificates & secrets 【证书和密钥】

我们创建一个新的,创建的时候 记得一定一定要copy一下对应的 value

注意!!!!

除了刚刚创建时,之后无法查看客户端密码值。请务必在创建时保存密码,然后再离开该页面。

image-20250814145312936

获取脚本如下:

万事俱备只欠东风,使用这个脚本即可获取到对应的详细 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()

官方文档

github