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 條件內容索引鍵

條件金鑰 names 不區分大小寫。例如,包括 aws:SourceIP 條件金鑰等同於對 AWS:SourceIp 的測試。條件金鑰是否區分大小寫取決於您使用的條件運算子。例如,以下條件包含 StringEquals 運算子,以確保僅 johndoe 所做的請求會相符。使用者指定的 JohnDoe 會受到存取遭拒。

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

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

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

有些條件鍵支援鍵值對,可允許您指定部分索引鍵名稱。範例包括 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 會將請求資訊收集到請求內容。此資訊會用來評估和授權請求。您可以使用 JSON 政策的 Condition 元素來針對請求內容測試特定條件。例如:您可以建立使用 aws:CurrentTime 條件索引鍵的政策,來僅允許使用者在特定日期範圍內執行動作

提交請求時,AWS 會評估政策中每個條件索引鍵的傳回值是「true」(真)、「false」(偽)、「not present」(不存在) 及偶爾的「null」(空白資料字串)。請求中不存在的索引鍵會視為不相符。例如,以下政策會允許移除您自己的多重因素認證 (MFA) 裝置,但僅限您在過去一個小時 (3,600 秒) 中使用 MFA 登入。

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

請求內容可傳回下列值:

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

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

  • Not present (不存在) – 若申請者在 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 元素可以包含多個條件,而且每個條件可以包含多個索引鍵值對。下圖說明了這一點。

如需詳細資訊,請參閱 建立具有多個索引鍵或值的條件