Como posso oferecer acesso entre contas a objetos que estão em buckets do Amazon S3?

Última atualização: 26/02/2021

Quero conceder acesso a um objeto armazenado em um bucket do Amazon Simple Storage Service (Amazon S3) para outra conta da AWS. Como posso oferecer acesso entre contas a buckets do Amazon S3?

Descrição breve

Use um dos seguintes métodos para conceder acesso entre contas a objetos armazenados em buckets do S3:

  • Políticas baseadas em recursos e políticas do AWS Identity and Access Management (IAM) para conceder acesso apenas programático a objetos em buckets do S3
  • Uma Lista de Controle de Acesso (ACL) baseada em recursos e políticas do IAM para conceder acesso apenas programático a objetos em buckets do S3
  • Funções do IAM entre contas para conceder acesso programático e do console a objetos em buckets do S3

Use uma das soluções a seguir para conceder acesso detalhado entre contas a objetos armazenados em buckets do S3 de acordo com o tipo de acesso que deseja oferecer, . Nos exemplos a seguir, você concede acesso a usuários em outra conta da AWS (Conta B) para que eles possam gerenciar objetos em um bucket do S3 de outra conta (Conta A).

Observação: confirme que atualizou a política para incluir o ID da conta, o nome do bucket, o ARN etc..

Resolução

Políticas baseadas em recursos e políticas do IAM

Observação: se você receber erros ao executar comandos na AWS Command Line Interface (AWS CLI), verifique se está usando a versão mais recente da interface.

Use políticas do bucket para gerenciar o controle entre contas e auditorar as permissões de objetos do S3. Se você aplicar uma política ao bucket, poderá definir quem tem acesso (elemento Principal), que objetos podem ser acessados (elemento Resource) e como o acesso pode ser feito (elemento Action). Aplicar uma política ao bucket permite que você defina o acesso detalhado a diferentes objetos dentro do bucket. Você também pode revisar a política do bucket para ver quem pode acessar objetos em um bucket do S3.

Siga estas etapas para gerenciar o acesso a buckets do S3 usando políticas de bucket:

Observação: substitua as variáveis de Account (Conta) pela sua conta.

1.    Crie um bucket do S3 na Conta A.

2.    Crie um usuário ou uma função do IAM na Conta B.

3.    Use a política do IAM para conceder a permissão de download (GET Object) e upload (PUT Object) de objetos em um bucket específico do S3 a um usuário ou uma função do IAM na Conta B. Essa política também concede ao usuário ou à função do IAM na Conta B permissões para chamar PUT Object acl e conceder permissões de objeto ao proprietário do bucket:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountABucketName/*"

        }
    ]
}

Você também pode criar uma política do IAM baseada em identidade usando o exemplo de comando da AWS CLI create-policy.

Observação: você pode limitar o acesso a uma pasta de bucket específica na Conta A. Para isso, defina o nome da pasta no elemento Resource como em "arn:aws:s3:::AccountABucketName/FolderName/*". Para obter mais informações, consulte How can I use IAM policies to grant user-specific access to specific folders?

4.    Configura a política de bucket para a Conta A de forma a conceder permissões ao usuário ou à função do IAM que você criou na Conta B. Use esta política para conceder ao usuário as permissões GetObject e PutObject para objetos em um bucket da Conta A:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::AccountABucketName/*"
            ]
        }
    ]
}

Você também pode criar uma política de bucket do Amazon S3 usando o exemplo de comando da AWS CLI put-bucket-policy.

Observação: você pode usar o elemento Resource para definir uma pasta específica no bucket do S3 e oferecer acesso detalhado mais limitado; por exemplo, “Resource”: "arn:aws:s3:::AccountABucketName/FolderName/*". Usando a permissão s3:PutObject com uma condição, o proprietário do bucket obtém controle total dos objetos transferidos por upload por outras contas. Isso faz com que a aplicação da ACL com cabeçalhos específicos seja passada à chamada da API PutObject. Para obter mais informações, consulte Concessão da permissão s3:PutObject com uma condição que exige que o proprietário do bucket obtenha controle total.

Lista de Controle de Acesso (ACL) baseada em recursos e políticas do IAM

Use ACLs de objeto para gerenciar permissões apenas em situações específicas e somente se as ACLs se adequarem mais a suas necessidades do que as políticas de bucket do S3 e as políticas do IAM. Para obter mais informações, consulte Quando usar uma política de acesso com base em ACL (ACLs de bucket e objeto). As ACLs do Amazon S3 permitem que os usuários definam apenas os seguintes conjuntos de permissões: READ, WRITE, READ_ACP, WRITE_ACP e FULL_CONTROL. Você só pode usar uma conta da AWS ou um dos grupos predefinidos do Amazon S3 como um usuário favorecido na ACL do Amazon S3. Quando um endereço de e-mail ou o ID de usuário canônico para uma conta da AWS é especificado, a ACL é aplicada a todas as entidades na conta da AWS do usuário favorecido. Você não pode usar uma ACL para restringir o acesso a funções ou usuários individuais do IAM. A ACL não pode ser aplicada a objetos diferentes que têm o mesmo prefixo.

Observação: o proprietário do bucket pode não ter controle total sobre os objetos transferidos por upload pelo usuário favorecido na ACL. Isso ocorre porque a ACL não é compatível com a condição da operação S3 autorizada por ela.

Para usar ACLs de bucket e objeto a fim de gerenciar o acesso a buckets do S3, siga estas etapas:

1.    Crie um usuário ou uma função do IAM na Conta B. Em seguida, conceda permissões para as operações necessárias no Amazon S3 ao usuário ou função. Os usuários que chamam PutObject e GetObject precisam das permissões listadas na seção Políticas baseadas em recursos e políticas do IAM.

2.    Configure a ACL do bucket para que inclua no mínimo a permissão WRITE para a Conta B. Isso garante que usuários ou funções do IAM da Conta B possam fazer upload de objetos (chamando PutObject API) em um bucket da Conta A:

...
<AccessControlPolicy>
  <Owner>
    <ID> AccountACanonicalUserID </ID>
    <DisplayName> AccountADisplayName </DisplayName>
  </Owner>
  <AccessControlList>
...
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID> AccountBCanonicalUserID </ID>
        <DisplayName> AccountBDisplayName </DisplayName>
      </Grantee>
      <Permission> WRITE </Permission>
    </Grant>
    ...
  </AccessControlList>
</AccessControlPolicy>

Observação: para localizar seu CanonicalUserID, consulte Encontrar um ID de usuário canônico da conta da AWS.

3.    Configure as ACLs do bucket para que incluam no mínimo a permissão READ para a Conta Account B. Isso garante que usuários ou funções do IAM da Conta B possam fazer download de objetos (chamando GetObject API) em um bucket da Conta A:

...
<AccessControlPolicy>
  <Owner>
    <ID> AccountACanonicalUserID </ID>
    <DisplayName> AccountADisplayName </DisplayName>
  </Owner>
  <AccessControlList>
...
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID> AccountBCanonicalUserID </ID>
        <DisplayName> AccountBDisplayName </DisplayName>
      </Grantee>
      <Permission> READ </Permission>
    </Grant>
    ...
  </AccessControlList>
</AccessControlPolicy>

As permissões da ACL variam de acordo com o recurso, bucket ou objeto do S3 ao qual ela é aplicada. Para obter mais informações, consulte Visão geral da lista de controle de acesso (ACL). Você pode configurar ACLs de bucket e objeto ao criar o bucket ou ao fazer upload de um objeto para um bucket existente. Para obter mais informações, consulte Configurar ACLs.

Funções do IAM entre contas

Nem todos os serviços da AWS são compatíveis com políticas baseadas em recursos. Isso significa que você pode usar funções do IAM entre contas para centralizar o gerenciamento de permissões ao oferecer acesso entre contas para vários serviços. O uso de funções do IAM simplifica o provisionamento do acesso entre contas a objetos do S3 armazenados em vários buckets, não sendo mais necessário gerenciar várias políticas para os buckets. Esse método permite o acesso entre contas a objetos que pertencem a outra conta ou outro serviço da AWS, ou que foram transferidos por upload por eles. Se você não usar funções do IAM entre contas, será necessário modificar a ACL de objeto. Para obter mais informações, consulte Como o Amazon S3 autoriza uma solicitação para uma operação de objeto.

Para usar funções do IAM entre contas a fim de gerenciar o acesso a buckets do S3, siga estas etapas:

1.    Crie uma função do IAM na Conta A. Em seguida, conceda permissões para as operações necessárias no S3 à função. Na política de confiança da função, conceda ao usuário ou função da Conta B permissões para assumir a função na Conta A:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Também é possível criar uma função com a política de confiança usando o exemplo de comando da AWS CLI create-role.

A política de acesso a seguir permite que um usuário que assumiu essa função faça download e upload de objetos tanto programaticamente como usando o console do Amazon S3. Para obter mais informações, consulte How can I use IAM policies to grant user-specific access to specific folders?

Observação: se só for necessário conceder acesso programático, as duas primeiras instruções na política a seguir poderão ser removidas:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::AccountABucketName"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::AccountABucketName/*"
        }
    ]
}

Você também pode criar uma política do IAM baseada em identidade usando o exemplo de comando da AWS CLI create-policy.

2.    Conceda ao usuário ou função do IAM da Conta B permissões para assumir a função do IAM que você criou na Conta A.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::AccountA:role/AccountARole"
  }
}

Você também pode criar uma política do IAM baseada em identidade usando o exemplo de comando da AWS CLI create-policy.

3.    A partir de uma função ou usuário na Conta B, assuma a função na Conta A de forma que entidades do IAM na Conta B possam realizar as operações necessários no S3. Para obter mais informações, consulte Alternar para uma função (console).

Observação: quando você assume uma função do IAM na Conta A, a operação do Amazon S3 é determinada pela política de acesso. A função do IAM é considerada como uma chamada de API feita por uma entidade local do IAM na Conta A. Não é necessário usar políticas de bucket ou ACLs para o acesso entre contas. Para obter mais informações, consulte Ações do Amazon S3.