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 運算子,以確保僅 johndoe 所做的請求會相符。使用者指定的 JohnDoe 會受到存取遭拒。

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

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

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

部分內容索引鍵支援索引鍵值對,可允許您指定部分索引鍵名稱。範例包括多個服務支援的ResourceTag/tag-key內容索引鍵 AWS KMS kms:EncryptionContext:encryption_context_key、和內容索引鍵。aws:RequestTag/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內容金鑰或 AWS KMS 加密內容來kms:EncryptionContextKeys強制執行此操作。

請求內容

體向其提出要求時 AWS,會將要求資訊 AWS 收集到要求前後關聯中。此資訊會用來評估和授權請求。您可以使用 JSON 政策的 Condition 元素來針對請求內容測試特定內容索引鍵。例如,您可以建立使用 aws: CurrentTime 上下文金鑰的政策,允許使用者僅在特定日期範圍內執行動作

提交要求時,會 AWS 評估原則中的每個內容索引鍵,並傳回 truefalse不存在,偶爾為 null (空白資料字串) 的值。請求中不存在的內容索引鍵視為不相符。例如,下列政策允許移除您自己的多重要素驗證 (MFA) 裝置,但僅限您在過去一個小時 (3,600 秒) 中使用 MFA 登入。

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

請求內容可傳回下列值:

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

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

  • 不存在 — 如果請求者使用 AWS CLI 或 AWS API 中的 IAM 使用者存取金鑰提出請求,則金鑰不存在。在此情況下,由於索引鍵不存在,因此不會相符。

  • Null – 針對使用者定義的內容索引鍵 (例如在請求中傳遞標籤),您可以包含空白字串。在此情況下,請求內容中的值是 null。在某些情況下,null 值也可能會傳回 true。例如,如果您搭配 ForAllValues 內容索引鍵使用多值 aws:TagKeys 條件運算子,若請求內容傳回 null,您便可能會遭遇未預期的結果。如需詳細資訊,請參閱 aws: TagKeys多值內容索引鍵.

條件區塊

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

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

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

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

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

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

條件中的多個值

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


          兩個條件運算符框圖。第一個區塊包含兩個內容索引鍵預留位置,每個預留位置都有多個值。第二個條件區塊包含一個具有多個值的內容索引鍵。

如需更多詳細資訊,請參閱 多值內容索引鍵