

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

# IAM JSON 政策元素：Condition
<a name="reference_policies_elements_condition"></a>

`Condition` 元素 (或 `Condition` 區塊**) 可讓您於政策生效時指定條件。`Condition` 元素是選用的。在 `Condition` 元素中，您所建置的表達式使用[條件運算子](reference_policies_elements_condition_operators.md) (等於、小於等等) 來比對政策中的內容索引鍵和值，以及請求內容中的索引鍵和值。若要進一步了解請求內容，請參閱 [請求的元件](intro-structure.md#intro-structure-request)。

```
"Condition" : { "{{{condition-operator}}}" : { "{{{condition-key}}}" : "{{{condition-value}}}" }}
```

您在政策條件中指定的內容索引鍵可以是[全域條件內容索引鍵](reference_policies_condition-keys.md)或服務特定的內容索引鍵。全域條件內容索引鍵包含 `aws:` 字首。服務特定的內容索引鍵包含服務的字首。例如，Amazon EC2 可讓您使用 `ec2:InstanceType` 內容索引鍵撰寫條件，此索引鍵對於該服務是唯一的。若要檢視包含 `iam:` 字首的服務特定的 IAM 內容索引鍵，請參閱 [IAM 和 AWS STS 條件內容索引鍵](reference_policies_iam-condition-keys.md)。

內容索引鍵*名稱*不區分大小寫。例如，包括 `aws:SourceIP` 內容索引鍵等同於對 `AWS:SourceIp` 的測試。內容索引鍵*值*是否區分大小寫取決於您使用的[條件運算子](reference_policies_elements_condition_operators.md)。例如，下列條件包含 `StringEquals` 運算子，以確保僅 `john` 所做的請求會相符。使用者指定的 `John` 會受到存取遭拒。

```
"Condition" : { "StringEquals" : { "aws:username" : "john" }}
```

以下條件使用 [`StringEqualsIgnoreCase`](reference_policies_elements_condition_operators.md#Conditions_String) 運算子，以符合使用者指定的 `john` 或 `John`。

```
"Condition" : { "StringEqualsIgnoreCase" : { "aws:username" : "john" }}
```

部分內容索引鍵支援索引鍵值對，可允許您指定部分索引鍵名稱。範例包括[`aws:RequestTag/{{tag-key}}`](reference_policies_condition-keys.md#condition-keys-requesttag)內容索引鍵、 AWS KMS [https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context)和多個 服務支援[`ResourceTag/{{tag-key}}`](reference_policies_condition-keys.md#condition-keys-resourcetag)的內容索引鍵。
+ 如果您對 [Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policy-structure.html#amazon-ec2-keys) 之類的服務使用 `ResourceTag/{{tag-key}}` 內容索引鍵，則必須為 `tag-key` 指定索引鍵名稱。
+ **金鑰名稱不區分大小寫。**這表示如果您在政策的條件元素中指定 `"aws:ResourceTag/TagKey1": "Value1"`，則該條件會符合名為 `TagKey1` 或 `tagkey1` 的資源標籤鍵 (但不會同時符合兩者)。
+ AWS 支援這些屬性的 服務可能允許您建立多個金鑰名稱，這些名稱僅因案例而異。例如，可能使用 `ec2=test1` 和 `EC2=test2` 標記 Amazon EC2 執行個體。當您使用條件 (例如，`"aws:ResourceTag/EC2": "test1"`) 以允許對該資源的存取，則金鑰名稱同時符合兩個標籤，但只有一個值符合。這會導致意外的條件失敗。

**重要**  
根據最佳實務，確保帳戶成員在命名鍵值對屬性時遵守一致的命名慣例。範例包括標籤或 AWS KMS 加密內容。您可以使用[`aws:TagKeys`](reference_policies_condition-keys.md#condition-keys-tagkeys)內容金鑰進行標記，或使用 [https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context-keys](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context-keys)進行 AWS KMS 加密內容。
+ 如需所有條件運算子的清單及其運作方式的描述，請參閱[條件運算子](reference_policies_elements_condition_operators.md)。
+ 除非另有說明，否則，所有內容索引鍵都可以具有多個值。如需有關如何處理具有多個值的內容索引鍵的描述，請參閱 [用於多值內容索引鍵的集運算子](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)
+ 如需有關所有全域可用內容索引鍵的清單，請參閱 [AWS 全域條件內容索引鍵](reference_policies_condition-keys.md)。
+ 如需每個服務定義的條件內容金鑰，請參閱 [AWS 服務的動作、資源和條件金鑰](reference_policies_actions-resources-contextkeys.html)。

## 請求內容
<a name="AccessPolicyLanguage_RequestContext"></a>

當[委託](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#principal)人向 提出[請求](intro-structure.md#intro-structure-request)時 AWS， 會將請求資訊 AWS 收集到請求內容中。請求內容包含有關主體、資源、動作和其他環境屬性的資訊。政策評估會將政策中的屬性與請求中傳送的屬性比對，以評估和授權可在 AWS中執行的動作。

您可以使用 JSON 政策的 `Condition` 元素來針對請求內容測試特定內容索引鍵。例如，您可以建立使用 [aws:CurrentTime](reference_policies_condition-keys.md#condition-keys-currenttime) 內容索引鍵的政策，來[僅允許使用者在特定日期範圍內執行動作](reference_policies_examples_aws-dates.md)。

下列範例展示了當 Martha Rivera 傳送請求以停用其 MFA 裝置時的請求內容表示。

```
Principal: AROA123456789EXAMPLE
Action: iam:DeactivateMFADevice
Resource: arn:aws:iam::user/martha
Context:
  – aws:UserId=AROA123456789EXAMPLE:martha
  – aws:PrincipalAccount=1123456789012
  – aws:PrincipalOrgId=o-example
  – aws:PrincipalARN=arn:aws:iam::1123456789012:assumed-role/TestAR
  – aws:MultiFactorAuthPresent=true
  – aws:MultiFactorAuthAge={{2800}}
  – aws:CurrentTime=...
  – aws:EpochTime=...
  – aws:SourceIp=...
```

該請求內容與一項政策相符，該政策允許使用者移除自己的多重要素驗證 (MFA) 裝置，但前提是他們必須在過去一小時 (3,600 秒) 內使用 MFA 登入過。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "AllowRemoveMfaOnlyIfRecentMfa",
        "Effect": "Allow",
        "Action": [
            "iam:DeactivateMFADevice"
        ],
        "Resource": "arn:aws:iam::*:user/${aws:username}",
        "Condition": {
            "NumericLessThanEquals": {"aws:MultiFactorAuthAge": "{{3600}}"}
        }
    }
}
```

------

在此範例中，政策與請求內容相符：動作相同，資源與 "\*" 萬用字元相符，且 `aws:MultiFactorAuthAge` 的值為 2800，小於 3600，因此政策允許此授權請求。

AWS 會評估政策中的每個內容索引鍵，並傳回 *true* 或 *false* 的值。請求中不存在的內容索引鍵視為不相符。

請求內容可傳回下列值：
+ **True** (真) – 若申請者在過去一個小時或一個小時內使用 MFA 登入，條件便會傳回 *true*。
+ **False** (偽) – 若申請者在過去超過一個小時中使用 MFA 登入，條件便會傳回 *false*。
  + **不存在** – 如果請求者在 AWS CLI 或 AWS API 中使用其 IAM 使用者存取金鑰提出請求，則金鑰不存在。在此情況下，由於索引鍵不存在，因此不會相符。

**注意**  
在某些情況下，當條件索引鍵值不存在時，條件仍然可以傳回 true。例如，如果新增 `ForAllValues` 限定詞，則當請求中不存在內容索引鍵時，請求會傳回 true。若要防止遺失內容索引鍵或具有空值的內容索引鍵評估為 true，您可以在政策中包含值為 `false` 的 [Null 條件運算子](reference_policies_elements_condition_operators.md#Conditions_Null)，以檢查內容索引鍵是否存在且其值不為 Null。

## 條件區塊
<a name="AccessPolicyLanguage_ConditionBlock"></a>

以下範例顯示 `Condition` 元素的基本格式：

```
"Condition": {"StringLike": {"s3:prefix": ["jane/*"]}}
```

來自請求的值由內容索引鍵表示，在本例中為 `s3:prefix`。內容金鑰值會與您指定為常值的值進行比較，例如 `jane/*`。要進行的比較類型由 [條件運算子](reference_policies_elements_condition_operators.md) (在這裡為`StringLike`) 指定。您可以使用典型的布林比較 (例如，等於、大於和小於) 來建立比較字串、日期、數字等條件。當您使用[字串運算子](reference_policies_elements_condition_operators.md#Conditions_String)或 [ARN 運算子](reference_policies_elements_condition_operators.md#Conditions_ARN)時，您也可以在內容索引鍵值中使用[政策變數](reference_policies_variables.md)。下列範例包含 `aws:username` 變數。

```
"Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
```

在某些情況下，內容索引鍵可以包含多個值。例如，對 Amazon DynamoDB 的請求可能會要求從資料表中傳回或更新多個屬性。用於存取 DynamoDB 資料表的政策可以包括 `dynamodb:Attributes` 內容索引鍵，其包含請求中列出的所有屬性。您可以使用 `Condition` 元素中的設定運算子，根據政策中允許的屬性清單測試請求中的多個屬性。如需詳細資訊，請參閱[用於多值內容索引鍵的集運算子](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)。

在請求期間評估政策時， 會將金鑰 AWS 取代為請求中的對應值。（在此範例中， AWS 將使用請求的日期和時間。) 負責評估條件，以傳回 true 或 false，然後將該因素考慮為整個政策是否允許或拒絕請求。

### 條件中的多個值
<a name="Condition-multiple-conditions"></a>

`Condition` 元素可以包含多個條件運算子，而且每個條件運算子都可以包含多個內容索引鍵值對。下圖說明了這一點。

![兩個條件運算子區塊圖。第一個區塊包含兩個內容金鑰預留位置，每個預留位置都有多個值。第二個條件區塊包含一個內容索引鍵，其中包含多個值。](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/AccessPolicyLanguage_Condition_Block.diagram.png)


如需詳細資訊，請參閱[用於多值內容索引鍵的集運算子](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)。