Uso del complemento TIP para acceder a los Servicios de AWS - AWS SDKs y herramientas

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso del complemento TIP para acceder a los Servicios de AWS

La propagación de identidades de confianza (TIP) es una característica de AWS IAM Identity Center que permite a los administradores de Servicios de AWS conceder permisos en función de los atributos de los usuarios, como las asociaciones de grupos. Con la propagación de identidad de confianza, se agrega el contexto de identidad a un rol de IAM para identificar al usuario que solicita acceso a los recursos de AWS. Este contexto se propaga a otros Servicios de AWS.

El contexto de identidad comprende la información que Servicios de AWS utiliza para tomar decisiones de autorización cuando se reciben solicitudes de acceso. Esta información incluye los metadatos que identifican al solicitante (por ejemplo, un usuario de IAM Identity Center), el Servicio de AWS al que se solicita el acceso (por ejemplo, Amazon Redshift) y el ámbito del acceso (por ejemplo, el acceso de solo lectura). El Servicio de AWS destinatario utiliza este contexto y cualquier permiso asignado al usuario para autorizar el acceso a sus recursos. Para obtener más información, consulte Descripción general de la propagación de identidades de confianza en la Guía del usuario de AWS IAM Identity Center.

El complemento de TIP se puede utilizar con Servicios de AWS que admiten la propagación de identidades de confianza. Como caso de uso de referencia, consulte Configuración de una aplicación de Amazon Q Business mediante AWS IAM Identity Center en la Guía del usuario de Amazon Q Business.

nota

Si utilizas Amazon Q Business, consulta Configuración de una aplicación de Amazon Q Business mediante AWS IAM Identity Center para obtener las instrucciones específicas del servicio.

Requisitos previos para utilizar el complemento de TIP

Los recursos siguientes son necesarios para que el complemento funcione:

  1. Debe utilizar el valor AWS SDK para Java o el valor AWS SDK para JavaScript.

  2. Compruebe que el servicio que está utilizando es compatible con la propagación de identidades de confianza.

    Consulte la columna Permite la propagación de identidades de confianza a través del IAM Identity Center de la tabla de aplicaciones administradas de AWS que se integran con el IAM Identity Center de la Guía del usuario de AWS IAM Identity Center.

  3. Puede habilitar IAM Identity Center y utilizarlo únicamente para la propagación de identidades de confianza.

    Consulte los requisitos previos y las consideraciones de la TIP en la Guía del usuario de AWS IAM Identity Center.

  4. Debe tener una aplicación integrada en Identity-Center.

    Consulte las aplicaciones administradas de AWS o las aplicaciones administradas por el cliente en la Guía del usuario de AWS IAM Identity Center.

  5. Debe configurar un emisor de token de confianza (TTI) y conectar su servicio al IAM Identity Center.

    Consulte los requisitos previos para emisores de tokens de confianza y las tareas para configurar un emisor de token de confianza en la Guía del usuario de AWS IAM Identity Center.

Para usar el complemento de TIP en su código

  1. Cree una instancia del complemento de propagación de identidades de confianza.

  2. Cree una instancia de cliente de servicio para interactuar con su Servicio de AWS y personalice el cliente de servicio al agregar el complemento de propagación de identidades de confianza.

El complemento de TIP usa los siguientes parámetros:

  • webTokenProvider: una función que el cliente implementa para obtener un token OpenID de su proveedor de identidad externo.

  • accessRoleArn: el ARN del rol de IAM que debe asumir el complemento con el contexto de identidad del usuario para obtener las credenciales de identidad mejorada.

  • applicationArn: la cadena del identificador único del cliente o de la aplicación. Este valor es un ARN de aplicación que tiene configuradas las concesiones de OAuth.

  • ssoOidcClient: (opcional) un cliente SSO OIDC, como SsoOidcClient para Java o client-sso-oidc para JavaScript, con configuraciones definidas por el cliente. Si no se proporciona, se creará una instancia y se utilizará un cliente OIDC que utilice applicationRoleArn.

  • stsClient: (opcional) Un cliente de AWS STS con configuraciones definidas por el cliente, que se utiliza para asumir accessRoleArn con el contexto de identidad del usuario. Si no se proporciona, se creará una instancia y se utilizará un cliente AWS STS que utilice applicationRoleArn.

  • applicationRoleArn: (opcional) el ARN del rol de IAM que se va a asumir con AssumeRoleWithWebIdentity para poder arrancar los clientes OIDC y AWS STS.

    • Si no se proporciona, se deben proporcionar ambos parámetros ssoOidcClient y stsClient.

    • Si se proporciona, applicationRoleArn no puede tener el mismo valor que el parámetro accessRoleArn. applicationRoleArn se utiliza para crear el stsClient, que se utiliza para asumir accessRole. Si se usa el mismo rol para ambos applicationRole y accessRole, significaría usar un rol para asumirse a sí mismo (suposición del rol propio), algo que AWS no recomienda. Consulte el anuncio para obtener más detalles.

Consideraciones para los parámetros ssoOidcClient, stsClient y applicationRoleArn

Al configurar el complemento de TIP, tenga en cuenta los siguientes requisitos de permiso en función de los parámetros que proporcione:

  • Si proporciona ssoOidcClient y stsClient:

    • Las credenciales en ssoOidcClient deben tener permiso oauth:CreateTokenWithIAM para llamar al centro de identidad y obtener el contexto de usuario específico del centro de identidad.

    • Las credenciales en stsClient deben contar con sts:AssumeRole y permisos sts:SetContext en accessRole. accessRole también debe configurarse con una relación de confianza con las credenciales activadas en stsClient.

  • Si proporciona applicationRoleArn:

    • applicationRole debe tener los permisos oauth:CreateTokenWithIAM, sts:AssumeRole y sts:SetContext necesarios en los recursos requeridos (instancia deIdC, accessRole), ya que se utilizará para crear clientes OIDC y STS.

    • applicationRole debe tener una relación de confianza con el proveedor de identidad que se utilice para generar el webToken, ya que webToken se utilizará para asumir el applicationRole mediante la llamada AssumeRoleWithWebIdentity del complemento.

Ejemplo de configuración de ApplicationRole:

Política de confianza con el proveedor de tokens 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" } } } ] }

Política de permisos:

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

Ejemplos de código que utilizan TIP

Los ejemplos siguientes muestran cómo implementar el complemento de TIP en su código con AWS SDK para Java o AWS SDK para JavaScript.

Java

Para utilizar el complemento de TIP en el proyecto AWS SDK para Java, tendrá que declararlo como una dependencia en el archivo pom.xml del proyecto.

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

En su código fuente, incluya la declaración de paquete requerida para software.amazon.awssdk.trustedidentitypropagation.

Los siguientes ejemplos muestran dos formas de crear una instancia del complemento de propagación de identidades de confianza y agregarla a un cliente de servicio. Ambos ejemplos utilizan Amazon S3 como servicio y utilizan S3AccessGrantsPlugin para administrar los permisos específicos del usuario, pero se pueden aplicar a cualquier Servicio de AWS que admita la propagación de identidades de confianza (TIP).

nota

Para estos ejemplos, debe configurar los permisos específicos de usuario de S3 Access Grants. Consulte la documentación de concesiones de acceso de S3 para obtener más información.

Opción 1: Cree y transfiera clientes OIDC y 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());

Opción 2: Pasar ApplicationRoleArn y aplazar la creación del cliente al complemento

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());

Para obtener información y fuentes adicionales, consulte trusted-identity-propagation-java en GitHub.

JavaScript

Ejecute el comando siguiente para instalar el paquete de complemento de autenticación de TIP, en su proyecto AWS SDK para JavaScript:

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

El package.json final debería incluir una dependencia similar a la siguiente:

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

En su código fuente, importe la dependencia de TrustedIdentityPropagationExtension requerida.

Los siguientes ejemplos muestran dos formas de crear una instancia del complemento de propagación de identidades de confianza y agregarla a un cliente de servicio. Ambos ejemplos utilizan Amazon S3 como servicio y emplean concesiones de acceso a Amazon S3 para administrar los permisos específicos del usuario, pero se pueden aplicar a cualquier Servicio de AWS que admita la propagación de identidades de confianza (TIP).

nota

Para estos ejemplos, debe configurar los permisos específicos de usuario de concesiones de acceso a Amazon S3; consulte la documentación de concesiones de acceso a Amazon S3 para obtener más información.

Opción 1: Cree y transfiera clientes OIDC y 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); }

Opción 2: Pasar ApplicationRoleArn y aplazar la creación del cliente al complemento

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); }

Para obtener información y fuentes adicionales, consulte trusted-identity-propagation-js en GitHub.