IAM JSON 政策元素:Condition - AWS Identity and Access Management

IAM JSON 政策元素:Condition

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

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

您在政策條件中指定的內容索引鍵可以是全域條件內容索引鍵或服務特定的內容索引鍵。全域條件內容索引鍵包含 aws: 字首。服務特定的內容索引鍵包含服務的字首。例如,Amazon EC2 可讓您使用 ec2:InstanceType 內容索引鍵撰寫條件,此索引鍵對於該服務是唯一的。若要檢視包含 iam: 字首的服務特定的 IAM 內容索引鍵,請參閱 IAM 與 AWS STS 條件內容鍵

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

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

以下條件使用 StringEqualsIgnoreCase 運算子,以符合使用者指定的 johnJohn

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

部分內容索引鍵支援索引鍵值對,可允許您指定部分索引鍵名稱。範例包括 aws:RequestTag/tag-key 內容索引鍵、AWS KMS kms:EncryptionContext:encryption_context_key 以及多個服務支援的 ResourceTag/tag-key 內容索引鍵。

  • 如果您對 Amazon EC2 之類的服務使用 ResourceTag/tag-key 內容索引鍵,則必須為 tag-key 指定索引鍵名稱。

  • 金鑰名稱不區分大小寫。這表示如果您在政策的條件元素中指定 "aws:ResourceTag/TagKey1": "Value1",則該條件會符合名為 TagKey1tagkey1 的資源標籤鍵 (但不會同時符合兩者)。

  • 支援這些屬性的 AWS 服務可能允許您建立多個金鑰名稱,它們按大小寫而不同。例如,可能使用 ec2=test1EC2=test2 標記 Amazon EC2 執行個體。當您使用條件 (例如,"aws:ResourceTag/EC2": "test1") 以允許對該資源的存取,則金鑰名稱同時符合兩個標籤,但只有一個值符合。這會導致意外的條件失敗。

重要

根據最佳實務,確保帳戶成員在命名鍵值對屬性時遵守一致的命名慣例。範例包括標籤或 AWS KMS 加密內容。您可以使用 aws:TagKeys 內容索引鍵進行標記,或使用 kms:EncryptionContextKeys 進行 AWS KMS 加密內容來強制執行此操作。

請求內容

主體向 AWS 發出請求時,AWS 會將請求資訊收集到請求內容。請求內容包含有關主體、資源、動作和其他環境屬性的資訊。政策評估會將政策中的屬性與請求中傳送的屬性比對,以評估和授權可在 AWS 中執行的動作。

您可以使用 JSON 政策的 Condition 元素來針對請求內容測試特定內容索引鍵。例如,您可以建立使用 aws:CurrentTime 內容索引鍵的政策,來僅允許使用者在特定日期範圍內執行動作

下列範例展示了當 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 會評估政策中的每個內容索引鍵,並傳回值 truefalse。請求中不存在的內容索引鍵視為不相符。

請求內容可傳回下列值:

  • True (真) – 若申請者在過去一個小時或一個小時內使用 MFA 登入,條件便會傳回 true

  • False (偽) – 若申請者在過去超過一個小時中使用 MFA 登入,條件便會傳回 false

    • Not present (不存在) – 若申請者在 AWS CLI 或 AWS API 中使用其 IAM 使用者存取金鑰提出請求,便不存在索引鍵。在此情況下,由於索引鍵不存在,因此不會相符。

注意

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

條件區塊

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

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

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

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

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

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

條件中的多個值

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

兩個條件運算子區塊圖。第一個區塊包含兩個內容金鑰預留位置,每個預留位置都有多個值。第二個條件區塊包含一個內容索引鍵,其中包含多個值。

如需更多詳細資訊,請參閱 用於多值內容索引鍵的集運算子