TIP プラグインを使用して AWS のサービスへアクセスする - AWS SDK とツール

TIP プラグインを使用して AWS のサービスへアクセスする

信頼できる ID の伝播 (TIP) は、AWS のサービスの管理者がグループの関連付けなどのユーザー属性に基づいてアクセス許可を付与できるようにする AWS IAM Identity Center の機能です。信頼できる ID の伝播では、ID コンテキストが IAM ロールに追加され、AWS リソースへのアクセスをリクエストするユーザーを識別します。このコンテキストは他の AWS のサービスに伝播されます。

ID コンテキストは、AWS のサービスがアクセスリクエストを受信したときに承認の決定を行うために使用する情報で構成されます。この情報には、リクエスタ (IAM Identity Center ユーザーなど)、アクセスがリクエストされる AWS のサービス (Amazon Redshift など)、アクセス範囲 (読み取り専用アクセスなど) を識別するメタデータが含まれます。受信側の AWS のサービスは、このコンテキストとユーザーに割り当てられたアクセス許可を使用して、リソースへのアクセスを承認します。詳細については、「AWS IAM Identity Center ユーザーガイド」の「Trusted identity propagation overview」を参照してください。

TIP プラグインは、信頼できる ID の伝播をサポートする AWS のサービスで使用できます。リファレンスユースケースとして、「Amazon Q Business User Guide」の「Configuring an Amazon Q Business application using AWS IAM Identity Center」を参照してください。

注記

Amazon Q Business を使用している場合は、「Configuring an Amazon Q Business application using AWS IAM Identity Center」でサービス固有の手順を参照してください。

TIP プラグインを使用するための前提条件

プラグインを機能させるには、次のリソースが必要です。

  1. AWS SDK for Java または AWS SDK for JavaScript のいずれかを使用している必要があります。

  2. 使用しているサービスが信頼できる ID の伝播をサポートしていることを確認します。

    AWS IAM Identity Center ユーザーガイド」にある「AWS managed applications that integrate with IAM Identity Center」の表の「Enables trusted identity propagation through IAM Identity Center」列を参照してください。

  3. IAM Identity Center と信頼できる ID の伝播を有効にします。

    AWS IAM Identity Center ユーザーガイド」の「TIP prerequisites and considerations」を参照してください。

  4. Identity-Center-integrated アプリケーションが必要です。

    AWS IAM Identity Center ユーザーガイド」の「AWS managed applications」または「Customer managed applications」を参照してください。

  5. 信頼できるトークン発行者 (TTI) を設定し、サービスを IAM Identity Center に接続する必要があります。

    AWS IAM Identity Center ユーザーガイド」の「Prerequisites for trusted token issuers」および「Tasks for setting up a trusted token issuer」を参照してください。

コードで TIP プラグインを使用するには

  1. 信頼できる ID の伝播プラグインのインスタンスを作成します。

  2. AWS のサービスとやり取りするためのサービスクライアントインスタンスを作成し、信頼できる ID の伝播プラグインを追加してサービスクライアントをカスタマイズします。

TIP プラグインは以下の入力パラメータを使用します。

  • webTokenProvider: 外部 ID プロバイダーから OpenID トークンを取得するためにお客様が実装する関数。

  • accessRoleArn: ユーザーの ID コンテキストを使用してプラグインが引き受ける IAM ロール ARN。ID 拡張認証情報を取得します。

  • applicationArn: クライアントまたはアプリケーションの一意の識別子文字列。この値は、OAuth 許可が設定されたアプリケーション ARN です。

  • ssoOidcClient: (オプション) SsoOidcClient for Java や client-sso-oidc for JavaScript など、お客様が定義した設定の SSO OIDC クライアント。指定しない場合、applicationRoleArn を使用する OIDC クライアントがインスタンス化されて使用されます。

  • stsClient: (オプション) お客様が定義した設定の AWS STS クライアント。ユーザーの ID コンテキストで accessRoleArn を引き受けるために使用されます。指定しない場合、applicationRoleArn を使用する AWS STS クライアントがインスタンス化されて使用されます。

  • applicationRoleArn: (オプション) OIDC クライアントと AWS STS クライアントをブートストラップできるように AssumeRoleWithWebIdentity で引き受ける IAM ロール ARN。

    • 指定しない場合は、ssoOidcClientstsClient のパラメータの両方を指定する必要があります。

    • 指定した場合、applicationRoleArnaccessRoleArn のパラメータと同じ値にすることはできません。 applicationRoleArn は accessRole を引き受けるために使用される stsClient の構築に使用されます。同じロールが applicationRoleaccessRole の両方に使用される場合、ロールを使用してそれ自体を引き受けることになります (自己ロールの引き受け)。これは AWS では推奨されません。詳細については、お知らせを参照してください。

ssoOidcClientstsClient、および applicationRoleArn のパラメータに関する考慮事項

TIP プラグインを設定するときは、指定するパラメータに基づいて、次のアクセス許可要件を考慮してください。

  • ssoOidcClientstsClient を指定する場合:

    • ssoOidcClient の認証情報には、アイデンティティセンターを呼び出してアイデンティティセンター固有のユーザーコンテキストを取得するための oauth:CreateTokenWithIAM アクセス許可が必要です。

    • stsClient の認証情報には、sts:AssumeRole と、accessRolests:SetContext のアクセス許可が必要です。また、accessRole には、stsClient の認証情報との信頼関係を構成する必要があります。

  • applicationRoleArn を指定する場合:

    • applicationRole は OIDC および STS クライアントの構築に使用されるため、必要なリソース (IdC インスタンス、accessRole) での oauth:CreateTokenWithIAMsts:AssumeRole、および sts:SetContext のアクセス許可が必要です。

    • webToken はプラグインによる AssumeRoleWithWebIdentity 呼び出しを介して applicationRole を引き受けるために使用されるため、applicationRole は、webToken の生成に使用される ID プロバイダーとの信頼関係が必要です。

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 を使用したコードの例

以下の例は、AWS SDK for Java または AWS SDK for JavaScript を使用してコードに TIP プラグインを実装する方法を示しています。

Java

プロジェクトで AWS SDK for Java を使用するには、プロジェクトの 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 に必要なパッケージステートメントを含めます。

次の例は、信頼できる ID の伝播プラグインのインスタンスを作成し、サービスクライアントに追加する 2 つの方法を示しています。どちらの例も Amazon S3 をサービスとして使用し、S3AccessGrantsPlugin を使用してユーザー固有のアクセス許可を管理しますが、信頼できる ID の伝播 (TIP) をサポートする任意の AWS のサービスに適用できます。

注記

これらの例では、S3 Access Grants からユーザー固有のアクセス許可を設定する必要があります。詳細については、S3 Access Grants のドキュメントを参照してください。

オプション 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 承認プラグインパッケージを AWS SDK for JavaScript プロジェクトにインストールします。

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

最後の package.json には、次のような依存関係を含める必要があります。

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

ソースコードで、必要な TrustedIdentityPropagationExtension 依存関係をインポートします。

次の例は、信頼できる ID の伝播プラグインのインスタンスを作成し、サービスクライアントに追加する 2 つの方法を示しています。どちらの例も Amazon S3 をサービスとして使用し、Amazon S3 Access Grants を使用してユーザー固有のアクセス許可を管理しますが、信頼できる ID の伝播 (TIP) をサポートする任意の AWS のサービスに適用できます。

注記

これらの例については、Amazon S3 Access Grants からユーザー固有のアクセス許可を設定する必要があります。詳細については、S3 Access Grants のドキュメントを参照してください。

オプション 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」を参照してください。