使用 TIP 插件访问 Amazon Web Services 服务 - Amazon SDK 和工具
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 Identity Center 用户)、被请求访问的 Amazon Web Services 服务(例如 Amazon Redshift)和访问范围(例如,只读权限)的元数据。收到请求的 Amazon Web Services 服务使用此上下文以及分配给用户的任何权限来授权访问其资源。有关更多信息,请参阅《Amazon IAM Identity Center 用户指南》中的 Trusted identity propagation overview

使用 TIP 插件的先决条件

需要具有下列资源才能正常使用该插件:

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

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

    请参阅《Amazon IAM Identity Center 用户指南》中 Amazon managed applications that integrate with IAM Identity Center 表的 Enables trusted identity propagation through IAM Identity Center

  3. 启用 IAM Identity Center 和可信身份传播。

    请参阅《Amazon IAM Identity Center 用户指南》中的 TIP prerequisites and considerations

  4. 您必须有一个与 Identity Center 集成的应用程序。

    请参阅《Amazon IAM Identity Center 用户指南》中的 Amazon managed applicationsCustomer managed applications

  5. 您必须设置一个可信令牌颁发者(TTI)并将您的服务连接到 IAM Identity Center。

    请参阅《Amazon IAM Identity Center 用户指南》中的 Prerequisites for trusted token issuersTasks for setting up a trusted token issuer

在代码中使用 TIP 插件

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

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

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

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

  • accessRoleArn:该插件要使用用户的身份上下文代入的 IAM 角色的 ARN,用来获取身份增强型凭证。

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

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

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

  • applicationRoleArn:(可选)将使用 AssumeRoleWithWebIdentity 代入的 IAM 角色的 ARN,用来引导 OIDC 和 Amazon STS 客户端。

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

    • 如果提供,则 applicationRoleArn 的值不能与 accessRoleArn 参数的值相同。applicationRoleArn 用来构建用于代入 accessRole 的 stsClient。如果 applicationRoleaccessRole 使用同一角色,则意味着要使用代入自身的角色(自我角色代入),Amazon 不建议这样操作。有关更多详细信息,请参阅公告

ssoOidcClientstsClientapplicationRoleArn 参数的注事意项

配置 TIP 插件时,根据您提供的参数应注意以下权限要求:

  • 如果您提供了 ssoOidcClientstsClient

    • ssoOidcClient 上的凭证应具有 oauth:CreateTokenWithIAM 权限,以调用 Identity Center 来获取 Identity Center 特定的用户上下文。

    • stsClient 上的凭证应具有 accessRole 上的 sts:AssumeRolests:SetContext 权限。accessRole 还需要配置与 stsClient 上的凭证的信任关系。

  • 如果您提供了 applicationRoleArn

    • applicationRole 应具有所需资源(IdC 实例、accessRole)的 oauth:CreateTokenWithIAMsts:AssumeRolests:SetContext 权限,因为该角色将用于构建 OIDC 和 STS 客户端。

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

示例 ApplicationRole 配置:

Web 令牌提供者的信任策略:

{ "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 或 适用于 JavaScript 的 Amazon SDK 在代码中实现 TIP 插件。

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 来管理用户特定权限,不过这些示例可以应用于任何支持可信身份传播(TIP)的 Amazon Web Services 服务。

注意

对于这些示例,您需要从 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());

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

JavaScript

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

$ 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 访问权限管控来管理用户特定权限,不过这些示例可以应用于任何支持可信身份传播(TIP)的 Amazon Web Services 服务。

注意

对于这些示例,您需要从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); }

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