Usando o plugin TIP para acessar 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á.

Usando o plugin TIP para acessar Serviços da AWS

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

O contexto de identidade compreende informações que são Serviços da AWS usadas para tomar decisões de autorização ao receber solicitações de acesso. Essas informações incluem metadados que identificam o solicitante (por exemplo, um usuário do IAM Identity Center), o acesso AWS service (Serviço da AWS) ao qual o acesso é solicitado (por exemplo, Amazon Redshift) e o escopo do acesso (por exemplo, acesso somente para leitura). O destinatário AWS service (Serviço da AWS) usa esse contexto e todas as permissões atribuídas ao usuário para autorizar o acesso aos seus recursos. Para obter mais informações, consulte a visão geral da propagação de identidade confiável no Guia do Centro de Identidade do AWS IAM usuário.

O plug-in TIP pode ser usado com Serviços da AWS esse suporte à propagação confiável de identidade. 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 AWS SDK para JavaScript o.

  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 um Identity-Center-integrated aplicativo.

    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 de serviço para interagir com você AWS service (Serviço da AWS) e personalize o cliente de serviço adicionando o plug-in confiável de propagação de identidade.

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 específico do cliente ou da aplicação. Esse valor é um ARN do aplicativo que tem OAuth concessões configuradas.

  • ssoOidcClient: (Opcional) Um cliente OIDC SSO, como SsoOidcClientpara Java ou for JavaScript, com configurações client-sso-oidcdefinidas 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 AWS STS cliente usando applicationRoleArn será instanciado e usado.

  • applicationRoleArn: (Opcional) O ARN da função do IAM a ser assumido para que o OIDC e os AWS STS clientes AssumeRoleWithWebIdentity 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 papel for usado para ambos applicationRole eaccessRole, isso significaria usar um papel para assumir a si mesmo (suposição de papel próprio), o que é desencorajado por. 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ê fornecer 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.

    • applicationRoledeve ter uma relação de confiança com o provedor de identidade usado para gerar owebToken, pois webToken será usado para assumir o ApplicationRole por meio da AssumeRoleWithWebIdentitychamada do plug-in.

Exemplo ApplicationRole de configuração:

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 em seu código usando o AWS SDK para Java ou AWS SDK para JavaScript o.

Java

Para usar o plug-in TIP em seu AWS SDK para Java projeto, você precisa declará-lo como uma dependência no arquivo do pom.xml seu 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 S3AccessGrantsPlugin para gerenciar permissões específicas do usuário, mas podem ser aplicados a qualquer um AWS service (Serviço da AWS) que ofereça suporte à propagação de identidade confiável (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 applicationRoleArn e adiar a criação do cliente para o 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 detalhes adicionais e fontes, consulte trusted-identity-propagation-javaem GitHub.

JavaScript

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

$ 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 os Amazon S3 Access Grants para gerenciar permissões específicas do usuário, mas podem ser aplicados a AWS service (Serviço da AWS) qualquer um que ofereça suporte à propagação de identidade confiável (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 applicationRoleArn e adiar a criação do cliente para o 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 detalhes adicionais e fontes, consulte trusted-identity-propagation-jsem GitHub.