使用 TIP 插件进行访问 Amazon Web Services 服务 - Amazon SDKs 和工具
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 TIP 插件进行访问 Amazon Web Services 服务

可信身份传播 (TIP) 是一项功能 Amazon IAM Identity Center ,它使的 Amazon Web Services 服务 管理员能够根据用户属性(例如群组关联)授予权限。通过可信身份传播,可以向 IAM 角色添加身份上下文,以识别请求访问 Amazon 资源的用户。此上下文会传播到其他 Amazon Web Services 服务上下文。

身份上下文包含在他们收到访问请求时 Amazon Web Services 服务 用于做出授权决策的信息。这些信息包括识别请求者(例如,IAM 身份中心用户)、请求访问权限的元数据(例如 Amazon Redshift)和访问范围(例如,只读权限)的元数据。 Amazon Web Services 服务 接收方 Amazon Web Services 服务 使用此上下文以及分配给用户的任何权限来授权访问其资源。有关更多信息,请参阅《 Amazon IAM Identity Center 用户指南》中的 “可信身份传播概述”。

使用 TIP 插件的先决条件

要使该插件正常运行,需要以下资源:

  1. 您必须使用 适用于 Java 的 Amazon SDK 或 适用于 JavaScript 的 Amazon SDK。

  2. 确认您使用的服务支持可信身份传播。

    请参阅《Amazon IAM Identity Center 用户指南》中与 IAM Identity Center 集成的Amazon 托管应用程序的 “通过 IAM 身份中心启用可信身份传播” 一栏。

  3. 启用 IAM 身份中心和可信身份传播。

    请参阅《Amazon IAM Identity Center 用户指南》中的 TIP 先决条件和注意事项

  4. 你必须有一个 Identity-Center-integrated应用程序。

    参见《Amazon IAM Identity Center 用户指南》中的Amazon 管应用程序或客户托管的应用程序。

  5. 您必须设置可信令牌发行者 (TTI) 并将您的服务连接到 IAM 身份中心。

    请参阅Amazon IAM Identity Center 用户指南》中的可信令牌发行者的先决条件设置可信令牌发行者的任务

在代码中使用 TIP 插件

  1. 创建可信身份传播插件的实例。

  2. 创建用于与您的交互的服务客户端实例, Amazon Web Services 服务 并通过添加可信身份传播插件来自定义服务客户端。

TIP 插件采用以下输入参数:

  • webTokenProvider:客户为从其外部身份提供商处获取 OpenID 令牌而实现的函数。

  • accessRoleArn:插件将扮演的 IAM 角色 ARN,其中包含用户的身份上下文,以获取身份增强证书。

  • applicationArn:客户端或应用程序的唯一标识符字符串。此值是已配置 OAuth 授权的应用程序 ARN。

  • ssoOidcClient:(可选)具有客户定义配置的 SSO OIDC 客户端,例如SsoOidcClient适用于 Java 或 for client-sso-oidc的 JavaScript客户端。如果未提供,则applicationRoleArn将实例化并使用使用的 OIDC 客户端。

  • stsClient:(可选)具有 Amazon STS 客户定义配置的客户端,用于假设accessRoleArn用户的身份上下文。如果未提供,则applicationRoleArn将实例化并使用正在使用的 Amazon STS 客户端。

  • applicationRoleArn:(可选)要使用的 IAM 角色 ARN,AssumeRoleWithWebIdentity以便可以引导 OIDC 和 Amazon STS 客户端。

    • 如果未提供,则必须同时提供ssoOidcClientstsClient参数。

    • 如果提供,则该值applicationRoleArn不能与accessRoleArn参数相同。 applicationRoleArn用于构建 stsClient,它用于假设 AccessRole。如果两者都使用相同的角色 applicationRoleaccessRole,则意味着使用角色来扮演自己(自我角色假设),这是不鼓励的。 Amazon有关更多详细信息,请参阅公告

ssoOidcClientstsClient、和applicationRoleArn参数的注意事项

配置 TIP 插件时,请根据您提供的参数考虑以下权限要求:

  • 如果您提供ssoOidcClient并且stsClient

    • 上的凭据ssoOidcClientoauth:CreateTokenWithIAM有权致电身份中心以获取身份中心特定的用户上下文。

    • 上的凭证stsClient应具有sts:AssumeRolests:SetContext权限应为accessRoleaccessRole还需要在证书开启的情况下配置信任关系stsClient

  • 如果您提供applicationRoleArn

    • applicationRole应该对oauth:CreateTokenWithIAM所需资源(IdC 实例accessRole)拥有sts:AssumeRolests:SetContext权限,因为它将用于构建 OIDC 和 STS 客户端。

    • applicationRole应该与用于生成的身份提供者建立信任关系webToken,因为webToken将用于通过插件的AssumeRoleWithWebIdentity调用来假设 ApplicationRole。

ApplicationRole 配置示例:

网络令牌提供商的信任政策:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/IDENTITY_PROVIDER_URL" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "IDENTITY_PROVIDER_URL:aud": "CLIENT_ID_TO_BE_TRUSTED" } } } ] }

权限政策:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetContext" ], "Resource": [ "accessRoleArn" ] }, { "Effect": "Allow", "Action": [ "sso-oauth:CreateTokenWithIAM" ], "Resource": [ "*" ] } ] }

使用 TIP 的代码示例

以下示例显示了如何使用 适用于 Java 的 Amazon SDK 或在代码中实现 TIP 插件 适用于 JavaScript 的 Amazon SDK。

Java

要在 适用于 Java 的 Amazon SDK 项目中使用 TIP 插件,您需要在项目pom.xml文件中将其声明为依赖项。

<dependency> <groupId>software.amazon.awsidentity.trustedIdentityPropagation</groupId> <artifactId>aws-sdk-java-trustedIdentityPropagation-java-plugin</artifactId> <version>2.0.0</version> </dependency>

在您的源代码中,包括所需的软件包声明software.amazon.awssdk.trustedidentitypropagation

以下示例显示了创建可信身份传播插件实例并将其添加到服务客户端的两种方法。这两个示例都使用 Amazon S3 作为服务并S3AccessGrantsPlugin用来管理用户的特定权限,但可以应用于任何 Amazon Web Services 服务 支持可信身份传播 (TIP) 的权限。

注意

对于这些示例,您需要从 S3 访问权限授予中设置用户特定的权限。有关更多详细信息,请参阅 S3 访问权限授予文档

选项 1:构建并传递 OIDC 和 STS 客户端

SsoOidcClient oidcClient = SsoOidcClient.builder() .region(Region.US_EAST_1) .credentialsProvider(credentialsProvider).build(); StsClient stsClient = StsClient.builder() .region(Region.US_EAST_1) .credentialsProvider(credentialsProvider).build(); TrustedIdentityPropagationPlugin trustedIdentityPropagationPlugin = TrustedIdentityPropagationPlugin.builder() .webTokenProvider(() -> webToken) .applicationArn(idcApplicationArn) .accessRoleArn(accessRoleArn) .ssoOidcClient(oidcClient) .stsClient(stsClient) .build(); S3AccessGrantsPlugin accessGrantsPlugin = S3AccessGrantsPlugin.builder() .build(); S3Client s3Client = S3Client.builder().region(Region.US_EAST_1) .crossRegionAccessEnabled(true) .addPlugin(trustedIdentityPropagationPlugin) .addPlugin(accessGrantsPlugin) .build(); final var resp = s3Client.getObject(GetObjectRequest.builder() .key("path/to/object/fileName") .bucket("bucketName") .build());

选项 2:将客户端创建传递给插件 applicationRoleArn 并推迟创建

TrustedIdentityPropagationPlugin trustedIdentityPropagationPlugin = TrustedIdentityPropagationPlugin.builder() .webTokenProvider(() -> webToken) .applicationArn(idcApplicationArn) .accessRoleArn(accessRoleArn) .applicationRoleArn(applicationRoleArn) .build(); S3AccessGrantsPlugin accessGrantsPlugin = S3AccessGrantsPlugin.builder() .build(); S3Client s3Client = S3Client.builder().region(Region.US_EAST_1) .crossRegionAccessEnabled(true) .addPlugin(trustedIdentityPropagationPlugin) .addPlugin(accessGrantsPlugin) .build(); final var resp = s3Client.getObject(GetObjectRequest.builder() .key("path/to/object/fileName") .bucket("bucketName") .build());

有关更多详细信息和来源,请参阅 trusted-identity-propagation-java上的 GitHub。

JavaScript

运行以下命令在您的 适用于 JavaScript 的 Amazon SDK 项目中安装 TIP 身份验证插件包:

$ npm i @aws-sdk-extension/trusted-identity-propagation

最终package.json应包含类似于以下内容的依赖关系:

"dependencies": { "@aws-sdk-extension/trusted-identity-propagation": "^2.0.0" },

在源代码中,导入所需的TrustedIdentityPropagationExtension依赖关系。

以下示例显示了创建可信身份传播插件实例并将其添加到服务客户端的两种方法。这两个示例都使用 Amazon S3 作为服务,并利用 Amazon S3 访问权限来管理用户的特定权限,但可以应用于任何 Amazon Web Services 服务 支持可信身份传播 (TIP) 的权限。

注意

有关这些示例,您需要从 Amazon S3 访问授权中设置用户特定的权限,有关更多详细信息,请参阅 Amazon S3 访问授权文档

选项 1:构建并传递 OIDC 和 STS 客户端

import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"; import { S3ControlClient, GetDataAccessCommand } from "@aws-sdk/client-s3-control"; import { TrustedIdentityPropagationExtension } from "@aws-sdk-extension/trusted-identity-propagation"; const s3ControlClient = new S3ControlClient({ region: "us-east-1", extensions: [ TrustedIdentityPropagationExtension.create({ webTokenProvider: async () => { return 'ID_TOKEN_FROM_YOUR_IDENTITY_PROVIDER'; }, ssoOidcClient: customOidcClient, stsClient: customStsClient, accessRoleArn: accessRoleArn, applicationArn: applicationArn, }), ], }); const getDataAccessParams = { Target: "S3_URI_PATH", Permission: "READ", AccountId: ACCOUNT_ID, InstanceArn: S3_ACCESS_GRANTS_ARN, TargetType: "Object", }; try { const command = new GetDataAccessCommand(getDataAccessParams); const response = await s3ControlClient.send(command); const credentials = response.Credentials; // Create a new S3 client with the temporary credentials const temporaryS3Client = new S3Client({ region: "us-east-1", credentials: { accessKeyId: credentials.AccessKeyId, secretAccessKey: credentials.SecretAccessKey, sessionToken: credentials.SessionToken, }, }); // Use the temporary S3 client to perform the operation const s3Params = { Bucket: "BUCKET_NAME", Key: "S3_OBJECT_KEY", }; const getObjectCommand = new GetObjectCommand(s3Params); const s3Object = await temporaryS3Client.send(getObjectCommand); const fileContent = await s3Object.Body.transformToString(); // Process the S3 object data console.log("Successfully retrieved S3 object:", fileContent); } catch (error) { console.error("Error accessing S3 data:", error); }

选项 2:将客户端创建传递给插件 applicationRoleArn 并推迟创建

import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"; import { S3ControlClient, GetDataAccessCommand } from "@aws-sdk/client-s3-control"; import { TrustedIdentityPropagationExtension } from "@aws-sdk-extension/trusted-identity-propagation"; const s3ControlClient = new S3ControlClient({ region: "us-east-1", extensions: [ TrustedIdentityPropagationExtension.create({ webTokenProvider: async () => { return 'ID_TOKEN_FROM_YOUR_IDENTITY_PROVIDER'; }, accessRoleArn: accessRoleArn, applicationRoleArn: applicationRoleArn, applicationArn: applicationArn, }), ], }); // Same S3 AccessGrants workflow as Option 1 const getDataAccessParams = { Target: "S3_URI_PATH", Permission: "READ", AccountId: ACCOUNT_ID, InstanceArn: S3_ACCESS_GRANTS_ARN, TargetType: "Object", }; try { const command = new GetDataAccessCommand(getDataAccessParams); const response = await s3ControlClient.send(command); const credentials = response.Credentials; const temporaryS3Client = new S3Client({ region: "us-east-1", credentials: { accessKeyId: credentials.AccessKeyId, secretAccessKey: credentials.SecretAccessKey, sessionToken: credentials.SessionToken, }, }); const s3Params = { Bucket: "BUCKET_NAME", Key: "S3_OBJECT_KEY", }; const getObjectCommand = new GetObjectCommand(s3Params); const s3Object = await temporaryS3Client.send(getObjectCommand); const fileContent = await s3Object.Body.transformToString(); console.log("Successfully retrieved S3 object:", fileContent); } catch (error) { console.error("Error accessing S3 data:", error); }

有关更多详细信息和来源,请参阅trusted-identity-propagation-js上的 GitHub。