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. Para obter uma lista completa de ações do Amazon S3, as chaves de condição e os recursos que você pode especificar em políticas, consulte Ações, recursos e chaves de condição do Amazon S3.

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. Para obter uma lista completa de ações do Amazon S3, as chaves de condição e os recursos que você pode especificar em políticas, consulte Ações, recursos e chaves de condição do Amazon S3.

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 administrador da conta queira conceder a Dave, um usuário na conta B, permissões para fazer upload de objetos. Por padrão, os objetos que Dave 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 Dave carrega. O administrador da conta A pode fazer isso concedendo a Dave 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 Dave 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/Dave" }, "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 Dave (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 o Dave 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 Dave na conta B. Enquanto essa política estiver em vigor, Dave poderá obter a mesma permissão sem nenhuma condição por meio de alguma outra política. Por exemplo, Dave 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 Dave 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ê tem 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 Dave para testar a permissão usando o seguinte comando AWS CLI da put-object. Você fornece as credenciais de Dave 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": { "StringNotEquals": { "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 (Dave). 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/Dave" }, "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/Dave" }, "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 Dave 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 AccountADave

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 deseja conceder agora ao seu usuário Dave permissão para obter apenas uma versão específica do objeto. O administrador da conta pode fazer isso concedendo a Dave 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, Dave 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/Dave" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "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 AccountADave

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 Dave, 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/Dave" }, "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

Você pode usar a chave de condição s3:ResourceAccount para gravar políticas do IAM ou do Virtual Private Cloud Endpoint (VPCE) que restringem o acesso de usuários 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.

Para obter 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

Vamos supor que um administrador de uma Conta da AWS queira conceder ao seu usuário (Dave) 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 obter uma 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 AccountADave --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 AccountADave

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 Manual do usuário do IAM.