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

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

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

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

重要

如果您在政策條件中指定的索引鍵不存在於請求內容中,則值不相符且條件為 false。如果政策條件要求索引鍵為相符,例如 StringNotLikeArnNotLike,並且正確的索引鍵不存在,則條件為 true。除了 ...IfExistNull 檢查以外,此邏輯適用於所有條件運算子。這些運算子測試索引鍵是否存在於請求內容中。

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

字串條件運算子

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

條件運算子 說明

StringEquals

完全相符,區分大小寫

StringNotEquals

否定相符

StringEqualsIgnoreCase

完全相符,不區分大小寫

StringNotEqualsIgnoreCase

否定相符,不區分大小寫

StringLike

大小寫相符。值可以在字串的任何位置包含多字元比對萬用字元 (*) 和單一字元比對萬用字元 (?)。您必須指定萬用字元才能達到部分字串相符。

注意

如果索引鍵包含多個值,StringLike 可使用集合運算子限定 ForAllValues:StringLikeForAnyValue:StringLike. 如需更多詳細資訊,請參閱 用於多值內容索引鍵的集運算子

StringNotLike

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

範例 字串條件運算子

例如,下列陳述式包含的 Condition 元素使用 aws:PrincipalTag 索引鍵,以指定提出請求的主體必須以 iamuser-admin 任務類別標記。

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

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

下表顯示了 AWS 如何根據請求中的條件索引鍵值來評估此政策。

政策條件 請求內容 結果
"StringEquals": { "aws:PrincipalTag/job-category": "iamuser-admin" }
aws:PrincipalTag/job-category: – iamuser-admin

匹配

"StringEquals": { "aws:PrincipalTag/job-category": "iamuser-admin" }
aws:PrincipalTag/job-category: – dev-ops

無相符項目

"StringEquals": { "aws:PrincipalTag/job-category": "iamuser-admin" }

請求內容中沒有 aws:PrincipalTag/job-category

無相符項目

範例 將政策變數與字串條件運算子搭配使用

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

JSON
{ "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:::amzn-s3-demo-bucket", "Condition": { "StringLike": { "s3:prefix": [ "", "home/", "home/${aws:username}/" ] } } }, { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/home/${aws:username}", "arn:aws:s3:::amzn-s3-demo-bucket/home/${aws:username}/*" ] } ] }

下表說明 AWS 如何根據請求內容中的 aws:username 值為不同使用者評估此政策。

政策條件 請求內容 結果
"StringLike": { "s3:prefix": [ "home/", "home/${aws:username}/" ] }
aws:username: – martha_rivera
"StringLike": { "s3:prefix": [ "home/", "home/martha_rivera/" ] }
"StringLike": { "s3:prefix": [ "home/", "home/${aws:username}/" ] }
aws:username: – nikki_wolf
"StringLike": { "s3:prefix": [ "home/", "home/nikki_wolf/" ] }
"StringLike": { "s3:prefix": [ "home/", "home/${aws:username}/" ] }

請求內容中沒有 aws:username

無相符項目

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

多值字串條件運算子

如果請求中的索引鍵包含多個值,則可以使用集運算子 ForAllValuesForAnyValue 來限定字串運算子。如需有關多個內容索引鍵或值之評估邏輯的詳細資訊,請參閱用於多值內容索引鍵的集運算子

條件運算子 說明

ForAllValues:StringEquals

ForAllValues:StringEqualsIgnoreCase

請求中條件索引鍵的所有值都必須與政策中的至少一個值相符。

ForAnyValue:StringEquals

ForAnyValue:StringEqualsIgnoreCase

請求中至少有一個條件索引鍵值必須與政策中的其中一個值相符。

ForAllValues:StringNotEquals

ForAllValues:StringNotEqualsIgnoreCase

否定相符。

請求中內容索引鍵的所有值都不與政策中的任何內容索引鍵值相符。

ForAnyValue:StringNotEquals

ForAnyValue:StringNotEqualsIgnoreCase

否定相符。

請求中至少有一個內容索引鍵值不得與政策中內容索引鍵中的任何值相符。

ForAllValues:StringLike

請求中條件索引鍵的所有值都必須與政策中的至少一個值相符。

ForAnyValue:StringLike

請求中至少有一個條件索引鍵值必須與政策中的其中一個值相符。

ForAllValues:StringNotLike

否定相符。

請求中內容索引鍵的所有值都不與政策中的任何內容索引鍵值相符。

ForAnyValue:StringNotLike

否定相符。

請求中至少有一個內容索引鍵值不得與政策中內容索引鍵中的任何值相符。

範例 將 ForAnyValue 與字串條件運算子搭配使用

此範例會示範如何建立身分型政策,它允許使用 Amazon EC2 CreateTags 動作以將標籤連接至執行個體。使用 StringEqualsIgnoreCase 時,僅當標籤包含 environment 鍵且值為 preprodstorage 時,您才能連接標籤。將 IgnoreCase 附加至運算子時,可以允許任何現有的標籤值大寫 (例如 preprodPreprodPreProd) 都解析為 true。

ForAnyValue 修飾詞與 aws:TagKeys 條件索引鍵搭配使用時,請求中至少有一個標籤索引鍵值必須與值 environment 相符。ForAnyValue 比較會區分大小寫,這可以阻止使用者使用錯誤大小寫的標籤索引鍵,例如使用 Environment 而不是 environment

JSON
{ "Version":"2012-10-17", "Statement": { "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringEqualsIgnoreCase": { "aws:RequestTag/environment": [ "preprod", "storage" ] }, "ForAnyValue:StringEquals": { "aws:TagKeys": "environment" } } } }

下表顯示了 AWS 如何根據請求中的條件索引鍵值來評估此政策。

政策條件 請求內容 結果
"StringEqualsIgnoreCase": { "aws:RequestTag/environment": [ "preprod", "storage" ] }, "ForAnyValue:StringEquals": { "aws:TagKeys": "environment" }
aws:TagKeys: – environment aws:RequestTag/environment: – preprod

匹配

"StringEqualsIgnoreCase": { "aws:RequestTag/environment": [ "preprod", "storage" ] }, "ForAnyValue:StringEquals": { "aws:TagKeys": "environment" }
aws:TagKeys: – environment – costcenter aws:RequestTag/environment: – PreProd

匹配

"StringEqualsIgnoreCase": { "aws:RequestTag/environment": [ "preprod", "storage" ] }, "ForAnyValue:StringEquals": { "aws:TagKeys": "environment" }
aws:TagKeys: – Environment aws:RequestTag/Environment: – preprod

無相符項目

"StringEqualsIgnoreCase": { "aws:RequestTag/environment": [ "preprod", "storage" ] }, "ForAnyValue:StringEquals": { "aws:TagKeys": "environment" }
aws:TagKeys: – costcenter aws:RequestTag/environment: – preprod

無相符項目

"StringEqualsIgnoreCase": { "aws:RequestTag/environment": [ "preprod", "storage" ] }, "ForAnyValue:StringEquals": { "aws:TagKeys": "environment" }

請求內容中沒有 aws:TagKeys

aws:RequestTag/environment: – storage

無相符項目

"StringEqualsIgnoreCase": { "aws:RequestTag/environment": [ "preprod", "storage" ] }, "ForAnyValue:StringEquals": { "aws:TagKeys": "environment" }
aws:TagKeys: – environment

請求內容中沒有 aws:RequestTag/environment

無相符項目

"StringEqualsIgnoreCase": { "aws:RequestTag/environment": [ "preprod", "storage" ] }, "ForAnyValue:StringEquals": { "aws:TagKeys": "environment" }

請求內容中沒有 aws:TagKeys

請求內容中沒有 aws:RequestTag/environment

無相符項目

萬用字元比對

字串條件運算子會執行不強制執行預先定義格式的無模式比對。ARN 和 Date 條件運算子是字串運算子的子集,它們會對條件索引鍵值強制執行一種結構。

建議使用與索引鍵要比較的值對應的條件運算子。例如,將索引鍵與字串值進行比較時,應該使用 字串條件運算子。同樣地,將索引鍵與 ARN 值進行比較時,應該使用 Amazon Resource Name (ARN) 條件運算子

此範例說明如何圍繞組織中的資源建立邊界。此政策中的條件將拒絕存取 Amazon S3 動作,除非正在存取的資源位於 AWS Organizations 中的一組特定組織單位中。AWS Organizations 路徑是組織實體結構的文字表示。

條件要求 aws:ResourceOrgPaths 包含任何列出的組織單位路徑。由於 aws:ResourceOrgPaths 是多值條件,因此政策會使用 ForAllValues:StringNotLike 運算子來比較 aws:ResourceOrgPaths 的值與政策中的組織單位清單。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "DenyS3AccessOutsideMyBoundary", "Effect": "Deny", "Action": [ "s3:*" ], "Resource": "*", "Condition": { "ForAllValues:StringNotLike": { "aws:ResourceOrgPaths": [ "o-acorg/r-acroot/ou-acroot-mediaou/", "o-acorg/r-acroot/ou-acroot-sportsou/*" ] } } } ] }

下表顯示了 AWS 如何根據請求中的條件索引鍵值來評估此政策。

政策條件 請求內容 結果
"ForAllValues:StringNotLike": { "aws:ResourceOrgPaths": [ "o-acorg/r-acroot/ou-acroot-mediaou/", "o-acorg/r-acroot/ou-acroot-sportsou/*" ] }
aws:ResourceOrgPaths: – o-acorg/r-acroot/ou-acroot-sportsou/costcenter/

匹配

"ForAllValues:StringNotLike": { "aws:ResourceOrgPaths": [ "o-acorg/r-acroot/ou-acroot-mediaou/", "o-acorg/r-acroot/ou-acroot-sportsou/*" ] }
aws:ResourceOrgPaths: – o-acorg/r-acroot/ou-acroot-mediaou/costcenter/

無相符項目

"ForAllValues:StringNotLike": { "aws:ResourceOrgPaths": [ "o-acorg/r-acroot/ou-acroot-mediaou/", "o-acorg/r-acroot/ou-acroot-sportsou/*" ] }

請求中沒有 aws:ResourceOrgPaths:

無相符項目

數位條件運算子

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

  • 政策變數 – 不支援

  • 萬用字元 – 不支援

條件運算子 說明

NumericEquals

相符

NumericNotEquals

否定相符

NumericLessThan

「小於」相符

NumericLessThanEquals

「小於或等於」相符

NumericGreaterThan

「大於」相符

NumericGreaterThanEquals

「大於或等於」相符

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

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

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

日期條件運算子

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

  • 政策變數 – 不支援

  • 萬用字元 – 不支援

條件運算子 說明

DateEquals

符合特定日期

DateNotEquals

否定相符

DateLessThan

在特定日期與時間前相符

DateLessThanEquals

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

DateGreaterThan

在特定日期與時間後相符

DateGreaterThanEquals

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

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

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

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

布林值條件運算子

運用布林值條件,您可以建構 Condition 元素,這些元素會根據將索引鍵與 truefalse 進行比較的結果來限制存取權。

如果索引鍵包含多個值,布林運算子可以使用集運算子 ForAllValuesForAnyValue 進行限定。如需有關多個內容索引鍵或值之評估邏輯的詳細資訊,請參閱用於多值內容索引鍵的集運算子

  • 政策變數支援

  • 萬用字元 – 不支援

條件運算子 說明

Bool

布林值相符

ForAllValues:Bool

與 Array of Bool 資料類型搭配使用。內容索引鍵值中的所有布林值必須與政策中的布林值相符。

若要防止 ForAllValues 運算子將遺失內容索引鍵或具有空值的內容索引鍵評估為「已允許」,您可以在政策中包含 Null 條件運算子

ForAnyValue:Bool

與 Array of Bool 資料類型搭配使用。內容索引鍵值中至少有一個布林值必須與政策中的布林值相符。

範例 布林值條件運算子

下列身分型政策透過將 Bool 條件運算子和 aws:SecureTransport 索引鍵搭配使用,拒絕當請求不在 SSL 上時,將物件和物件標籤複寫至目的地儲存貯體及其內容。

重要

此政策不允許任何動作。將此政策與允許特定動作的其他政策結合使用。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "BooleanExample", "Action": "s3:ReplicateObject", "Effect": "Deny", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } } ] }

下表顯示了 AWS 如何根據請求中的條件索引鍵值來評估此政策。

政策條件 請求內容 結果
"Bool": { "aws:SecureTransport": "false" }
aws:SecureTransport: – false

匹配

"Bool": { "aws:SecureTransport": "false" }
aws:SecureTransport: – true

無相符項目

"Bool": { "aws:SecureTransport": "false" }

請求內容中沒有 aws:SecureTransport

無相符項目

二進位條件運算子

運用 BinaryEquals 條件運算子,您可以建構用於測試二進位格式索引鍵值的 Condition 元素。它會比較指定金鑰位元組的值與政策中 base-64 編碼表示的二進位值。如果您在政策條件中指定的索引鍵不存在於請求內容中,則值不相符。

  • 政策變數 – 不支援

  • 萬用字元 – 不支援

"Condition" : { "BinaryEquals": { "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA==" } }
政策條件 請求內容 結果
"BinaryEquals": { "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA==" }
key: – QmluYXJ5VmFsdWVJbkJhc2U2NA==

匹配

"BinaryEquals": { "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA==" }
key: – ASIAIOSFODNN7EXAMPLE

無相符項目

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

請求內容中沒有 key

無相符項目

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 地址

範例 IP 位址條件運算子

下列陳述式將 IpAddress 條件運算子與 aws:SourceIp 索引鍵搭配使用,來指定請求必須來自 IP 範圍 203.0.113.0 至 203.0.113.255。

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

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

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

下表顯示了 AWS 如何根據請求中的條件索引鍵值來評估此政策。

政策條件 請求內容 結果
"IpAddress": { "aws:SourceIp": "203.0.113.0/24" }
aws:SourceIp: – 203.0.113.1

匹配

"IpAddress": { "aws:SourceIp": "203.0.113.0/24" }
aws:SourceIp: – 198.51.100.1

無相符項目

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

JSON
{ "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 Resource Name (ARN) 條件運算子

運用 Amazon Resource Name (ARN) 條件運算子,您可以建構以索引鍵與 ARN 的對比為基礎來限制存取的 Condition 元素。ARN 被視為一個字串。

條件運算子 說明

ArnEquals, ArnLike

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

ArnNotEquals, ArnNotLike

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

範例 ARN 條件運算子

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

JSON
{ "Version":"2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "SQS:SendMessage", "Resource": "arn:aws:sqs:us-east-1:123456789012:QUEUE-ID", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:sns:us-east-1:123456789012:TOPIC-ID" } } } }

僅當資源觸發服務代表資源擁有者呼叫另一項服務時,請求內容中才存在 aws:SourceArn 索引鍵。如果 IAM 使用者嘗試直接執行此操作,此條件會傳回 false,且此陳述式會隱含拒絕請求。

下表顯示了 AWS 如何根據請求中的條件索引鍵值來評估此政策。

政策條件 請求內容 結果
"ArnEquals": { "aws:SourceArn": "arn:aws:sns:us-west-2:123456789012:TOPIC-ID" }
aws:SourceArn: – arn:aws:sns:us-west-2:123456789012:TOPIC-ID

匹配

"ArnEquals": { "aws:SourceArn": "arn:aws:sns:us-west-2:123456789012:TOPIC-ID" }
aws:SourceArn: – arn:aws:sns:us-west-2:777788889999:TOPIC-ID

無相符項目

"ArnEquals": { "aws:SourceArn": "arn:aws:sns:us-west-2:123456789012:TOPIC-ID" }

請求內容中沒有 aws:SourceArn

無相符項目

多值 ARN 條件運算子

如果請求中的索引鍵包含多個值,則可以使用集運算子 ForAllValuesForAnyValue 來限定 ARN 運算子。如需有關多個內容索引鍵或值之評估邏輯的詳細資訊,請參閱用於多值內容索引鍵的集運算子

條件運算子 說明

ForAllValues:ArnEquals

ForAllValues:ArnLike

請求內容中的所有 ARN 都必須與政策中的至少一個 ARN 模式相符。

ForAnyValue:ArnEquals

ForAnyValue:ArnLike

請求內容中至少有一個 ARN 必須與政策中的其中一個 ARN 模式相符。

ForAllValues:ArnNotEquals

ForAllValues:ArnNotLike

否定相符。

請求內容中的所有 ARN 都不與政策中的任何字串 ARN 模式相符。

ForAnyValue:ArnNotEquals

ForAnyValue:ArnNotLike

否定相符。

請求內容中必須至少有一個 ARN 不得與政策中的任何 ARN 模式相符。

範例 將 ForAllValues 與 ARN 條件運算子搭配使用

下列範例使用 ForAllValues:ArnLike 來建立或更新 Amazon CloudWatch Logs 日誌的邏輯交付來源。條件區塊包含條件索引鍵 logs:LogGeneratingResourceArns,用於篩選請求中傳遞的日誌產生資源 ARN。使用此條件運算子,請求中的所有 ARN 都必須與政策中的至少一個 ARN 相符。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "logs:PutDeliverySource", "Resource": "arn:aws:logs:us-east-1:123456789012:delivery-source:*", "Condition": { "ForAllValues:ArnLike": { "logs:LogGeneratingResourceArns": [ "arn:aws:cloudfront::123456789012:distribution/*", "arn:aws:cloudfront::123456789012:distribution/support*" ] } } } ] }

下表顯示了 AWS 如何根據請求中的條件索引鍵值來評估此政策。

政策條件 請求內容 結果
"ForAllValues:ArnLike": { "logs:LogGeneratingResourceArns": [ "arn:aws::cloudfront:123456789012:distribution/*", "arn:aws::cloudfront:123456789012:distribution/support*" ] }
logs:LogGeneratingResourceArns: – arn:aws::cloudfront:123456789012:distribution/costcenter

匹配

"ForAllValues:ArnLike": { "logs:LogGeneratingResourceArns": [ "arn:aws::cloudfront:123456789012:distribution/*", "arn:aws::cloudfront:123456789012:distribution/support*" ] }
logs:LogGeneratingResourceArns: – arn:aws::cloudfront:123456789012:distribution/costcenter – arn:aws::cloudfront:123456789012:distribution/support2025

匹配

"ForAllValues:ArnLike": { "logs:LogGeneratingResourceArns": [ "arn:aws::cloudfront:123456789012:distribution/*", "arn:aws::cloudfront:123456789012:distribution/support*" ] }
logs:LogGeneratingResourceArns: – arn:aws::cloudfront:123456789012:distribution/costcenter – arn:aws::cloudfront:123456789012:distribution/admin

無相符項目

"ForAllValues:ArnLike": { "logs:LogGeneratingResourceArns": [ "arn:aws::cloudfront:123456789012:distribution/*", "arn:aws::cloudfront:123456789012:distribution/support*" ] }
logs:LogGeneratingResourceArns: – arn:aws::cloudfront:777788889999:distribution/costcenter

無相符項目

"ForAllValues:ArnLike": { "logs:LogGeneratingResourceArns": [ "arn:aws::cloudfront:123456789012:distribution/*", "arn:aws::cloudfront:123456789012:distribution/support*" ] }

請求內容中沒有 logs:LogGeneratingResourceArns

匹配

如果請求中沒有內容索引鍵,或內容索引鍵值解析為 Null 資料集 (例如空白字串),則 ForAllValues 限定詞會傳回 true。若要防止遺失內容索引鍵或具有空值的內容索引鍵評估為 true,您可以在政策中包含值為 falseNull 條件運算子,以檢查內容索引鍵是否存在且其值不為 Null。

...IfExists 條件運算子

IfExists 條件外,您可在任何條件運算子名稱的尾端加入 Null,例如 StringLikeIfExists。執行此操作,並表明如果請求的內容中存在條件索引鍵,則依照政策所述來處理索引鍵。如果該索引鍵不存在,則評估條件元素為 true。」 陳述式中其他條件因素仍然可以導致不相符,但使用 ...IfExists 檢查時並非使用遺失索引鍵。如果使用 "Effect": "Deny" 元素搭配否定條件運算子,例如 StringNotEqualsIfExists,即使條件索引鍵不存在,仍然會拒絕請求。

使用 IfExists 的範例

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

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

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

上述政策的意圖是讓使用者可以啟動類型為 t1t2m3 的任何執行個體。但是,啟動執行個體要求存取除了執行個體本身之外的許多資源;例如映射、金鑰對、安全群組等。會針對啟動執行個體所需的每個資源來評估整個陳述式。這些其他資源沒有 ec2:InstanceType 條件金鑰,因此 StringLike 檢查會失敗,並且不會向使用者授予啟動「任何」執行個體類型的能力。

若要解決此問題,請改用 StringLikeIfExists 條件運算子。如此一來,僅有在條件索引鍵存在時才會進行測試。您會讀到以下政策:「如果正在檢查的資源有 "ec2:InstanceType" 條件索引鍵,那麼只會在鍵值以 t1.t2.m3. 開頭時才允許該動作。如果正在檢查的資源沒有該條件索引鍵,則無需擔心它。』 與 StringLikeIfExists 條件運算子搭配使用時,條件索引鍵值中的星號 (*) 會被解譯為萬用字元,以實現部分字串相符。DescribeActions 陳述式包含在主控台檢視執行個體所需的動作。

JSON
{ "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": "*" } ] }

下表顯示了 AWS 如何根據請求中的條件索引鍵值來評估此政策。

政策條件 請求內容 結果
"StringLikeIfExists": { "ec2:InstanceType": [ "t1.*", "t2.*", "m3.*" ] }
ec2:InstanceType: – t1.micro

匹配

"StringLikeIfExists": { "ec2:InstanceType": [ "t1.*", "t2.*", "m3.*" ] }
ec2:InstanceType: – m2.micro

無相符項目

"StringLikeIfExists": { "ec2:InstanceType": [ "t1.*", "t2.*", "m3.*" ] }

請求內容中沒有 ec2:InstanceType

匹配

用於檢查條件索引鍵是否存在的條件運算子

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

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

例如,您可以使用此條件運算子來確定使用者使用的是臨時憑證還是自己的憑證來發出請求。如果使用者使用的是臨時憑證,則索引鍵 aws:TokenIssueTime 存在並具有一個值。下列範例展示了一個條件,該條件規定使用者必須使用臨時憑證 (必須存在索引鍵) 才能使用 Amazon EC2 API。

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