Usar o plugin TIP para acessar os Serviços da AWS - AWS SDKs e ferramentas

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Usar o plugin TIP para acessar os Serviços da AWS

A propagação de identidades confiáveis (TIP) é um atributo do Centro de Identidade do AWS IAM que permite que os administradores de Serviços da AWS concedam permissões com base em atributos do usuário, como associações a grupos. Com a propagação de identidade confiável, o contexto de identidade é adicionado a um perfil do IAM para identificar o usuário que está solicitando acesso aos recursos da AWS. Esse contexto é propagado para outros Serviços da AWS.

O contexto de identidade compreende as informações que os Serviços da AWS usam para tomar decisões de autorização quando recebem solicitações de acesso. Essas informações incluem metadados que identificam o solicitante (por exemplo, um usuário do IAM Identity Center), o AWS service (Serviço da AWS) ao qual é solicitado acesso (por exemplo, Amazon Redshift) e o escopo do acesso (por exemplo, acesso somente para leitura). O AWS service (Serviço da AWS) de destino usa esse contexto e as permissões atribuídas ao usuário para autorizar o acesso a seus recursos. Para obter mais informações, consulte Trusted identity propagation across application no Centro de Identidade do AWS IAM User Guide.

O plug-in TIP pode ser usado com Serviços da AWS compatíveis com propagação de identidades confiáveis. Como caso de uso de referência, consulte Configuring an Amazon Q Business application using Centro de Identidade do AWS IAM no Amazon Q Business User Guide.

nota

Se você estiver usando o Amazon Q Business, consulte Configuring an Amazon Q Business application using Centro de Identidade do AWS IAM para obter instruções específicas para o serviço.

Pré-requisitos para o uso do plug-in TIP

Os seguintes recursos são necessários para o plug-in funcionar:

  1. Você deve estar usando o AWS SDK para Java ou o AWS SDK para JavaScript.

  2. Verifique se o serviço que você está usando é compatível com propagação de identidades confiáveis.

    Consulte a coluna Enables trusted identity propagation through IAM Identity Center da tabela AWS managed applications that integrate with IAM Identity Center no Centro de Identidade do AWS IAM User Guide..

  3. Habilite o IAM Identity Center e a propagação de identidades confiáveis.

    Consulte TIP prerequisites and considerations no Centro de Identidade do AWS IAM User Guide.

  4. Você deve ter uma aplicação integrada ao Identity-Center.

    Consulte AWS managed applications ou Customer managed applications no Centro de Identidade do AWS IAM User Guide..

  5. Você deve configurar um emissor de token confiável (TTI) e conectar seu serviço ao IAM Identity Center.

    Consulte Prerequisites for trusted token issuers e Tasks for setting up a trusted token issuer no Centro de Identidade do AWS IAM User Guide.

Para usar o plug-in TIP no código

  1. Crie uma instância do plug-in de propagação de identidades confiáveis.

  2. Crie uma instância de cliente do serviço para interagir com o AWS service (Serviço da AWS) e personalize o cliente do serviço adicionando o plug-in de propagação de identidades confiáveis.

O plug-in TIP aceita os seguintes parâmetros de entrada:

  • webTokenProvider: uma função que o cliente implementa para obter um token do OpenID do respectivo provedor de identidades externo.

  • accessRoleArn: o ARN do perfil do IAM a ser assumido pelo plug-in com o contexto de identidade do usuário para obter as credenciais aprimoradas com identidade.

  • applicationArn: string do identificador exclusivo do cliente ou da aplicação. Esse valor é um ARN da aplicação que tem concessões de OAuth configuradas.

  • ssoOidcClient: (opcional) um cliente OIDC de SSO, como o SsoOidcClient para Java ou o client-sso-oidc para Javascript, com configurações definidas pelo cliente. Se não for fornecido, um cliente do OIDC usando o applicationRoleArn será instanciado e usado.

  • stsClient: (opcional) um cliente do AWS STS com configurações definidas pelo cliente, usado para assumir o accessRoleArn com o contexto da identidade do usuário. Se não for fornecido, um cliente do AWS STS usando o applicationRoleArn será instanciado e usado.

  • applicationRoleArn: (opcional) o ARN do perfil do IAM que deve ser assumido com AssumeRoleWithWebIdentity para que os clientes do OIDC e do AWS STS possam ser inicializados.

    • Se não forem fornecidos, ambos os parâmetros ssoOidcClient e stsClient deverão ser fornecidos.

    • Se fornecido, o applicationRoleArn não poderá ser igual ao valor do parâmetro accessRoleArn. applicationRoleArn é usado para compilar o STSClient, que é usado para assumir o accessRole. Se o mesmo perfil for usado para applicationRole e accessRole, isso significaria usar um perfil para assumir a si mesmo (assumir um autoperfil), o que é não é recomendado pela AWS. Consulte announcement para obter mais detalhes.

Considerações sobre os parâmetros ssoOidcClient, stsClient e applicationRoleArn

Ao configurar o plug-in TIP, considere os seguintes requisitos de permissão com base nos parâmetros que você fornecer:

  • Se você estiver fornecendo ssoOidcClient e stsClient:

    • As credenciais no ssoOidcClient devem ter permissão de oauth:CreateTokenWithIAM para chamar a central de identidade para obter o contexto do usuário específico da central de identidade.

    • As credenciais no stsClient devem ter as permissões sts:AssumeRole e sts:SetContext noaccessRole. O accessRole também precisa ser configurado com uma relação de confiança com as credenciais no stsClient.

  • Se você estiver fornecendo applicationRoleArn:

    • O applicationRole deve ter as permissões oauth:CreateTokenWithIAM, sts:AssumeRole e sts:SetContext nos recursos necessários (instância do IdC, accessRole), pois ele será usado para compilar os clientes do OIDC e do STS.

    • O applicationRole deve ter uma relação de confiança com o provedor de identidades usado para gerar o webToken, pois o webToken será usado para assumir o applicationRole por chamada de AssumeRoleWithWebIdentity pelo plug-in.

Exemplo da configuração ApplicationRole:

Política de confiança com o provedor 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 permissão:

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

Exemplos de código usando TIP

Os exemplos abaixo mostram como implementar o plug-in TIP no código usando o AWS SDK para Java ou o AWS SDK para JavaScript.

Java

Para usar o plug-in TIP no seu projeto do AWS SDK para Java, você precisará declará-lo como uma dependência no arquivo pom.xml do projeto.

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

No código-fonte, inclua a instrução de pacote necessária para software.amazon.awssdk.trustedidentitypropagation.

Os exemplos a seguir mostram duas maneiras de criar uma instância do plug-in de propagação de identidades confiáveis e adicioná-lo a um cliente de serviço. Ambos os exemplos usam o Amazon S3 como serviço e o utilizam o S3AccessGrantsPlugin para gerenciar permissões específicas do usuário, mas podem ser aplicados a qualquer AWS service (Serviço da AWS) compatível com propagação de identidades confiáveis (TIP).

nota

Para esses exemplos, você precisa configurar as permissões específicas do usuário de Concessão de Acesso do S3. Consulte a documentação de Concessão de Acesso do S3 para obter mais detalhes.

Opção 1: criar e transmitir clientes do OIDC e do 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());

Opção 2: passar o applicationRoleArn e delegar a criação de clientes ao plug-in

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 obter mais detalhes e a fonte, consulte trusted-identity-propagation-java no GitHub.

JavaScript

Execute o comando a seguir para instalar o pacote do plug-in de autenticação TIP no seu projeto do AWS SDK para JavaScript:

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

O package.json final deve incluir uma dependência semelhante à seguinte:

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

No seu código-fonte, importe a dependência de TrustedIdentityPropagationExtension necessária.

Os exemplos a seguir mostram duas maneiras de criar uma instância do plug-in de propagação de identidades confiáveis e adicioná-lo a um cliente de serviço. Ambos os exemplos usam o Amazon S3 como serviço e utilizam Concessão de Acesso do Amazon S3 para gerenciar permissões específicas do usuário, mas podem ser aplicados a qualquer AWS service (Serviço da AWS) compatível com propagação de identidades confiáveis (TIP).

nota

Para esses exemplos, você precisa configurar as permissões específicas do usuário de Concessão de Acesso do Amazon S3. Consulte a documentação de Concessão de Acesso do Amazon S3 para obter mais detalhes.

Opção 1: criar e transmitir clientes do OIDC e do 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); }

Opção 2: passar o applicationRoleArn e delegar a criação de clientes ao plug-in

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 obter mais detalhes e fontes, consulte trusted-identity-propagation-js no GitHub.