IAM JSON 政策元素:條件運算子 - AWS Identity and Access Management

IAM JSON 政策元素:條件運算子

Condition 元素中使用條件運算子來將政策中的條件鍵和值與請求內容中的值進行比對。如需有關 Condition 元素的詳細資訊,請參閱 IAM JSON 政策元素:Condition

您可以在政策中使用的條件運算子取決於您選擇的條件金鑰。您可以選擇全域條件金鑰或服務限定條件金鑰。若要了解針對全域條件金鑰您可以使用的條件運算子,請參閱 AWS 全域條件內容索金鑰。若要了解針對服務限定條件金鑰您可以使用的條件運算子,請參閱 AWS 服務的動作、資源和條件金鑰,並選擇您希望檢視的服務。

重要

如果您在政策條件中指定的金鑰不存在於請求內容中,則值不相符。除了 ...IfExistNull 檢查以外,這適用於所有條件運算子。這些運算子測試金鑰是否存在於請求內容中。

條件運算子可分成以下幾種類別:

字串條件運算子

運用字串條件運算子,您可以建構以金鑰與字串值的對比為基礎來限制存取的 Condition 元素。

條件運算子 描述

StringEquals

完全相符,區分大小寫

StringNotEquals

否定相符

StringEqualsIgnoreCase

完全相符,不區分大小寫

StringNotEqualsIgnoreCase

否定相符,不區分大小寫

StringLike

大小寫相符。值可以在字串的任何位置包含多字元符合萬用字元 (*) 和單一字元符合萬用字元 (?)。

注意

如果金鑰包含多個值,StringLike 可使用集合運算子限定 ForAllValues:StringLikeForAnyValue:StringLike. 如需詳細資訊,請參閱 建立具有多個金鑰或值的條件

StringNotLike

否定大小寫相符。值可以在字串的任何位置包含多字元符合萬用字元 (*) 或單一字元符合萬用字元 (?)。

例如,下列陳述式包含的 Condition 元素使用 StringEquals 條件運算子搭配 aws:PrincipalTag 金鑰,以指定提出請求的委託人必須以 iamuser-admin 任務類別標記。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::account-id:user/*", "Condition": {"StringEquals": {"aws:PrincipalTag/job-category": "iamuser-admin"}} } }

如果您在政策條件中指定的金鑰不存在於請求內容中,則值不相符。在此範例中,如果委託人使用的 IAM 使用者已連接標籤,則 aws:PrincipalTag/job-category 金鑰存在於請求內容中。如果委託人使用的 IAM 角色有連接的標籤或工作階段標籤,則也包含此金鑰。如果不具有標籤的使用者嘗試檢視或編輯存取金鑰,此條件會傳回 false,且此陳述式會隱含拒絕請求。

您可以使用政策變數String 條件運算子。

下列範例使用 StringLike 條件運算子執行與政策變數的字串配對來建立政策,該政策允許 IAM 使用者使用 Amazon S3 主控台管理其 Amazon S3 儲存貯體中的「主目錄」。該政策允許對 S3 儲存貯體執行指定操作,前提是 s3:prefix 與任一指定模式相符。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::*" }, { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::BUCKET-NAME", "Condition": {"StringLike": {"s3:prefix": [ "", "home/", "home/${aws:username}/" ]}} }, { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::BUCKET-NAME/home/${aws:username}", "arn:aws:s3:::BUCKET-NAME/home/${aws:username}/*" ] } ] }

如需關於如何使用 Condition 元素為 Web 聯合身分驗證的應用程式 ID 和使用者 ID 限制對資源的存取的政策範例,請參閱 Amazon S3:可讓 Amazon Cognito 使用者存取其儲存貯體中的物件

數位條件運算子

利用數位條件運算子,您可以建構以金鑰與整數或小數值的對比來限制存取的 Condition 元素。

條件運算子 描述

NumericEquals

相符

NumericNotEquals

否定相符

NumericLessThan

「小於」相符

NumericLessThanEquals

「小於或等於」相符

NumericGreaterThan

「大於」相符

NumericGreaterThanEquals

「大於或等於」相符

例如,下列聲明包含一個 Condition 元素,該元素使用 NumericLessThanEquals 條件運算子與 s3:max-keys 金鑰來指定申請者一次「最多」可在 example_bucket 內列出 10 個物件。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::example_bucket", "Condition": {"NumericLessThanEquals": {"s3:max-keys": "10"}} } }

如果您在政策條件中指定的金鑰不存在於請求內容中,則值不相符。在此範例中,當您執行 s3:max-keys 操作時,ListBucket 金鑰永遠存在於請求中。如果此政策允許所有 Amazon S3 操作,則只有包含 max-keys 內容金鑰且值小於或等於 10 的操作,才允許執行。

您不可使用政策變數Numeric 條件運算子。

日期條件運算子

運用日期條件運算子,您可以建構以金鑰與日期/時間值的對比為基礎來限制存取的 Condition 元素。您同時使用這些條件運算子與 aws:CurrentTime 金鑰或 aws:EpochTime 金鑰。您必須指定日期/時間值,且其中一個 W3C 實作要採用 ISO 8601 日期格式或 epoch (UNIX) 時間格式。

注意

日期條件運算子不允許使用萬用字元。

條件運算子 描述

DateEquals

符合特定日期

DateNotEquals

否定相符

DateLessThan

在特定日期與時間前相符

DateLessThanEquals

在特定日期與時間時或之前相符

DateGreaterThan

在特定日期與時間後相符

DateGreaterThanEquals

在特定日期與時間時或之後相符

例如,下列陳述式包含的 Condition 元素使用 DateGreaterThan 條件運算子搭配 aws:TokenIssueTime 金鑰。此條件指定用來提出請求的臨時安全憑證已於 2020 年發行。此政策可以每天以程式設計方式更新,以確保帳戶成員使用全新的憑證。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::account-id:user/*", "Condition": {"DateGreaterThan": {"aws:TokenIssueTime": "2020-01-01T00:00:01Z"}} } }

如果您在政策條件中指定的金鑰不存在於請求內容中,則值不相符。只有在委託人使用臨時憑證發出請求時,aws:TokenIssueTime 金鑰才存在於請求內容中。在使用存取金鑰的 AWS CLI、AWS API 或 AWS 開發套件請求中不存在此金鑰。在此範例中,如果 IAM 使用者嘗試檢視或編輯存取金鑰,則會拒絕請求。

您不可使用政策變數Date 條件運算子。

布林值條件運算子

運用布林值條件,您可以建構以金鑰與「true」或「false」的對比來限制存取的 Condition 元素。

條件運算子 描述

Bool

布林值相符

例如,下列聲明使用 Bool 條件運算子與 aws:SecureTransport 金鑰來指定必須使用 SSL 發出請求。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::account-id:user/*", "Condition": {"Bool": {"aws:SecureTransport": "true"}} } }

如果您在政策條件中指定的金鑰不存在於請求內容中,則值不相符。aws:SecureTransport 金鑰永遠存在於請求內容中。

您不可使用政策變數Boolean 條件運算子。

二進位條件運算子

運用 BinaryEquals 條件運算子,您可以建立測試二進位格式鍵值的 Condition 元素。它會比較指定金鑰位元組的值與政策中 base-64 編碼表示的二進位值。

"Condition" : { "BinaryEquals": { "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA==" } }

如果您在政策條件中指定的金鑰不存在於請求內容中,則值不相符。

您不可使用政策變數Binary 條件運算子。

IP 地址條件運算子

運用 IP 地址條件運算子,您可以建構 Condition 元素,它們會以金鑰與 IPv4 或 IPv6 地址或 IP 地址範圍的對比來限制存取。您可以搭配 aws:SourceIp 金鑰來使用運算子。該值必須採用標準的 CIDR 格式 (例如 203.0.113.0/24 或 2001:DB8:1234:5678::/64)。如果您指定的 IP 地址沒有關聯的路由字首,IAM 將使用 /32 做為預設字首值。

部分 AWS 服務支援 IPv6,使用 :: 來代表一系列 0。若要了解某項服務是否支援 IPv6,請參閱該服務的文件。

條件運算子 描述

IpAddress

指定的 IP 地址或範圍

NotIpAddress

除指定 IP 地址或範圍外的所有 IP 地址

例如,下列聲明使用 IpAddress 條件運算子與 aws:SourceIp 金鑰來指定必須來自 IP 範圍 203.0.113.0 到 203.0.113.255。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::account-id:user/*", "Condition": {"IpAddress": {"aws:SourceIp": "203.0.113.0/24"}} } }

aws:SourceIp 條件金鑰解析為發出請求的 IP 地址。如果請求源自 Amazon EC2 執行個體,則 aws:SourceIp 計算為執行個體的公有 IP 地址。

如果您在政策條件中指定的金鑰不存在於請求內容中,則值不相符。aws:SourceIp 金鑰永遠存在於請求內容中,但請求者使用 VPC 端點提出請求時為例外。在此情況下,此條件會傳回 false,且此陳述式會隱含拒絕請求。

您不可使用政策變數IP Address 條件運算子。

以下範例顯示如何混合使用 IPv4 與 IPv6 地址,以涵蓋您組織的所有有效 IP 地址。建議您使用您的 IPv6 地址範圍以及已擁有的 IPv4 範圍來強化組織的政策,以確保政策在您過渡到 IPv6 時繼續有效。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "someservice:*", "Resource": "*", "Condition": { "IpAddress": { "aws:SourceIp": [ "203.0.113.0/24", "2001:DB8:1234:5678::/64" ] } } } }

如果以使用者身分直接呼叫測試的 API,aws:SourceIp 條件金鑰僅在 JSON 政策中有效。如果改為使用服務代表您呼叫目標服務,則目標服務看到的是進行呼叫的服務的 IP 地址而不是來源使用者的 IP 地址。例如,如果使用 AWS CloudFormation 呼叫 Amazon EC2 來建構執行個體,則會發生這種情況。目前,無法透過進行呼叫的服務將來源 IP 地址傳遞給目標服務以在 JSON 政策中進行評估。對於這些服務 API 呼叫類型,請勿使用 aws:SourceIp 條件金鑰。

Amazon 資源名稱 (ARN) 條件運算子

運用 Amazon 資源名稱 (ARN) 條件運算子,您可以建構以金鑰與 ARN 的對比為基礎來限制存取的 Condition 元素。ARN 被視為一個字串。並非所有服務皆支援使用此運算子比較 ARN。如果 ARN 條件運算子無法正常運作,請嘗試使用字串條件運算子

條件運算子 描述

ArnEquals, ArnLike

ARN 大小寫相符。ARN 的六個由冒號分隔開的部分都要單獨檢查,每一個部分都可包括一個多字元配對萬用字元 (*) 或一個單字元配對萬用字元。ArnEqualsArnLike 條件運算子的行為完全相同。

ArnNotEquals, ArnNotLike

ARN 否定相符。ArnNotEqualsArnNotLike 條件運算子的行為完全相同。

在某些情況下,當 ARN 運算子不相符時,字串運算子會相符。例如,如果下列模式用於比對:

arn:aws:someservice:*:111122223333:finance/*

請求中包含以下值:

arn:aws:someservice:us-east-2:999999999999:store/abc:111122223333:finance/document.txt

使用 StringLike 條件,相符項目就會成功。第一個星號比對 us-east-2:999999999999:store/abc:。使用 ArnLike 條件 (會比對冒號之間的元素),比對失敗。第一個星號只符合 us-east-2,並在 999999999999:store/abc: 失敗。

您可以使用政策變數ARN 條件運算子。

下列以資源為基礎的政策範例顯示連接至 Amazon SQS 佇列的政策 (您想要將 SNS 訊息傳送到此佇列)。它授予 Amazon SNS 將訊息傳送到所選佇列的許可,但僅在該服務代表特定 Amazon SNS 主題傳送這些訊息時才授予此許可。您在 Resource 欄位中指定佇列,Amazon SNS 主題則作為 SourceArn 金鑰的值。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"AWS": "123456789012"}, "Action": "SQS:SendMessage", "Resource": "arn:aws:sqs:REGION:123456789012:QUEUE-ID", "Condition": {"ArnEquals": {"aws:SourceArn": "arn:aws:sns:REGION:123456789012:TOPIC-ID"}} } }

如果您在政策條件中指定的金鑰不存在於請求內容中,則值不相符。只有在資源觸發服務以代替資源擁有者呼叫另一個服務時,aws:SourceArn 金鑰才存在於請求內容中。如果 IAM 使用者嘗試直接執行此操作,此條件會傳回 false,且此陳述式會隱含拒絕請求。

...IfExists 條件運算子

IfExists 條件外,您可在任何條件運算子名稱的尾端加入 Null,例如 StringLikeIfExists。如果您是指「如果請求的內容中存在政策金鑰,則依照政策所述來處理金鑰。如果該金鑰不存在,則評估條件元素為 true。」 陳述式中其他條件因素仍然可以導致不相符,但使用 ...IfExists 檢查時並非使用遺失金鑰。

使用 IfExists 的範例

許多條件金鑰描述有關特定類型的資源的資訊,僅當存取該類型的資源時才存在。這些條件金鑰在其他類型的資源上不存在。當政策陳述式僅適用於一種類型的資源時,這不會導致問題。但是,有時單一陳述式可以適用於多種類型的資源,例如當政策陳述式從多個服務引用操作時,或是當服務中的給定操作存取同一服務中的多種不同資源類型時。在這種情況下,在政策陳述式中包含僅適用於一種資源的條件金鑰可能會導致政策陳述式中的 Condition 元素失敗,從而使陳述式的 "Effect" 不適用。

例如,請設想以下政策範例:

{ "Version": "2012-10-17", "Statement": { "Sid": "THISPOLICYDOESNOTWORK", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": {"StringLike": {"ec2:InstanceType": [ "t1.*", "t2.*", "m3.*" ]}} } }

上述政策的「意圖」是讓使用者可以啟動類型為 t1、t2 或 m3 的任何執行個體。但是,啟動執行個體實際上要求存取除了執行個體本身之外的許多資源;例如映射、金鑰對、安全群組等。會針對啟動執行個體所需的每個資源來評估整個陳述式。這些其他資源沒有 ec2:InstanceType 條件金鑰,因此 StringLike 檢查會失敗,並且不會向使用者授予啟動「任何」執行個體類型的能力。若要解決此問題,請改用 StringLikeIfExists 條件運算子。如此一來,僅有在條件索引鍵存在時才會進行測試。您會讀到下列內容:「如果正在檢查的資源有 "ec2:InstanceType" 條件金鑰,則只會在鍵值以 "t1.*"、"t2.*" 或 "m3.*" 開頭時才允許該動作。」 如果正在檢查的資源沒有該條件金鑰,則無需擔心它。』 DescribeActions 陳述式包含在主控台檢視執行個體所需的動作。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RunInstance", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "StringLikeIfExists": { "ec2:InstanceType": [ "t1.*", "t2.*", "m3.*" ]}} }, { "Sid": "DescribeActions", "Effect": "Allow", "Action": [ "ec2:DescribeImages", "ec2:DescribeInstances", "ec2:DescribeVpcs", "ec2:DescribeKeyPairs", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups" ], "Resource": "*" }] }

用於檢查條件金鑰是否存在的條件運算子

使用 Null 條件運算子檢查授權時是否有條件金鑰。在政策陳述式中使用 true (金鑰不存在 - 為 null) 或 false (金鑰存在且值不為 null)。

您不可使用政策變數Null 條件運算子。

例如,您可以使用此條件運算子確定使用者使用的是自己的針對該操作的憑證還是臨時憑證。如果使用者使用的是臨時憑證,則金鑰 aws:TokenIssueTime 存在並具有一個值。以下範例顯示一個條件,該條件說明使用者在使用 Amazon EC2 API 時不能使用臨時憑證 (金鑰不能存在)。

{ "Version": "2012-10-17", "Statement":{ "Action":"ec2:*", "Effect":"Allow", "Resource":"*", "Condition":{"Null":{"aws:TokenIssueTime":"true"}} } }