

# Gramática da linguagem das políticas de JSON do IAM
<a name="reference_policies_grammar"></a>

Esta página apresenta uma gramática formal para a linguagem usada para criar políticas de JSON no IAM. Apresentamos essa gramática para que você possa entender como construir e validar políticas.

Para obter exemplos de políticas, consulte os seguintes tópicos:
+ [Políticas e permissões no AWS Identity and Access Management](access_policies.md)
+ [Exemplos de políticas baseadas em identidade do IAM](access_policies_examples.md)
+ [Políticas de exemplo para trabalhar no console do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-ec2-console.html) e [Políticas de exemplo para trabalhar com a AWS CLI, a CLI do Amazon EC2ou um AWS SDK](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html) no *Guia do usuário do Amazon EC2*. 
+  [Exemplos de políticas de bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html) e [Exemplos de política de usuário](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-policies-s3.html) no *Guia do usuário do Amazon Simple Storage Service*. 

Para obter exemplos de políticas usadas em outros produtos da AWS, consulte a documentação desses produtos.

**Topics**
+ [A linguagem das políticas e JSON](#policies-grammar-json)
+ [Convenções usadas nesta gramática](#policies-grammar-conventions)
+ [Gramática](#policies-grammar-bnf)
+ [Notas sobre a gramática das políticas](#policies-grammar-notes)

## A linguagem das políticas e JSON
<a name="policies-grammar-json"></a>

As políticas são expressas em JSON. Quando você cria ou edita uma política JSON, o IAM pode executar a validação de políticas para ajudar você a criar uma política eficaz. O IAM identifica erros de sintaxe JSON, enquanto o IAM Access Analyzer fornece verificações de políticas adicionais com recomendações para ajudar você a refinar ainda mais suas políticas. Para saber mais sobre validação de política, consulte [Validação de política do IAM](access_policies_policy-validator.md). Para saber mais sobre as verificações de política do IAM Access Analyzer e as recomendações práticas, consulte [Validação de política do IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html). 

Neste documento, não fornecemos uma descrição completa dos elementos que constituem o JSON válido. No entanto, veja a seguir algumas regras básicas de JSON:
+ Espaço em branco entre entidades individuais é permitido.
+ Os valores são colocados entre aspas. Aspas são opcionais para valores numéricos e boolianos.
+ Muitos elementos (por exemplo, `action_string_list` e `resource_string_list`) podem levar uma matriz JSON como um valor. As matrizes podem levar um ou mais valores. Se mais de um valor for incluído, a matriz será inserida em colchetes (`[` e `]`) e delimitada por vírgula, como no exemplo a seguir: 

  `"Action" : ["ec2:Describe*","ec2:List*"]`
+ Os tipos de dados JSON básicos (Booliano, número e string) são definidos na [RFC 7159](https://datatracker.ietf.org/doc/html/rfc7159).

## Convenções usadas nesta gramática
<a name="policies-grammar-conventions"></a>

As seguintes convenções são usadas nesta gramática:
+ Os caracteres a seguir são tokens JSON e *são* incluídos nas políticas:

  `{ } [ ] " , :`
+ Os caracteres a seguir são caracteres especiais na gramática e *não* são incluídos nas políticas: 

  `= < > ( ) |`
+ Se um elemento permitir vários valores, ele será indicado com valores repetidos, um delimitador de vírgula e reticências (`...`). Exemplos:

  `[<action_string>, <action_string>, ...]`

  `<principal_map> = { <principal_map_entry>, <principal_map_entry>, ... }`

  Se vários valores forem permitidos, também será válido incluir apenas um valor. Para apenas um valor, a vírgula à direita deve ser omitida. Se o elemento levar uma matriz (marcada com [e]), mas apenas um valor for incluído, os colchetes serão opcionais. Exemplos:

  `"Action": [<action_string>]`

  `"Action": <action_string>`
+ Um ponto de interrogação (`?`) depois de um elemento indica que o elemento é opcional. Exemplo: 

  <`version_block?>`

  No entanto, consulte as notas após a listagem de gramática para obter mais detalhes sobre elementos opcionais. 
+ Uma linha vertical (`|`) entre os elementos indica alternativas. Na gramática, parênteses definem o escopo das alternativas. Exemplo:

  `("Principal" | "NotPrincipal")` 
+ Elementos que devem ser strings literais são inseridos entre aspas duplas (`"`). Exemplo:

  `<version_block> = "Version" : ("2008-10-17" | "2012-10-17" )`

Para notas adicionais, consulte [Notas sobre a gramática das políticas](#policies-grammar-notes) após a listagem de gramática.

## Gramática
<a name="policies-grammar-bnf"></a>

A lista a seguir descreve a gramática da linguagem das políticas. Para obter as convenções usadas na lista, consulte a seção anterior. Para obter informações adicionais, consulte as notas que se seguem.

**nota**  
Essa gramática descreve as políticas marcadas com uma versão de `2008-10-17 ` e `2012-10-17 `. Um elemento de política `Version` é diferente de uma versão de política. O elemento de política `Version` é usado em uma política e define a versão da linguagem da política. A versão da política, por outro lado, é criada quando você faz alterações em uma política gerenciada pelo cliente no IAM. A política alterada não substitui a política existente. Em vez disso, o IAM cria uma nova versão da política gerenciada. Para saber mais sobre o elemento de política `Version`, consulte [Elementos de política JSON do IAM: Version](reference_policies_elements_version.md). Para saber mais sobre as versões de política, consulte [Versionamento de políticas do IAM](access_policies_managed-versioning.md).

```
policy  = {
     <version_block?>,
     <id_block?>,
     <statement_block>
}

<version_block> = "Version" : ("2008-10-17"		 	 	  | "2012-10-17"		 	 	 )

<id_block> = "Id" : <policy_id_string>

<statement_block> = "Statement" : [ <statement>, <statement>, ... ]

<statement> = { 
    <sid_block?>,
    <principal_block?>,
    <effect_block>,
    <action_block>,
    <resource_block>,
    <condition_block?>
}

<sid_block> = "Sid" : <sid_string>

<effect_block> = "Effect" : ("Allow" | "Deny")  

<principal_block> = ("Principal" | "NotPrincipal") : ("*" | <principal_map>)

<principal_map> = { <principal_map_entry>, <principal_map_entry>, ... }

<principal_map_entry> = ("AWS" | "Federated" | "Service" | "CanonicalUser") :   
    [<principal_id_string>, <principal_id_string>, ...]

<action_block> = ("Action" | "NotAction") : 
    ("*" | <action_string> | [<action_string>, <action_string>, ...])

<resource_block> = ("Resource" | "NotResource") : 
    : ("*" | <resource_string> | [<resource_string>, <resource_string>, ...])

<condition_block> = "Condition" : { <condition_map> }
<condition_map> = { 
  <condition_type_string> : { <condition_key_string> : <condition_value_list> },
  <condition_type_string> : { <condition_key_string> : <condition_value_list> }, ...
}  
<condition_value_list> = [<condition_value>, <condition_value>, ...]
<condition_value> = (<condition_value_string> | <condition_value_string> | <condition_value_string>)
```

## Notas sobre a gramática das políticas
<a name="policies-grammar-notes"></a>
+ Uma única política pode conter um conjunto de instruções.
+ As políticas têm um tamanho máximo de 2048 caracteres e 10.240 caracteres, dependendo do elemento ao qual a política está anexada. Para obter mais informações, consulte [IAM e cotas do AWS STS](reference_iam-quotas.md). Os cálculos de tamanho da política não incluem caracteres de espaço em branco.
+ Elementos individuais não devem conter várias instâncias da mesma chave. Por exemplo, você não pode incluir o bloco `Effect` duas vezes na mesma instrução. 
+ Os blocos podem aparecer em qualquer ordem. Por exemplo, `version_block` pode seguir `id_block` em uma política. Da mesma forma, `effect_block`, `principal_block`, `action_block` podem aparecer em qualquer ordem dentro de uma instrução.
+ O `id_block` é opcional em políticas baseadas em recursos. *Não* deve ser incluído em políticas baseadas em identidades.
+ O elemento `principal_block` é necessário em políticas baseadas em recurso (por exemplo, em políticas de bucket do Amazon S3) e em políticas de confiança para funções do IAM. *Não* deve ser incluído em políticas baseadas em identidades.
+ O elemento `principal_map` nas políticas de bucket do Amazon S3 pode incluir o ID `CanonicalUser`. A maioria das políticas baseadas em recursos não oferece suporte a esse mapeamento. Para saber mais sobre como usar o ID canônico de usuário em uma política de bucket, consulte [Como especificar uma entidade principal em uma política](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-bucket-user-policy-specifying-principal-intro.html) no *Guia do usuário do Amazon Simple Storage Service*.
+ Cada valor de string (`policy_id_string`, `sid_string`, `principal_id_string`, `action_string`, `resource_string`, `condition_type_string`, `condition_key_string` e a versão de string de `condition_value`) pode ter suas próprias restrições de tamanho mínimo e máximo, valores permitidos específicos ou o formato interno necessário.

### Notas sobre valores de string
<a name="policies-grammar-notes-strings"></a>

Esta seção fornece informações adicionais sobre valores de string que são usados em diferentes elementos em uma política.

**`action_string`**  
Consiste em um namespace de serviço, dois pontos e o nome de uma ação. Os nomes de ação podem incluir curingas. Exemplos:  

```
"Action":"ec2:StartInstances"

"Action":[
  "ec2:StartInstances",
  "ec2:StopInstances"
]

"Action":"cloudformation:*"

"Action":"*"

"Action":[
  "s3:Get*",
  "s3:List*"
]
```

**`policy_id_string`**  
Oferece uma maneira de incluir informações sobre a política como um todo. Alguns serviços, como o Amazon SQS e o Amazon SNS, usam o elemento `Id` de formas reservadas. A menos que isso seja proibido por um serviço individual, policy\$1id\$1string pode incluir espaços. Alguns serviços exigem que esse valor seja exclusivo em uma conta da AWS.   
O `id_block` é permitido em políticas baseadas em recursos, mas não em políticas baseadas em identidades.
Não há limite para o tamanho, embora essa string contribua para o comprimento geral da política, que é limitado.   

```
"Id":"Admin_Policy"

"Id":"cd3ad3d9-2776-4ef1-a904-4c229d1642ee"
```

**`sid_string`**  
Oferece uma maneira de incluir informações sobre uma instrução individual. Para políticas do IAM, caracteres alfanuméricos básicos (A-Z, a-z, 0-9) são os únicos caracteres permitidos no valor `Sid`. Outros serviços da AWS que oferecem suporte a políticas de recursos podem ter outros requisitos para o valor `Sid`. Por exemplo, alguns serviços exigem esse valor para serem exclusivos em uma Conta da AWS, e alguns serviços permitem caracteres adicionais, como espaços no valor `Sid`.  

```
"Sid":"1" 

"Sid": "ThisStatementProvidesPermissionsForConsoleAccess"
```

**`principal_id_string`**  
Fornece uma maneira de especificar uma entidade de segurança usando o [*nome do recurso da Amazon* (ARN)](reference_identifiers.md#identifiers-arns) da Conta da AWS do usuário do IAM, do perfil do IAM, do usuário federado ou do usuário de perfil assumido. Para uma Conta da AWS, você também pode usar a forma curta `AWS:accountnumber` em vez de todo o ARN. Para todas as opções, incluindo serviços da AWS, funções assumidas etc., consulte [Como especificar uma entidade principal](reference_policies_elements_principal.md#Principal_specifying).  
Você pode usar \$1 apenas para especificar "todos/anônimo". Não é possível usá-lo para especificar parte de um nome ou ARN.

**`resource_string`**  
Na maioria dos casos, consiste em um [nome de recurso da Amazon](reference_identifiers.md#identifiers-arns) (ARN). Você pode usar os curingas (\$1 e ?) na parte de recurso do ARN. Para obter mais informações sobre como usar o curinga em ARNs, consulte [Usar curingas em caminhos](reference-arns.md#arns-paths-wildcards).  
Quando você especifica um ARN incompleto (um com menos do que os seis campos padrão) em uma política baseada em identidade, a AWS preenche automaticamente o ARN adicionando caracteres curinga (\$1) a todos os campos ausentes. Por exemplo, especificar `arn:aws:sqs` é equivalente a `arn:aws:sqs:*:*:*`, o que concede acesso a todos os recursos do Amazon SQS em todas as regiões e contas. No entanto, as políticas de sessão passadas para as solicitações do AWS STS AssumeRole, AssumeRoleWithWebIdentity e AssumeRoleWithSAML não oferecem suporte a ARNs incompletos. Usar um ARN incompleto em uma política de sessão resultará em um erro `MalformedPolicyDocumentException`.

```
"Resource":"arn:aws:iam::123456789012:user/Bob"

"Resource":"arn:aws:s3:::amzn-s3-demo-bucket/*"
```

**`condition_type_string`**  
Identifica o tipo de condição que está sendo testado, como `StringEquals`, `StringLike`, `NumericLessThan`, `DateGreaterThanEquals`, `Bool`, `BinaryEquals`, `IpAddress`, `ArnEquals`, etc. Para obter uma lista completa de tipos de condição, consulte [Elementos de política JSON do IAM: operadores de condição](reference_policies_elements_condition_operators.md).   

```
"Condition": {
  "NumericLessThanEquals": {
    "s3:max-keys": "10"
  }
}

"Condition": {
  "Bool": {
    "aws:SecureTransport": "true"
  }
}

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

**`condition_key_string`**  
Identifica a chave de condição cujo valor será testado para determinar se a condição foi atendida. A AWS define um conjunto de chaves de condição que estão disponíveis em todos os produtos da AWS, incluindo `aws:PrincipalType`, `aws:SecureTransport` e `aws:userid`.  
Para obter uma lista de chaves de condição da AWS, consulte [AWSChaves de contexto de condições globais da](reference_policies_condition-keys.md). Para chaves de condição que são específicas a um serviço, consulte a documentação do serviço, como o seguinte:  
+ [Como especificar condições em uma política](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazon-s3-policy-keys.html) no *Guia do usuário do Amazon Simple Storage Service*
+ [Políticas do IAM para o Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html) no *Guia do usuário do Amazon EC2*.

```
"Condition":{
  "Bool": {
      "aws:SecureTransport": "true"
   }
}

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

"Condition": {
  "StringEquals": {
    "aws:ResourceTag/purpose": "test"
  }
}
```

**`condition_value_string`**  
Identifica o valor de condition\$1key\$1string que determina se a condição foi atendida. Para obter uma lista completa de valores válidos para um tipo de condição, consulte [Elementos de política JSON do IAM: operadores de condição](reference_policies_elements_condition_operators.md).  

```
"Condition":{
  "ForAnyValue:StringEquals": {
		"dynamodb:Attributes": [
			"ID",
			"PostDateTime"
  	      ]
  }
}
```