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

Data da última atualização: 03/08/2022

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

Breve descrição

No Amazon S3, você pode conceder aos usuários em outra conta da AWS (Conta B) acesso granular entre contas a objetos pertencentes à sua conta (Conta A).

Dependendo do tipo de acesso que você deseja fornecer, use uma das seguintes soluções para conceder acesso entre contas a objetos:

  • Políticas do AWS Identity and Access Management (IAM) e políticas de bucket baseadas em recursos para acesso somente programático a objetos de bucket do S3
  • Políticas do IAM e listas de controle de acesso (ACLs) baseadas em recursos para acesso somente programático a objetos de bucket do S3
    Observação: quando a configuração imposta pelo proprietário do bucket está habilitada, todas as ACLs de bucket e objeto são desabilitadas. Portanto, você não pode usar ACLs para conceder acesso entre contas. Por padrão, todos os buckets recém-criados têm a configuração Aplicada pelo proprietário do buckethabilitada. Também é uma prática recomendada usar políticas do IAM e políticas de bucket (em vez de ACLs) para gerenciar o acesso entre contas a intervalos e objetos. Para obter mais informações, consulteControlar a propriedade de objetos e desabilitar ACLs para seu bucket.
  • Funções do IAM entre contas para acesso programático e de console a objetos de bucket do S3

Se o solicitante for o principal do IAM, a conta da AWS que possui o principal deve conceder permissões ao S3 por meio de uma política do IAM. Com base no seu caso de uso específico, o proprietário do bucket também deve conceder permissões por meio de uma política de bucket ou ACL. Depois que o acesso é concedido, o acesso programático de intervalos entre buckets de conta é o mesmo que acessar os mesmos intervalos de buckets de conta.

Resolução

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

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), certifique-se de estar usando a versão mais recente da AWS CLI.

Use políticas de bucket baseadas em recursos para gerenciar o controle de acesso entre contas e auditar as permissões do objeto do S3. Se você aplicar uma política de bucket no nível do bucket, poderá definir o seguinte:

  • Quem pode acessar os objetos dentro do intervalo (usando o elemento Principal)
  • Quais objetos eles podem acessar (usando o elemento Resource)
  • Como eles podem acessar os objetos dentro do intervalo (usando o 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 de bucket para ver quem pode acessar objetos em um bucket do S3.

Para usar políticas de bucket para gerenciar o acesso ao bucket do S3, siga estas etapas:

Observação: substitua as variáveis da conta pela sua conta.

1.    Crie um bucket do S3 na Conta A.

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

3.    Conceda ao papel do IAM na Conta B permissão para fazer download (GET Object) e fazer upload de objetos (PUT Object) de e para um intervalo específico. Use a seguinte política do IAM para também conceder ao papel do IAM na Conta B permissões para chamarPutObjectACL, concedendo 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/*"

        }
    ]
}

Observação: atualize a política para incluir suas variáveis de usuário (como ID da conta, nome do bucket e ARN). Além disso, você pode limitar o acesso a uma pasta de bucket específica na Conta A. Para limitar o acesso a uma pasta de bucket específica, defina o nome da pasta no elemento de recurso, como “arn:aws:s3: ::accountaBucketName/folderName/*”. Para obter mais informações, consulteComo posso usar políticas do IAM para conceder acesso a usuários específicos para pastas específicas?

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

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 CLIput-bucket-policy.

Observação: você pode definir uma pasta específica do bucket do S3 no elemento de recurso para fornecer acesso mais limitado, como “Resource”: “arn:aws:s3: ::accountaBucketName/folderName/*”. Ao usar apermissão s3:PutObject com uma condição, o proprietário do bucket obtém controle total sobre os objetos carregados 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 Conceder a permissão s3:PutObject com uma condição que exige que o proprietário do bucket tenha controle total.

Políticas do IAM e ACLs baseadas em recursos

Se as ACLs atenderem às suas necessidades melhor do que as políticas de bucket do IAM e do S3,, use ACLs de objeto para gerenciar permissões apenas em situações específicas. Para obter mais informações, consulteQuando usar uma política de acesso baseada em ACLs (ACLs de bucket e de 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ê pode usar apenas uma conta da AWS ou um dos grupos predefinidos do Amazon S3 como beneficiário da 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. Também não é possível aplicar ACLs a objetos diferentes que compartilham os mesmos prefixos.

Observação: o proprietário do bucket pode não ter controle total sobre os objetos carregados pelo beneficiário da ACL. Isso ocorre porque a ACL não oferece suporte à condição para a operação do S3 que a ACL autoriza.

Para usar ACLs de bucket e objeto para gerenciar o acesso ao bucket do S3, siga estas etapas:

1.    Crie uma função ou usuário de IAM na Conta B. Em seguida, conceda a essa função ou permissões de usuário para executar as operações necessárias do Amazon S3. 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 encontrar seuCanonicalUserID, consulteEncontrar 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 mais informações, acesse 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 Gerenciando ACLs.

Funções do IAM entre contas

Nem todos os serviços da AWS são compatíveis com políticas baseadas em recursos. Portanto, 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 entre contas simplifica o provisionamento do acesso entre contas a objetos do S3 armazenados em vários buckets do S3. Como resultado, você não precisa gerenciar várias políticas para buckets do S3. 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, consulteComo o Amazon S3 autoriza uma solicitação para uma operação de objeto.

Para usar funções do IAM entre contas para gerenciar o acesso ao bucket do S3, siga estas etapas:

1.    Crie uma função do IAM na Conta A. Em seguida, conceda à função permissões para executar as operações necessárias do S3. 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:

Observação: os perfis do IAM precisam de uma política de confiança que defina quais entidades principais podem assumir a função e sob quais condições. Os perfis do IAM podem ter várias políticas de permissões (em linha e anexadas) que definem as permissões de uma entidade principal que assume a função para ser capaz de executar e em quais recursos.

{
  "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 o download e o upload de objetos de forma programática e usando oconsole do Amazon S3. Para obter mais informações, consulteComo posso usar políticas do IAM para conceder acesso a usuários específicos para pastas específicas?

Observação: Se somente o acesso programático for necessário, 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 baseada em identidade do IAM usando o exemplo de comando da AWS CLIcreate-policy.

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

Observação: o exemplo de política a seguir deve ser adicionado como uma política de permissões do usuário ou função do IAM.

{
  "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 baseada em identidade do IAM usando o exemplo de comando da AWS CLIcreate-policy.

3.    A partir de uma função 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, consulteAlternar para uma função (Console).

Observação: ao assumir 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 definição de preço do Amazon S3.