Exemplos de políticas de bucket usando chaves de condição - Amazon Simple Storage Service

Exemplos de políticas de bucket usando chaves de condição

Você pode usar a linguagem de políticas de acesso para especificar condições ao conceder permissões. É possível usar o elemento Condition opcional ou o bloco Condition para especificar condições referentes a 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 de política para o 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.

Para ter mais informações sobre as permissões referentes a operações de API do S3 de acordo com os tipos de recurso do S3, consulte Permissões obrigatórias para operações de API do Amazon S3.

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

Os exemplos a seguir mostram como 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.

Para ter mais informações sobre as permissões referentes a operações de API do S3 de acordo com os tipos de recurso do S3, consulte Permissões obrigatórias para operações de API 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 de condição, é possível 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: conceder a permissão s3:PutObject que exige que os objetos sejam armazenados usando criptografia do 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, permissão para fazer upload de objetos com a condição de que Jane sempre solicite a criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3). O administrador da conta A pode especificar esse requisito usando a chave de condição s3:x-amz-server-side-encryption, conforme exibido. O par de chave-valor no bloco Condition a seguir especifica a chave de condição s3:x-amz-server-side-encryption e SSE-S3 (AES256) como o tipo de criptografia:

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

Ao testar essa permissão por meio da AWS CLI, você deve adicionar a criptografia necessária usando o parâmetro --server-side-encryption, conforme mostrado no exemplo a seguir. Para usar esse exemplo de comando, substitua os user input placeholders por suas próprias informações.

aws s3api put-object --bucket amzn-s3-demo-bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountAadmin

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

Em uma solicitação de objeto PUT, quando se especifica o objeto de origem, a solicitação é uma operação de cópia (consulte CopyObject). 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 copiar objetos somente do bucket de origem especificado (por exemplo, amzn-s3-demo-source-bucket).

  • Permite copiar objetos do bucket de origem especificado e somente os objetos cujo nome de chave comece com um prefixo específico, como public/ (por exemplo, amzn-s3-demo-source-bucket/public/*).

  • Permite copiar somente um objeto específico do bucket de origem (por exemplo, amzn-s3-demo-source-bucket/example.jpg).

A política de bucket a seguir concede a um usuário (Dave) a permissão s3:PutObject. Essa política permite que ele copie objetos apenas com a 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 /amzn-s3-demo-source-bucket/public/*. Para usar esse exemplo de política, substitua os user input placeholders por suas próprias informações.

{ "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:::amzn-s3-demo-source-bucket/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/prefix", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "amzn-s3-demo-source-bucket/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. Consulte mais informações sobre como configurar a AWS CLI em Developing with Amazon S3 using the AWS CLI na Referência de API do Amazon S3.

aws s3api copy-object --bucket amzn-s3-demo-source-bucket --key HappyFace.jpg --copy-source amzn-s3-demo-source-bucket/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 específico, é necessário alterar a condição de StringNotLike para StringNotEquals e, depois, especificar a chave de objeto exata, conforme exibido no exemplo a seguir. Para usar esse exemplo de comando, substitua os user input placeholders por suas próprias informações.

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

Exemplo 3: conceder acesso a uma versão específica de um objeto

Vamos supor que a conta A seja proprietária de um bucket habilitado para versionamento. O bucket tem várias versões do objeto HappyFace.jpg. O administrador da conta A agora deseja conceder ao usuário Dave permissão para receber apenas uma versão específica do objeto. O administrador da conta pode fazer isso concedendo ao usuário Dave a permissão s3:GetObjectVersion de modo condicional, conforme mostrado no exemplo a seguir. O par de chave-valor no bloco Condition especifica a chave de condição s3:VersionId. Neste caso, para recuperar o objeto do bucket específico habilitado para versionamento, Dave precisa conhecer o ID de versão do objeto exato. Para usar esse exemplo de política, substitua os user input placeholders por suas próprias informações.

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:::amzn-s3-demo-bucket/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/HappyFace.jpg", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e" } } } ] }
Testar a política com a AWS CLI

É possível testar as permissões nessa política usando o comando get-object da AWS CLI com o parâmetro --version-id para identificar a versão específica do objeto a ser recuperada. O comando recupera a versão especificada do objeto e a salva no arquivo OutputFile.jpg.

aws s3api get-object --bucket amzn-s3-demo-bucket --key HappyFace.jpg OutputFile.jpg --version-id AaaHbAQitwiL_h47_44lRO2DDfLlBO5e --profile AccountADave

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

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

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

É possível usar a chave de condição aws:ResourceAccount ou s3:ResourceAccount para gravar políticas de endpoint da nuvem privada virtual (VPC) ou do IAM 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. É possível usar essas chaves de condição para restringir o acesso dos clientes dentro da VPC aos 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, consulte os seguintes recursos do :

Para ter mais informações sobre as chaves de condição aws:ResourceAccount e s3:ResourceAccount e exemplos que mostram como usá-las, consulte Limit access to Amazon S3 buckets owned by specific Contas da AWS no Blog do AWS Storage.

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

É possível usar a chave de condição s3:TlsVersion para gravar políticas do IAM, de endpoint de nuvem privada virtual (VPCE) ou de bucket que restrinjam o acesso de usuários ou de aplicações aos buckets do Amazon S3 com base na versão de 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.

O exemplo de política de bucket a seguir nega solicitações PutObject de clientes que tenham uma versão de TLS inferior a 1.2; por exemplo, 1.1 ou 1.0. Para usar esse exemplo de política, substitua os user input placeholders por suas próprias informações.

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

O exemplo de política de bucket a seguir permite solicitações PutObject de clientes que têm uma versão de TLS posterior a 1.1; por exemplo, 1.2, 1.3 ou posterior:

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

Exemplo 7: excluir determinadas entidades principais de uma declaração Deny

A política de bucket a seguir nega acesso s3:GetObject ao amzn-s3-demo-bucket, exceto às entidades principais com o número de conta 123456789012. Para usar esse exemplo de política, substitua os user input placeholders por suas próprias informações.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyAccessFromPrincipalNotInSpecificAccount", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Effect": "Deny", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ], "Condition": { "StringNotEquals": { "aws:PrincipalAccount": [ "123456789012" ] } } } ] }

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

As políticas de exemplo a seguir mostram como usar chaves de condição específicas do Amazon S3 para operações de bucket.

Exemplo 1: conceder a permissão s3:GetObject com uma condição em um endereço IP

Será possível conceder a usuários autenticados permissão para usar a ação s3:GetObject, se a solicitação for proveniente de um intervalo específico de endereços IP (por exemplo, 192.0.2.*), a menos que o endereço IP seja um dos que você queira excluir (por exemplo, 192.0.2.188). No bloco Condition, IpAddress e NotIpAddress são condições, e cada uma recebe um par de chave-valor para avaliação. Os dois pares de chave-valor neste exemplo usam a chave aws:SourceIp em toda a AWS. Para usar esse exemplo de política, substitua os user input placeholders por suas próprias informações.

nota

Os valores de chave IPAddress e NotIpAddress especificados no bloco Condition usam notação CIDR conforme descrito na RFC 4632. Para obter mais informações,consulte http://www.rfc-editor.org/rfc/rfc4632.txt.

{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": "*", "Action":"s3:GetObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition" : { "IpAddress" : { "aws:SourceIp": "192.0.2.0/24" }, "NotIpAddress" : { "aws:SourceIp": "192.0.2.188/32" } } } ] }

Você também pode usar outras chaves de condição de toda a AWS nas políticas do Amazon S3. Por exemplo, você pode especificar o aws:SourceVpce e as chaves de condição aws:SourceVpc em políticas de bucket para VPC endpoints. Para obter exemplos específicos, consulte Controlar o acesso a partir de VPC endpoints com políticas de bucket.

nota

Em relação a algumas chaves de condição globais da AWS, somente certos tipos de recurso são compatíveis. Portanto, confira se o Amazon S3 é compatível com a chave de condição global e o tipo de recurso que você deseja usar ou se você precisará usar uma chave de condição específica do Amazon S3. Consulte uma lista completa de chaves de condição e tipos de recurso compatíveis com o Amazon S3 em Actions, resources, and condition keys for Amazon S3 na Referência de autorização do serviço.

Para ter mais informações sobre as permissões referentes a operações de API do S3 de acordo com os tipos de recurso do S3, consulte Permissões obrigatórias para operações de API do Amazon S3.

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

É possível usar a chave de condição s3:prefix para limitar a resposta da operação de API ListObjectsV2 a nomes de chave com um prefixo específico. Se o bucket pertencer a você, será possível usar essa chave de condição para impedir que um usuário liste o conteúdo de um prefixo específico no bucket. A chave de condição s3:prefix 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. 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. 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.

No caso a seguir, o proprietário do bucket e a conta principal à 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 conceder acesso. Para ter mais informações sobre outras chaves de condição que você pode usar para chamar a operação de API ListObjectsV2, consulte ListObjectsV2.

nota

Se o bucket tiver o versionamento habilitado, para listar os objetos no bucket, você deverá conceder a permissão s3:ListBucketVersions nas políticas a seguir, em vez da permissão s3:ListBucket. A permissão s3:ListBucketVersions também comporta a chave de condição s3:prefix.

Política de usuário

A política de usuário a seguir concede a permissão s3:ListBucket (consulte ListObjectsV2) com uma declaração Condition que exige que o usuário especifique um prefixo na solicitação com um valor de projects. Para usar esse exemplo de política, substitua os user input placeholders por suas próprias informações.

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

A declaração Condition determina que o usuário liste apenas as chaves de objeto com o prefixo projects. A declaração Deny explícita adicionada nega ao usuário a listagem de chaves com qualquer outro prefixo, independentemente de outras permissões que ele possa ter. Por exemplo, é possível que o usuário receba a permissão para listar chaves de objeto 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 as declarações Deny explícitas sempre substituem as declarações Allow, se o usuário tentar indicar chaves que não tenham o prefixo projects, a solicitação será negada.

Política de bucket

Se você adicionar o elemento Principal à política de usuário acima, identificando o usuário, terá uma política de bucket conforme exibido no exemplo a seguir. Para usar esse exemplo de política, substitua os user input placeholders por suas próprias informações.

{ "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:::amzn-s3-demo-bucket", "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:::amzn-s3-demo-bucket", "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. Consulte mais informações sobre como configurar e usar a AWS CLI em Developing with Amazon S3 using the AWS CLI na Referência de API do Amazon S3.

aws s3api list-objects --bucket amzn-s3-demo-bucket --prefix projects --profile AccountA

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

É possível usar a chave de condição s3:max-keys para definir o número máximo de chaves que um solicitante pode exibir em uma solicitação ListObjectsV2 ou ListObjectVersions. Por padrão, essas operações de API exibem até mil 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.