如何通过 AWS 安全令牌服务从 Microsoft Entra ID 租户访问 AWS 资源 安全
  • 15

通过 AWS 安全令牌服务访问 Microsoft Entra ID 租户中的 AWS 资源

关键要点

使用短期令牌进行安全身份验证,降低长效访问密钥的风险。通过 AWS 身份与访问管理 (IAM) 和 OpenID Connect (OIDC) 配置,建立与 Microsoft Entra ID 的信任关系。使用 Azure 管理身份验证获取临时凭证以访问 AWS 资源。

在云资源之间使用长期访问密钥进行身份验证增加了密钥暴露和未授权秘密重用的风险。亚马逊网络服务 (AWS) 开发了一种解决方案,使客户能够安全地使用短期令牌实现 Azure 资源与 AWS 资源的身份验证,从而降低安全身份验证的风险。

在本篇文章中,我们将指导您如何配置 AWS 身份与访问管理 (IAM) OpenID Connect (OIDC) 身份提供商,以建立与 Microsoft Entra ID 租户的信任关系。通过遵循本文中列出的步骤,您可以使托管在 Microsoft Azure 中的资源使用具有权限的 IAM 角色,以访问您的 AWS 资源。

解决方案概述

在本解决方案中,我们将展示如何在 IAM 中获取临时凭证。该解决方案结合使用 AWS 安全令牌服务 (AWS STS)、Azure 管理身份 和 Azure 应用注册。该方法提供了一种更安全、更高效的方式来连接 Azure 和 AWS 云,实现无缝集成,而不影响安全身份验证和授权标准。

图 1:Azure 云资源通过临时安全凭证访问 AWS 资源

AWS IAM,如图 1 所示,流程如下:

创建并将 Azure 管理身份附加到 Azure 虚拟机 (VM)。Azure VM 从管理身份获取 Azure 访问令牌,并将其发送到 AWS STS 以检索临时安全凭证。创建的 IAM 角色具有有效的 Azure 租户受众和主题,验证声明是否来自受信实体,并将临时安全凭证发送到请求的 Azure VM。Azure VM 使用 AWS STS 提供的临时安全凭证访问 AWS 资源。

前提条件

在开始之前,您必须具备以下条件:

一个 AWS 账户。一个 Azure 账户订阅。在您的 Azure 账户中,确保有一个现有的管理身份,或创建一个新的以测试本解决方案。有关更多信息,请参考 在 Azure 门户中配置 Azure 资源的管理身份。在 Azure 中创建虚拟机实例并附加步骤 3 中创建的管理身份。在 Azure VM 上安装 jq、boto3 和 AWS 命令行界面 (AWS CLI) 版本 2 以进行测试。

实施步骤

为准备与 Microsoft Entra ID 的身份验证过程,需要在 Microsoft Entra ID 中创建一个企业应用程序。这将作为登录端点,并通过 OIDC 访问令牌向目标 AWS 账户的身份提供者 (IdP) 提供必要的用户身份信息。

在 Azure 中注册新应用

在 Azure 门户中,选择Microsoft Entra ID。选择应用注册。选择新注册。输入应用程序的名称,然后在支持的帐户类型中选择一个选项在本示例中,我们选择的是仅此组织目录中的帐户。保持其他选项不变,然后选择注册。

图 2:在 Azure 门户中注册应用程序

配置应用 ID URI

在 Azure 门户中,选择Microsoft Entra ID。选择应用注册。在应用注册页面,选择所有应用程序并选择新注册的应用程序。在新注册的应用程序概述页面,选择应用 ID URI,然后选择添加。在编辑应用 ID URI 页,输入 URI 的值,格式为 urn//lt应用名称gt 或 api//lt应用名称gt。应用 ID URI 将在后面的 AWS 身份提供者 (IdP) 配置中作为 受众 使用。

注意: Microsoft 身份平台提供两个访问令牌版本:v10 和 v20。这些版本决定令牌中的声明。授权方 (azp) 是一个字符串和 GUID,仅在 v20 令牌中存在。如果 azp 声明被设置,则在身份提供者 (IdP) 配置中的受众值中输入该值本帖配置 AWS部分的第 1d 步。

图 3:配置应用 ID URI

打开新注册的应用程序的概述页面。在导航窗格中,选择管理,然后选择应用角色。选择创建应用角色,然后输入显示名称,并在允许的成员类型中选择两者用户/组 应用程序。对于描述,输入描述。选择是否要启用此应用角色?,然后选择应用。

图 4:创建并启用应用角色

将在步骤 4 中创建的管理身份分配给新应用角色。此操作可以通过使用 Azure Cloud Shell 或在本地运行脚本通过安装最新版本的 Microsoft Graph PowerShell SDK 完成。有关使用 PowerShell 将管理身份分配给应用角色的更多信息,请参考 Azure 文档。

您需要以下信息:

ObjectID:要查找管理身份的对象主体 ID,请转到管理身份页面,选择身份名称, 然后选择概述。

图 5:查找管理身份的 ObjectID

ID:要查找应用角色的 ID,请转到应用注册,选择应用名称,然后选择应用角色。

图 6:查找应用角色的 ID

PrincipalID:与 ObjectID 相同,即管理身份的对象主体ID。ResourceID:资源服务主体的 ObjectID,您可以通过转到企业应用程序页面并选择应用程序来查找。选择概述,然后选择属性以查找ObjectID。

图 7:查找 ResourceID

拥有资源 ID 后,您现在可以使用 Azure Cloud Shell,在 PowerShell 终端中运行以下脚本,使用 NewAzureADServiceAppRoleAssignment。请将变量替换为资源 ID。

powershellPS /home/usergt ConnectAzureADPS /home/usergt NewAzureADServiceAppRoleAssignment ObjectId lt ObjectIDgt Id lt IDgt PrincipalId lt PrincipalIDgt ResourceId lt ResourceIDgt

如何通过 AWS 安全令牌服务从 Microsoft Entra ID 租户访问 AWS 资源 安全

配置 AWS

在 AWS 管理控制台中的 IAM 中,创建一个 IAM 身份提供商。在左侧导航窗格中,选择身份提供商,然后选择添加身份提供商。在提供者类型中,选择OpenID Connect。在提供者 URL中,输入 https//stswindowsnet/lt Microsoft Entra Tenant IDgt。将 lt Microsoft Entra Tenant IDgt 替换为来自 Azure 的租户 ID。这仅允许来自您的 Azure 租户的身份访问您的 AWS 资源。对于受众,使用 Azure 管理身份的 clientid 或企业应用程序的应用 ID URI。对于受众,输入在配置应用 ID URI的第 5 步中配置的应用 ID URI。如果您有其他客户端 ID也称为受众,您可以稍后将其添加到提供程序详细信息页面。您还可以在下一步的角色信任策略中使用不同的受众,通过提供 StringEquals 条件来限制特定受众可以假设的角色。

图 8:添加受众客户端 ID

在没有条件的情况下使用 OIDC 主体可能会过于宽松。为了确保只有预期的身份可以假设该角色,请在该 IAM 角色的角色信任策略中提供受众aud和主题sub作为条件。

stswindowsnet/lt Microsoft Entra Tenant IDgt/sub 代表您 Azure 工作负载的身份,限制可以从 Azure 租户假设此角色的特定 Azure 身份。请参见以下示例条件。

将 lt Microsoft Entra Tenant IDgt 替换为您 Azure 的租户 ID。将 lt 应用 ID URIgt 替换为您在上一步中配置的受众值。将 lt 管理身份的对象主体 IDgt 替换为您在配置应用 ID URI的第 12 步中捕获的 ObjectID。

json{ Version 20121017 Statement [{ Effect Allow Principal { Federated arnawsiamlt AWS Account IDgtoidcprovider/stswindowsnet/lt Microsoft Entra Tenant IDgt/ } Action stsAssumeRoleWithWebIdentity Condition { StringEquals { stswindowsnet/lt Microsoft Entra Tenant IDgt/aud lt 应用 ID URIgt stswindowsnet/lt Microsoft Entra Tenant IDgt/sub lt 管理身份的 ObjectIDgt } } }]}

访问测试

要测试访问,您需要为现有 VM 分配一个用户分配的管理身份。

快橙加速器官方版登录到 Azure 门户。导航到所需的 VM,选择身份、用户分配,然后选择添加。

图 9:分配用户分配的身份

选择在前提条件中创建的管理身份,然后选择添加。

图 10:添加用户分配的管理身份

在 AWS 中,我们使用 credentialprocess 在单独的 AWS 配置文件中动态和程序性地检索 AWS 临时凭证。该 credential process 调用一个 bash 脚本,该脚本从 Azure 获取访问令牌,并使用该令牌从 AWS STS 获取临时凭证。有关语法和操作系统要求,请参见从外部进程源凭证。在本帖子中,我们创建了一个名为 DevTeamS3ReadOnlyAccess 的自定义配置文件,如配置文件所示:

ini[profile DevTeamS3ReadOnlyAccess]credentialprocess = /opt/bin/credentialsshregion = apsoutheast2

要使用不同的设置,您可以创建和引用其他配置文件。

在本例中,credentialsprocess调用脚本 /opt/bin/credentialssh。将 lt 111122223333gt 替换为您的账户 ID。

bash/opt/bin/credentialssh

!/bin/bash

来自 Azure 的应用 ID URI

AUDIENCE=urn//devawsaccountteama

要假设的 AWS 角色 ARN

ROLEARN=arnawsiamlt 111122223333gtrole/AzureAWSAssumeRole

使用受众检索访问令牌

accesstoken=(curl http//169254169254/metadata/identity/oauth2/tokenapiversion=20180201ampresource={AUDIENCE} H Metadatatrue s jq r accesstoken)

创建遵循 AWS CLI 要求的 JSON 格式凭证

credentials=(aws sts assumerolewithwebidentity rolearn {ROLEARN} webidentitytoken accesstoken rolesessionname AWSAssumeRole jq Credentials jq Version=1)

写入凭证到STDOUT,以便AWS CLI获取

echo credentials

在配置 AWS Config CLI 文件以使用 credentialprocess 脚本后,通过访问 Azure VM 中的 AWS 资源来验证该设置。

使用 AWS CLI 运行以下命令。您应该看到来自您账户的 亚马逊简单存储服务 (Amazon S3) 桶的列表。

bashaws s3 ls profile DevTeamS3ReadOnlyAccess

使用 AWS SDK for Python 运行 s3AccessFromAzurepy。您应该看到来自您账户的 S3 桶的列表。此示例还演示了在凭证使用方面指定要使用的配置文件。

pythonimport boto3# 使用 Web 身份提供程序配置文件假设角色session = boto3Session(profilename=DevTeamS3ReadOnly