在 Azure 资源中使用 AWS Outbound Identity Federation
I’m happy to translate the article for you, but I don’t have the ability to retrieve the full text from the link directly. Could you please paste the content you’d like translated here? Once you provide the text, I’ll translate it into Simplified Chinese while preserving the original formatting, markdown syntax, and any code blocks or URLs.
AWS 身份联合限制
与 Google Cloud 的 workload identity pool AWS provider 不同,Azure 托管身份不支持使用预签名 URL 进行 IAM 认证。Azure 托管身份仅支持外部 OpenID Connect(OIDC)提供者,这意味着在 AWS 上运行的工作负载若要联邦到 Azure 环境,必须使用能够将 OIDC 令牌转换的其他服务(例如 AWS EKS 或 Cognito)。
截至目前,Puma Security 的 Nymeria 跨云工作负载身份 项目已经提供了从 AWS Lambda 函数和 EKS Pod 联邦到 Azure 与 Google Cloud 存储资源的示例。随着 2025 re:Invent 版 IAM Outbound Identity Federation 的发布,我们新增了对 AWS EC2 实例联邦到 Azure 存储资源的支持。
下图展示了使用 AWS Outbound Identity Federation 的 AWS EC2 实例访问 Azure Blob 存储容器的架构。EC2 实例通过 sts:GetWebIdentityToken API 向 AWS IAM 请求签名的 OIDC 令牌。随后使用该 AWS 签名的 OIDC 令牌登录 Azure 租户的用户分配托管身份,EC2 实例即可获取 Azure 访问令牌并访问存储容器及 Blob 对象。
AWS 出站身份联合设置
在使用此功能之前,必须在您的 AWS 账户中启用 Outbound Identity Federation(出站身份联合)。可以通过 AWS 管理控制台或使用 Terraform 提供程序(v6.26.0 或更高版本)并利用新的 aws_iam_outbound_web_identity_federation 资源来完成:
# 启用账户级别的网络身份联合
resource "aws_iam_outbound_web_identity_federation" "this" {}
应用配置后,AWS IAM 控制台会显示已启用出站身份联合,并为您的账户生成唯一的 Token Issuer URL(令牌发行者 URL)。在后续配置 Azure 托管身份的信任关系时,需要使用此 URL。
AWS 出站身份联合权限
要使用此功能,请为 EC2 实例创建 IAM 角色(以及实例配置文件)。该角色必须包含 sts:GetWebIdentityToken 权限。
Terraform – IAM 策略文档
data "aws_iam_policy_document" "cross_cloud" {
statement {
sid = "AllowTokenVending"
effect = "Allow"
actions = [
"sts:GetWebIdentityToken",
]
resources = [
"*",
]
}
}
resource "aws_iam_policy" "cross_cloud" {
name = "nymeria-cross-cloud-token-${random_string.unique_id.result}"
path = "/"
description = "IAM policy for Nymeria VM"
policy = data.aws_iam_policy_document.cross_cloud.json
tags = {
Product = "Nymeria"
}
}
从 EC2 实例请求令牌
连接到实例(通过 SSM Session Manager 或 SSH),运行以下 AWS CLI 命令:
aws sts get-web-identity-token \
--audience api://AzureADTokenExchange \
--signing-algorithm RS256 \
--duration-seconds 300
该命令返回的 JSON 类似于下面的片段。WebIdentityToken 字段包含已签名的 OIDC 令牌,Expiration 字段显示令牌的过期时间。
{
"WebIdentityToken": "",
"Expiration": "2025-12-20T12:34:56Z"
}
现在可以使用此令牌与 Azure AD 交换,以获取 Azure 访问令牌并访问所需的 Azure Blob 存储资源。
{
"IdentityToken": "eyJraWQiOiJSU0FfMCIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0...",
"Expiration": "2025-12-19T04:06:07.577000+00:00"
}
Azure Managed Identity Configuration
现在我们已经了解如何请求 AWS 出站身份令牌,接下来可以配置 Azure 托管身份以信任 AWS 出站身份提供者。这需要从 AWS 身份令牌中提取必要的声明(claims),并使用这些声明来配置 Azure 托管身份的联邦凭证。
AWS 出站身份令牌声明
首先使用 jq 对 AWS 身份令牌进行解码。我们需要令牌的 iss(发行者)和 sub(主体)声明,以配置 Azure 托管身份的信任关系。
JWT=$(aws sts get-web-identity-token \
--audience api://AzureADTokenExchange \
--signing-algorithm RS256 \
--duration-seconds 300 | jq -r '.WebIdentityToken')
注意: Azure 的托管身份联邦 不 支持高级声明过滤器,例如 https://sts.amazonaws.com/ 声明中出现的那些。配置 Azure 托管身份信任时,仅需要 iss、aud 和 sub 声明。
{
"aud": "api://AzureADTokenExchange",
"sub": "arn:aws:iam::123456789012:role/nymeria-cross-cloud-9zo9h8c5",
"https://sts.amazonaws.com/": {
"ec2_instance_source_vpc": "vpc-1234567890123456",
"ec2_role_delivery": "2.0",
"org_id": "o-abcd1234",
"aws_account": "123456789012",
"ou_path": [
"o-abcd1234/r-abc/ou-abc-def/"
],
"original_session_exp": "2025-12-19T10:21:06Z",
"source_region": "us-east-2",
"ec2_source_instance_arn": "arn:aws:ec2:us-east-2:123456789012:instance/i-12345678901234567",
"principal_id": "arn:aws:iam::123456789012:role/nymeria-cross-cloud-9zo9h8c5",
"principal_tags": {
"Product": "Nymeria"
},
"ec2_instance_source_private_ipv4": "10.142.128.107"
},
"iss": "https://53e20c38-5c03-41f7-8baa-a67e81974de0.tokens.sts.global.api.aws",
"exp": 1766118898,
"iat": 1766118598,
"jti": "1640bab7-b35b-4410-b4ee-04d219abbf33"
}
Azure 托管身份信任配置
要在 Azure 租户中建立信任,首先在资源组中创建一个 用户分配的托管身份,并授予其读取跨云存储账户数据的权限。
Terraform – 托管身份和角色分配
resource "azurerm_user_assigned_identity" "cross_cloud" {
name = "cross-cloud-vm-${random_string.unique_id.result}"
location = var.location
resource_group_name = azurerm_resource_group.federated_identity.name
}
resource "azurerm_role_assignment" "cross_cloud_blob_reader" {
principal_id = azurerm_user_assigned_identity.cross_cloud.principal_id
scope = azurerm_storage_account.cross_cloud.id
role_definition_name = "Storage Blob Data Reader"
}
Terraform – 联合凭据
配置用户分配的托管身份的联合凭据,以信任 AWS 出站身份提供者。
resource "azurerm_federated_identity_credential" "aws" {
name = "nymeria-aws"
resource_group_name = var.azure_resource_group_name
parent_id = var.azure_managed_identity_id
issuer = var.aws_account_issuer
audience = ["api://AzureADTokenExchange"]
subject = var.aws_iam_role_arn
}
var.aws_account_issuer→https://53e20c38-5c03-41f7-8baa-a67e81974de0.tokens.sts.global.api.awsvar.aws_iam_role_arn→arn:aws:iam::123456789012:role/nymeria-cross-cloud-9zo9h8c5
Source: …
从 AWS EC2 访问 Azure Blob 存储
在完成联邦和信任关系配置后,EC2 实例即可访问 Azure Blob 存储容器。
-
请求一个新的 AWS 出站身份令牌,并将其存入名为
JWT的环境变量。JWT=$(aws sts get-web-identity-token \ --audience api://AzureADTokenExchange \ --signing-algorithm RS256 \ --duration-seconds 300 | jq -r '.WebIdentityToken') -
导出所需的 Azure 变量:
export AZURE_TENANT_ID="your-azure-tenant-id" export AZURE_MANAGED_IDENTITY_CLIENT_ID="your-managed-identity-client-id" export AZURE_STORAGE_ACCOUNT="your-storage-account-name"
使用 AWS 出站身份令牌登录 Azure
az login \
--service-principal \
--tenant $AZURE_TENANT_ID \
--username $AZURE_MANAGED_IDENTITY_CLIENT_ID \
--federated-token $JWT
该命令返回一个 JSON 块,确认登录成功。
列出 Azure 存储容器中的 Blob
az storage blob list \
--auth-mode login \
--account-name $AZURE_STORAGE_ACCOUNT \
--container-name assets \
| jq '.[].name'
输出列出 Blob 名称,确认对存储账户的访问如预期般工作。
结论
AWS IAM 出站身份联合为在 AWS 上运行的工作负载提供了一种使用短期签名 OIDC 令牌安全访问外部云资源的新方式。借助此功能,Puma Security Nymeria 跨云工作负载身份项目现在支持从 AWS EC2 实例联邦到 Azure 和 Google Cloud 存储资源。
参考文献
- Wiz 博客: Top AWS re:Invent Announcements for Security Teams in 2025 by Scott Piper
- AWS 新闻博客: Simplify access to external services using AWS IAM Outbound Identity Federation
- Terraform: aws_iam_outbound_web_identity_federation resource
- Nymeria 工作坊 GitHub 仓库: https://github.com/pumasecurity/nymeria
关于作者
Eric Johnson – LinkedIn 个人资料
Eric 的经验包括云安全架构与设计、云原生和 Kubernetes 评估、基础设施即代码自动化、应用安全自动化、Web 与移动应用渗透测试、安全开发生命周期咨询以及安全代码审查评估。

