如何使用Azure AD生成的OAuth访问令牌认证AWS Python SDK(Boto3)以访问配置了Azure AD SSO的S3存储桶?
使用Azure AD OAuth令牌认证Boto3访问S3
前提准备
我之前帮团队配置过这套流程,先提醒你得先完成这两项核心配置:
- Azure AD中已创建指向AWS的企业应用,且配置了正确的权限映射规则
- AWS IAM中创建了允许Azure AD身份扮演的角色,该角色拥有目标S3桶的访问权限,同时信任策略已配置为信任Azure AD的OIDC提供商
步骤1:从Azure AD获取OAuth访问令牌
你可以用Python的requests库直接调用Azure的令牌端点拿令牌,示例代码如下:
import requests tenant_id = "你的Azure租户ID" client_id = "你的Azure AD客户端ID" client_secret = "你的Azure AD客户端密码" token_endpoint = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token" payload = { "grant_type": "client_credentials", "client_id": client_id, "client_secret": client_secret, "scope": "https://aws.amazon.com/.default" # 这个scope要和Azure AD应用配置完全匹配 } response = requests.post(token_endpoint, data=payload) response.raise_for_status() azure_access_token = response.json()["access_token"]
补充:如果你的场景是用户级SSO(而非服务对服务),就得换成
authorization_code授权类型,这时候需要引导用户完成Azure的登录流程获取授权码,再换取令牌。
步骤2:用Azure令牌获取AWS临时凭证并初始化Boto3
拿到Azure的访问令牌后,通过AWS STS的AssumeRoleWithWebIdentity API获取临时凭证,再用这个凭证创建S3客户端:
import boto3 # 初始化STS客户端 sts_client = boto3.client('sts') # 调用AssumeRoleWithWebIdentity role_arn = "arn:aws:iam::你的AWS账号ID:role/允许Azure扮演的IAM角色名" role_session_name = "azure-ad-sso-s3-session" # 自定义会话名,方便后续审计 response = sts_client.assume_role_with_web_identity( RoleArn=role_arn, RoleSessionName=role_session_name, WebIdentityToken=azure_access_token ) # 提取临时凭证 temp_credentials = response['Credentials'] # 用临时凭证初始化S3客户端 s3_client = boto3.client( 's3', aws_access_key_id=temp_credentials['AccessKeyId'], aws_secret_access_key=temp_credentials['SecretAccessKey'], aws_session_token=temp_credentials['SessionToken'] ) # 测试访问S3桶(可选) bucket_name = "你的目标S3桶名" response = s3_client.list_objects_v2(Bucket=bucket_name) print("桶内对象列表:", [obj['Key'] for obj in response.get('Contents', [])])
关键注意事项
- IAM角色信任策略:一定要确保IAM角色的信任策略正确配置,示例片段如下,限制只有指定的Azure AD客户端能扮演该角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::你的AWS账号ID:oidc-provider/login.microsoftonline.com/你的Azure租户ID/v2.0" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "login.microsoftonline.com/你的Azure租户ID/v2.0:aud": "你的Azure AD客户端ID" } } } ] } - 令牌有效期:Azure AD的客户端凭证令牌默认有效期1小时,AWS临时凭证最长可设置为1小时(可通过
DurationSeconds参数调整,不超过角色设置的最大值),所以要记得在令牌过期前重新获取并刷新凭证。 - 权限映射:Azure AD应用中要配置正确的AWS权限映射,确保Azure AD的身份能对应到指定的AWS IAM角色。
内容的提问来源于stack exchange,提问作者Ara
相关产品推荐
相关产品推荐

