Exemplos de chave de condição do Amazon S3 - Amazon Simple Storage Service

Exemplos de chave de condição do Amazon S3

Você pode usar a linguagem de políticas de acesso para especificar condições ao conceder permissões. Você pode usar o elemento Condition opcional ou o bloco Condition para especificar condições para quando uma política está em vigor.

Para obter políticas que usam chaves de condição do Amazon S3 para operações de objeto e bucket, consulte os exemplos a seguir. Para obter mais informações sobre essas chaves de condição, consulte Chaves de condição do Amazon S3. Consulte uma lista completa de ações, chaves de condição e recursos do Amazon S3 que você pode especificar em políticas em Actions, resources, and condition keys for Amazon S3 na Referência de autorização do serviço.

Exemplos: chaves de condição do Amazon S3 para operações de objeto

Esta seção fornece exemplos que mostram como você pode usar chaves de condição específicas do Amazon S3 para operações de objeto. Consulte uma lista completa de ações, chaves de condição e recursos do Amazon S3 que você pode especificar em políticas em Actions, resources, and condition keys for Amazon S3 na Referência de autorização do serviço.

Várias das políticas de exemplo mostram como você pode usar chaves de condições com operações de objeto PUT. As operações de objeto PUT permitem cabeçalhos específicos baseados em lista de controle de acesso (ACL) usados para conceder permissões baseadas em ACL. Usando essas chaves, o proprietário do bucket pode definir uma condição para exigir permissões de acesso específicas quando o usuário faz upload de um objeto. Você também pode conceder permissões baseadas em ACL com a operação PutoObjectAcl. Para obter mais informações, consulte PutObjectAcl na Referência da API do Amazon S3 Amazon Simple Storage Service. Para obter mais informações sobre ACLs, consulte Visão geral da lista de controle de acesso (ACL).

Exemplo 1: Concessão da permissão s3:PutObject com uma condição que exige que o proprietário do bucket obtenha controle total

A operação PUT Object permite cabeçalhos específicos da lista de controle de acesso (ACL) que você usa para conceder permissões baseadas em ACL. Usando essas chaves, o proprietário do bucket pode definir uma condição para exigir permissões de acesso específicas quando o usuário faz upload de um objeto.

Suponha que a conta A seja proprietária de um bucket e que o respectivo administrador queira conceder a Akua, um usuário na conta B, permissões para fazer upload de objetos. Por padrão, os objetos que Akua carrega são de propriedade da conta B, e a conta A não tem permissões nesses objetos. Como o proprietário do bucket é quem paga a fatura, ele quer permissões completas nos objetos que Akua carrega. O administrador da conta A pode fazer isso concedendo a Akua a permissão s3:PutObject, com a condição de que a solicitação inclua cabeçalhos específicos da ACL, que concede permissão total explícita ou usa uma ACL pré-configurada. Para obter mais informações, consulte Objeto PUT.

Exigir o cabeçalho x-amz-full-control

Você pode exigir o cabeçalho x-amz-full-control na solicitação com permissão de controle total do proprietário do bucket. A política de bucket a seguir concede ao usuário Akua a permissão s3:PutObject com uma condição de uso da chave de condição s3:x-amz-grant-full-control, que exige que a solicitação inclua o cabeçalho x-amz-full-control.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/Akua" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }
nota

Este exemplo trata da permissão entre contas. Contudo, se Akua (a quem é concedida a permissão) pertencer à Conta da AWS que é proprietária do bucket, essa permissão condicional não será necessária. Isso acontece porque a conta pai à qual Akua pertence é proprietária dos objetos que o usuário carrega.

Adicionar negação explícita

A política de bucket anterior concede permissão condicional ao usuário Akua na conta B. Enquanto essa política estiver em vigor, Akua poderá obter a mesma permissão sem nenhuma condição por meio de alguma outra política. Por exemplo, Akua pode pertencer a um grupo e você concede ao grupo a permissão s3:PutObject sem nenhuma condição. Para evitar essas brechas de permissão, você pode elaborar uma política de acesso mais estrita adicionando uma negação explícita. Neste exemplo, você nega explicitamente a permissão de upload ao usuário Akua se ele não incluir os cabeçalhos necessários na solicitação, concedendo permissões totais ao proprietário do bucket. A negação explícita sempre se sobrepõe a qualquer outra permissão concedida. Veja a seguir um exemplo de política de acesso revisada com a negação explícita adicionada.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }
Testar a política com a AWS CLI

Se você tiver duas Contas da AWS, teste a política usando a AWS Command Line Interface (AWS CLI). Anexe a política e use as credenciais de Akua para testar a permissão usando o comando put-object da AWS CLI. Você fornece as credenciais de Akua adicionando o parâmetro --profile. Você concede permissão de controle total ao proprietário do bucket adicionando o parâmetro --grant-full-control. Para obter mais informações sobre a configuração e o uso da AWS CLI, consulte Desenvolvimento com o Amazon S3 usando a AWS CLI.

aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBUserProfile

Exigir o cabeçalho x-amz-acl

Você pode exigir o cabeçalho x-amz-acl com uma ACL padrão que concede permissão de controle total ao proprietário do bucket. Para exigir o cabeçalho x-amz-acl na solicitação, você pode substituir o par de chave-valor no bloco Condition e especificar a chave de condição s3:x-amz-acl, conforme o exemplo abaixo.

"Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } }

Para testar a permissão usando a AWS CLI, especifique o parâmetro --acl. Em seguida, a AWS CLI adiciona o cabeçalho x-amz-acl ao enviar a solicitação.

aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --acl "bucket-owner-full-control" --profile AccountBadmin

Exemplo 2: Concessão da permissão s3:PutObject que exige os objetos armazenados usando criptografia no lado do servidor

Vamos supor que a conta A é proprietária de um bucket. O administrador da conta deseja conceder a Jane, uma usuária na conta A, a permissão para fazer upload de objetos com a condição de que Jane sempre solicite criptografia no lado do servidor, de modo que o Amazon S3 salve objetos criptografados. O administrador da conta A pode fazer isso usando a chave de condição s3:x-amz-server-side-encryption, conforme exibido. O par de chave-valor no bloco Condition especifica a chave s3:x-amz-server-side-encryption.

"Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" }}

Ao testar a permissão usando a AWS CLI, adicione o parâmetro obrigatório usando o parâmetro --server-side-encryption.

aws s3api put-object --bucket example1bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountBadmin

Exemplo 3: Concessão da permissão s3:PutObject para copiar objetos com uma restrição na origem da cópia

Na solicitação PUT objeto, quando você especifica o objeto de origem, isso é uma operação de cópia (consulte PUT objeto - Copiar). De acordo com isso, o proprietário do bucket pode conceder ao usuário permissão para copiar objetos com restrições na origem; por exemplo:

  • Permite a cópia de objetos somente do bucket sourcebucket.

  • Permite copiar objetos do bucket de origem e somente os objetos cujo prefixo de nome de chave começa com public/ f (por exemplo, sourcebucket/public/*).

  • Permite copiar apenas um objeto específico do bucket de origem (por exemplo, sourcebucket/example.jpg).

A política de bucket a seguir concede a permissão s3:PutObject ao usuário (Akua). Permite copiar apenas objetos com uma condição de que a solicitação inclua o cabeçalho s3:x-amz-copy-source e o valor do cabeçalho especifique o prefixo de nome de chave /awsexamplebucket1/public/*.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "cross-account permission to user in your own account", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Akua" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/folder", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Akua" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "awsexamplebucket1/public/*" } } } ] }
Testar a política com a AWS CLI

Você pode testar a permissão usando o comando da AWS CLI copy-object. Você especifica a origem adicionando o parâmetro --copy-source; o prefixo de nome de chave que deve coincidir com o prefixo permitido na política. Você precisa inserir as credenciais do usuário de Akua usando o parâmetro --profile. Para obter mais informações sobre a configuração da AWS CLI, consulte Desenvolvimento com o Amazon S3 usando a AWS CLI.

aws s3api copy-object --bucket awsexamplebucket1 --key HappyFace.jpg --copy-source examplebucket/public/PublicHappyFace1.jpg --profile AccountAAkua
Conceder permissão para copiar somente um objeto específico

A política anterior usa a condição StringNotLike. Para conceder a permissão para copiar apenas um objeto em específico, altere a condição de StringNotLike para StringNotEquals e, em seguida, especifique a chave de objeto exata, conforme exibido.

"Condition": { "StringNotEquals": { "s3:x-amz-copy-source": "awsexamplebucket1/public/PublicHappyFace1.jpg" } }

Exemplo 4: Concessão de acesso a uma versão específica de um objeto

Vamos supor que a conta A seja proprietária de um bucket habilitado para versão. O bucket tem várias versões do objeto HappyFace.jpg. O administrador da conta agora deseja conceder ao usuário Akua permissão para obter apenas uma versão específica do objeto. O administrador da conta pode fazer isso concedendo a Akua a permissão condicional s3:GetObjectVersion, conforme mostrado abaixo. O par de chave-valor no bloco Condition especifica a chave de condição s3:VersionId. Neste caso, Akua precisa saber o ID de versão do objeto exato para recuperar o objeto.

Para obter mais informações, consulte GetObject na Referência da API do Amazon Simple Storage Service.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Akua" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Akua" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e" } } } ] }
Testar a política com a AWS CLI

Você pode testar as permissões usando o comando da AWS CLI get-object com o parâmetro --version-id que identifica a versão específica do objeto. O comando recupera o objeto e o salva no arquivo OutputFile.jpg.

aws s3api get-object --bucket examplebucketversionenabled --key HappyFace.jpg OutputFile.jpg --version-id AaaHbAQitwiL_h47_44lRO2DDfLlBO5e --profile AccountAAkua

Exemplo 5: restrição de uploads de objetos com uma classe de armazenamento específica

Suponha que a Conta A, representada pelo ID da conta 123456789012, possui um bucket. O administrador da conta deseja restringir Akua, um usuário na conta A, a fazer upload somente de objetos no bucket que serão armazenados com a classe de armazenamento STANDARD_IA. Para restringir uploads de objetos a uma classe de armazenamento específica, o administrador da Conta A pode usar a chave de condição s3:x-amz-storage-class, conforme mostrado no exemplo de política de bucket a seguir.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Akua" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*", "Condition": { "StringEquals": { "s3:x-amz-storage-class": [ "STANDARD_IA" ] } } } ] }

Exemplo 6: conceder permissões com base em tags de objetos

Para obter exemplos sobre como usar chaves de condição de tags de objetos com operações do Amazon S3, consulte Marcação e políticas de controle de acesso.

Exemplo 7: restringir o acesso pelo ID da Conta da AWS do proprietário do bucket

É possível usar a chave aws:ResourceAccount ou s3:ResourceAccount para criar políticas do IAM ou do endpoint da nuvem privada virtual (VPC) que restrinjam o acesso de usuários, perfis ou aplicações aos buckets do Amazon S3 pertencentes a um ID de Conta da AWS específico. Você pode usar essa chave de condição para restringir o acesso dos clientes dentro de sua VPC a buckets que você não possui.

No entanto, saiba que os serviços da AWS dependem do acesso a buckets gerenciados pela AWS. Portanto, usar a chave aws:ResourceAccount ou s3:ResourceAccount em sua política do IAM também pode afetar o acesso a esses recursos.

Para obter mais informações e exemplos, consulte os seguintes recursos:

Exemplo 8: exigir uma versão mínima do TLS

Você pode usar a chave de condição s3:TlsVersion para gravar IAM, Virtual Private Cloud Endpoint (VPCE) ou políticas de bucket que restringem o acesso do usuário ou aplicação aos buckets do Amazon S3 com base na versão TLS usada pelo cliente. Você pode usar essa chave de condição para gravar políticas que exigem uma versão mínima do TLS.

Esse exemplo de política de bucket nega solicitações PutObject de clientes que tenham uma versão do TLS inferior a 1.2, por exemplo, 1.1 ou 1.0.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" ], "Condition": { "NumericLessThan": { "s3:TlsVersion": 1.2 } } } ] }

Essa política de bucket de exemplo permite solicitações PutObject de clientes que tenham uma versão do TLS superior a 1.1, por exemplo, 1.2, 1.3 ou acima.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" ], "Condition": { "NumericGreaterThan": { "s3:TlsVersion": 1.1 } } } ] }

Exemplos: chaves de condição do Amazon S3 para operações de bucket

Esta seção fornece exemplos de políticas que mostram como você pode usar chaves de condição específicas do Amazon S3 para operações de bucket.

Exemplo 1: conceder a um usuário permissão para criar um bucket somente em uma região específica

Suponha que um administrador de uma Conta da AWS queira conceder ao usuário (Akua) a permissão para criar um bucket somente na região América do Sul (São Paulo). O administrador da conta pode anexar a política de usuário a seguir que concede a permissão s3:CreateBucket com uma condição, conforme exibido. O par de chave-valor no bloco Condition especifica a chave s3:LocationConstraint e a região sa-east-1 como valor.

nota

Neste exemplo, o proprietário do bucket concede permissão para um de seus usuários, de modo que tanto uma política de bucket quanto uma política de usuário podem ser usadas. Este exemplo mostra uma política de usuário.

Para conferir a lista de regiões do Amazon S3, consulte Regiões e endpoints na Referência geral da AWS.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }
Adicionar negação explícita

A política acima impede que o usuário crie um bucket em qualquer outra Região, exceto sa-east-1. No entanto, alguma outra política pode conceder a esse usuário permissão para criar buckets em outra Região. Por exemplo, se ele pertencer a um grupo, o grupo pode ter uma política anexada que permita que todos os seus usuários tenham permissão para criar buckets em outra Região. Para garantir que o usuário não obtenha permissão para criar buckets em nenhuma outra Região, você pode adicionar uma instrução de negação explícita nessa política.

A declaração Deny usa a condição StringNotLike. Isto é, uma solicitação de criação de bucket será negada se a restrição de localização não for sa-east-1. A negação explícita não permite que o usuário crie um bucket em nenhuma outra região, independentemente de outras permissões que o usuário receba. A política abaixo inclui uma instrução de negação explícita.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } }, { "Sid":"statement2", "Effect":"Deny", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringNotLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }
Testar a política com a AWS CLI

Você pode testar a política usando o seguinte comando create-bucket da AWS CLI. Este exemplo usa o arquivo bucketconfig.txt para especificar a restrição de localização. Observe o caminho do arquivo do Windows. Você precisa atualizar o nome e o caminho do bucket conforme apropriado. Você deve fornecer as credenciais do usuário usando o parâmetro --profile. Para obter mais informações sobre a configuração e o uso da AWS CLI, consulte Desenvolvimento com o Amazon S3 usando a AWS CLI.

aws s3api create-bucket --bucket examplebucket --profile AccountAAkua --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt

O arquivo bucketconfig.txt especifica a configuração da seguinte maneira.

{"LocationConstraint": "sa-east-1"}

Exemplo 2: obter uma lista de objetos em um bucket com um prefixo específico

Você pode usar a chave de condição s3:prefix para limitar a resposta da API GET Bucket (ListObjects) a nomes de chave com um prefixo específico. Se você for o proprietário do bucket, poderá restringir um usuário a listar o conteúdo de um prefixo específico no bucket. Essa chave de condição será útil se os objetos no bucket forem organizados por prefixos de nome de chave. O console do Amazon S3 usa prefixos de nomes de chaves para mostrar um conceito de pasta. Somente o console suporta o conceito de pastas; a API do Amazon S3 suporta somente buckets e objetos. Para obter mais informações sobre como usar prefixos e delimitadores para filtrar permissões de acesso, consulte Controlar o acesso a um bucket com políticas de usuário.

Por exemplo, se você tiver dois objetos com nomes de chave public/object1.jpg e public/object2.jpg, o console mostrará os objetos na pasta public. Na API do Amazon S3, esses são objetos com prefixos, não objetos em pastas. No entanto, na API do Amazon S3, se você organizar suas chaves de objeto usando tais prefixos, poderá conceder a permissão s3:ListBucket com a condição s3:prefix que permitirá que o usuário obtenha uma lista de nomes de chave com um prefixo específico.

Neste exemplo, o proprietário do bucket e a conta pai à qual o usuário pertence são os mesmos. Assim, o proprietário do bucket pode usar uma política de bucket ou uma política de usuário. Para obter mais informações sobre outras chaves de condição que você pode usar com a API GET Bucket (ListObjects), consulte ListObjects.

Política de usuário

A política de usuário a seguir concede a permissão s3:ListBucket (consulte GET bucket (listar objetos)) com uma condição que exige que o usuário especifique o prefix na solicitação com o valor projects.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:ListBucket", "Resource":"arn:aws:s3:::awsexamplebucket1", "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::awsexamplebucket1", "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }

A condição restringe o usuário a listar chaves de objeto com o prefixo projects. A negação explícita adicionada nega a solicitação do usuário para listar chaves com qualquer outro prefixo, independentemente de outras permissões que o usuário possa ter. Por exemplo, é possível que o usuário receba a permissão para listar chaves de objetos sem nenhuma restrição, tanto por meio de atualizações na política de usuário anterior quanto por meio de uma política de bucket. Como a negação explícita sempre prevalece, a solicitação do usuário para listar outras chaves além do prefixo projects é negada.

Política de bucket

Se você adicionar o elemento Principal à política de usuário acima, identificando o usuário, agora terá uma política de bucket conforme exibido.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/bucket-owner" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::awsexamplebucket1", "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/bucket-owner" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::awsexamplebucket1", "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }
Testar a política com a AWS CLI

Você pode testar a política usando o seguinte comando list-object da AWS CLI. No comando, você fornece as credenciais do usuário usando o parâmetro --profile. Para obter mais informações sobre a configuração e o uso da AWS CLI, consulte Desenvolvimento com o Amazon S3 usando a AWS CLI.

aws s3api list-objects --bucket awsexamplebucket1 --prefix examplefolder --profile AccountAAkua

Se o bucket tiver o versionamento habilitado, para listar os objetos no bucket, você deverá conceder a permissão s3:ListBucketVersions na política anterior, em vez da permissão s3:ListBucket. Essa permissão também oferece suporte à chave de condição s3:prefix.

Exemplo 3: definir o número máximo de chaves

Você pode usar a chave de condição s3:max-keyspara definir o número máximo de chaves que o solicitante pode retornar em uma solicitação GET Bucket (ListObjects) ou ListObjectVersions. Por padrão, a API retorna até 1.000 chaves. Para obter uma lista de operadores de condição numérica que você pode usar com s3:max-keys e exemplos associados, consulte Operadores de condição numérica no Guia do usuário do IAM.