

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# IAM JSON 政策語言的文法
<a name="reference_policies_grammar"></a>

此頁面介紹用來在 IAM 中建立 JSON 政策語言的正式文法。我們展示此文法，以便您可以了解如何建構和驗證政策。

如需政策的範例，請參閱下列主題：
+ [中的政策和許可 AWS Identity and Access Management](access_policies.md)
+ [以身分為基礎的 IAM 政策範例](access_policies_examples.md)
+ [使用 Amazon EC2 主控台的範例政策](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-ec2-console.html)，以及 Amazon [ Amazon EC2 使用者指南中的使用 AWS CLI、Amazon EC2 CLI 或 AWS SDK 的範例政策](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html)。 *Amazon EC2 * 
+  *Amazon Simple Storage Service 使用者指南*中的[儲存貯體政策範例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)和[使用者政策範例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-policies-s3.html)。

如需其他 AWS 服務中使用的政策範例，請前往這些服務的文件。

**Topics**
+ [政策語言和 JSON](#policies-grammar-json)
+ [此文法中使用的慣例](#policies-grammar-conventions)
+ [文法](#policies-grammar-bnf)
+ [政策文法備註](#policies-grammar-notes)

## 政策語言和 JSON
<a name="policies-grammar-json"></a>

以 JSON 表達的政策。當您建立或編輯 JSON 政策時，IAM 可以執行政策驗證以協助您建立有效的政策。IAM 會識別 JSON 語法錯誤，而 IAM Access Analyzer 會提供額外的政策檢查及建議，協助您進一步改良政策。若要進一步了解政策驗證的資訊，請參閱 [IAM 政策驗證](access_policies_policy-validator.md)。若要進一步了解 IAM Access Analyzer 政策檢查和可動作的建議，請參閱 [IAM Access Analyzer 政策驗證](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。

在本文件中，我們不提供哪些資料構成有效 JSON 的完整說明。不過，以下是一些基本 JSON 規則：
+ 個別實體間允許空格。
+ 值以雙引號括住。雙引號對於數字和布林值為選用。
+ 許多元素 (例如，`action_string_list` 和 `resource_string_list`) 可將 JSON 陣列當作值。陣列可以使用一個或多個值。如果包含多個值，陣列會在方括號 (`[` 和 `]`) 中並以逗號分隔，如以下範例所示：

  `"Action" : ["ec2:Describe*","ec2:List*"]`
+ 基本 JSON 資料類型 (布林值、數字及字串) 是在 [RFC 7159](https://datatracker.ietf.org/doc/html/rfc7159) 中定義。

## 此文法中使用的慣例
<a name="policies-grammar-conventions"></a>

此文法中使用以下慣例：
+ 下列字元是 JSON 權杖，並且「包含」**在政策中：

  `{ } [ ] " , :`
+ 下列字元在文法中為特殊字元，並且「不」**包含在政策中：

  `= < > ( ) |`
+ 如果某個元素允許多個值，它會使用重複值、逗號分隔符號和省略符號 (`...`) 來表示。範例：

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

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

  如果允許多個值，只包含一個值也屬有效。對於僅有一個值，必須省略尾端逗號。如果元素使用陣列 (以 [ 和 ] 標註)，但只包含一個值，則括號為選用。範例：

  `"Action": [<action_string>]`

  `"Action": <action_string>`
+ 某個元素後的問號 (`?`) 表示該元素為選用。範例：

  <`version_block?>`

  不過，有關選用元素的詳細資訊，請務必參照文法清單後的注意事項。
+ 元素之間的垂直線 (`|`) 表示替代方案。在文法中，括號定義替代方案的範圍。範例：

  `("Principal" | "NotPrincipal")` 
+ 必須為文字字串的元素會加上雙引號 (`"`)。範例：

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

如需其他注意事項，請參閱文法清單後的[政策文法備註](#policies-grammar-notes)。

## 文法
<a name="policies-grammar-bnf"></a>

以下清單說明政策語言文法。如需清單中所使用的慣例，請參閱上一節。如需其他資訊，請參閱後續的注意事項。

**注意**  
此文法描述以版本 `2008-10-17 ` 和 `2012-10-17 ` 標記的政策。`Version` 政策元素與政策版本不同。`Version` 政策元素是在政策內使用，並定義政策語言的版本。另一方面，政策版本會在您在 IAM 中變更客戶受管政策時建立。變更的政策不會覆寫現有的政策。IAM 反而會建立新版本的受管政策。若要進一步了解 `Version` 政策元素，請參閱 [IAM JSON 政策元素：Version](reference_policies_elements_version.md)。若要進一步了解政策版本，請參閱 [版本控制 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>)
```

## 政策文法備註
<a name="policies-grammar-notes"></a>
+ 單一政策可包含一系列的陳述式。
+ 政策大小上限為 2048 個字元和 10,240 個字元，取決於政策所連接的實體。如需詳細資訊，請參閱 [IAM AWS STS 和配額](reference_iam-quotas.md)。政策大小的計算不包含空格字元。
+ 個別元素不得包含相同索引鍵的多個執行個體。例如，您不能在同一個陳述式中包含兩次 `Effect` 區塊。
+ 區塊可以任何順序顯示。例如，政策中 `version_block` 可以在 `id_block` 之後。同樣地，`effect_block`、`principal_block`、`action_block` 可以在陳述式內以任何順序顯示。
+ `id_block` 在以資源為基礎的政策中為選用。身分類型政策「不」**得包含它。
+ 以資源為基礎的政策和 IAM 角色的信任政策需要 `principal_block` 元素 (例如，在 Amazon S3 儲存貯體政策中)。身分類型政策「不」**得包含它。
+ Amazon S3 儲存貯體政策中的 `principal_map` 元素可以包含 `CanonicalUser` ID。大多數以資源為基礎的政策不支援此映射。若要進一步了解有關在儲存貯體政策中使用正式使用者 ID，請參閱 *Amazon Simple Storage Service 使用者指南*中的[在政策中指定主體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-bucket-user-policy-specifying-principal-intro.html)。
+ 每個字串值 (`policy_id_string`、`sid_string`、`principal_id_string`、`action_string`、`resource_string`、`condition_type_string`、`condition_key_string` 和字串版本的 `condition_value`) 可以有自己的最低和最大長度限制、特定允許的值，或是必要的內部格式。

### 有關字串值的備註
<a name="policies-grammar-notes-strings"></a>

本節提供有關在政策的不同元素中使用字串值的其他資訊。

**`action_string`**  
包含服務命名空間、冒號和動作的名稱。動作名稱可以包含萬用字元。範例：  

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

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

"Action":"cloudformation:*"

"Action":"*"

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

**`policy_id_string`**  
提供方式以包含有關政策的資訊。有些服務 (例如 Amazon SQS 和 Amazon SNS) 在預留方式中使用 `Id` 元素。除非按個別服務進行限制，否則 policy\$1id\$1string 可以包含空格。有些服務需要此值在 AWS 帳戶中為唯一。  
以資源為基礎的政策中允許 `id_block`，但是以身分為基礎的政策不允許。
長度並沒有限制，雖然此字串對政策的整體長度有影響，但是有限的。  

```
"Id":"Admin_Policy"

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

**`sid_string`**  
提供方式以包含有關個別陳述式的資訊。對於 IAM 政策，`Sid` 值只允許使用基本英數字元 (A-Z、a-z、0-9)。支援資源政策的其他 AWS 服務可能對 `Sid` 值有其他要求。例如，某些服務要求此值在 中是唯一的 AWS 帳戶，而某些服務允許額外的字元，例如`Sid`值中的空格。  

```
"Sid":"1" 

"Sid": "ThisStatementProvidesPermissionsForConsoleAccess"
```

**`principal_id_string`**  
提供使用 、IAM 使用者 AWS 帳戶、IAM 角色、聯合身分使用者或擔任角色使用者 的 [*Amazon Resource Name* (ARN)](reference_identifiers.md#identifiers-arns) 來指定委託人的方法。對於 AWS 帳戶，您也可以使用簡短格式，`AWS:accountnumber`而不是完整的 ARN。如需包含 AWS 服務、擔任角色等等所有選項，請參閱[如何指定主體](reference_policies_elements_principal.md#Principal_specifying)。  
請注意，您只能使用 \$1 來指定「每個人/匿名」。您不能使用它來指定 ARN 的部分名稱。

**`resource_string`**  
在大部分情況下，包含 [Amazon Resource Name (ARN)](reference_identifiers.md#identifiers-arns)。您可以在 ARN 的資源部分中使用萬用字元 (\$1 和 ？)。如需有關在 ARN 中使用萬用字元的詳細資訊，請參閱[在路徑中使用萬用字元](reference-arns.md#arns-paths-wildcards)。  
當您在身分型政策中指定不完整的 ARN （少於標準六個欄位） 時， AWS 會自動將萬用字元 (\$1) 新增至所有缺少的欄位，以完成 ARN。例如，指定 `arn:aws:sqs` 等同於 `arn:aws:sqs:*:*:*`，這會授予所有區域和帳戶所有 Amazon SQS 資源的存取權。不過，傳遞至 AWS STS AssumeRole、AssumeRoleWithWebIdentity 和 AssumeRoleWithSAML 請求的工作階段政策不支援不完整ARNs。在工作階段政策中使用不完整的 ARN 將導致`MalformedPolicyDocumentException`錯誤。

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

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

**`condition_type_string`**  
識別要測試條件的類型，例如 `StringEquals`、`StringLike`、`NumericLessThan`、`DateGreaterThanEquals`、`Bool`、`BinaryEquals`、`IpAddress`、`ArnEquals` 等。如需資料類型的完整清單，請參閱 [IAM JSON 政策元素：條件運算子](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`**  
識別要測試其值以判斷是否符合條件的條件金鑰。 AWS 定義一組可用於所有 AWS 服務的條件金鑰，包括 `aws:PrincipalType`、 `aws:SecureTransport`和 `aws:userid`。  
如需 AWS 條件索引鍵的清單，請參閱 [AWS 全域條件內容索引鍵](reference_policies_condition-keys.md)。如需服務特定的條件金鑰，請參閱該服務的文件，例如下列：  
+ *Amazon Simple Storage Service 使用者指南*中的[在政策中指定條件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazon-s3-policy-keys.html)
+ 《Amazon EC2 使用者指南》中的 [Amazon EC2 的 IAM 政策](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)。**

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

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

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

**`condition_value_string`**  
識別決定是否符合條件的 condition\$1key\$1string 的值。如需條件類型有效值的完整清單，請參閱 [IAM JSON 政策元素：條件運算子](reference_policies_elements_condition_operators.md)。  

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