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:username值,評估不同使用者的 AWS 此政策。

政策條件 請求內容 結果
"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 使用者存取其儲存貯體中的物件

多值字串條件運算子

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

條件運算子 描述

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,只有在標籤包含具有 preprodstorage值的environment金鑰時,才能連接標籤。當您附加IgnoreCase到運算子時,您可以允許任何現有的標籤值大小寫,例如 preprodPreprodPreProd,解析為 true。

當您使用aws:TagKeys條件索引鍵新增ForAnyValue修飾詞時,請求中至少一個標籤索引鍵值必須符合值 environmentForAnyValue 比較區分大小寫,這會阻止使用者使用不正確的標籤索引鍵大小寫,例如使用 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 動作,除非正在存取的資源位於特定的組織單位 (OUs) 集中 AWS Organizations。 AWS Organizations 路徑是組織實體結構的文字表示法。

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

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 API AWS 或 AWS SDK 請求中。在此範例中,如果 IAM 使用者嘗試檢視或編輯存取金鑰,則會拒絕請求。

布林值條件運算子

布林值條件可讓您建構Condition元素,根據比較金鑰與 true或 來限制存取false

如果索引鍵包含多個值,則布林運算子可以透過設定運算子 ForAllValues和 來限定ForAnyValue。如需多個內容索引鍵或值之評估邏輯的詳細資訊,請參閱 設定多值內容索引鍵的運算子

  • 政策變數支援

  • 萬用字元 – 不支援

條件運算子 描述

Bool

布林值相符

ForAllValues:Bool

使用 搭配 Bool 資料類型陣列。內容索引鍵值中的所有布林值必須符合政策中的布林值。

若要防止ForAllValues運算子評估缺少的內容索引鍵或內容索引鍵,其值為允許,您可以在政策中包含 Null 條件運算子

ForAnyValue:Bool

使用 搭配 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 條件運算子

如果請求中的索引鍵包含多個值,則 ARN 運算子可以透過設定運算子 ForAllValues和 來限定ForAnyValue。如需多個內容索引鍵或值之評估邏輯的詳細資訊,請參閱 設定多值內容索引鍵的運算子

條件運算子 描述

ForAllValues:ArnEquals

ForAllValues:ArnLike

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

ForAnyValue:ArnEquals

ForAnyValue:ArnLike

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

ForAllValues:ArnNotEquals

ForAllValues:ArnNotLike

必要比對。

請求內容中的任何 ARNs 都不符合政策中的任何字串 ARN 模式。

ForAnyValue:ArnNotEquals

ForAnyValue:ArnNotLike

必要比對。

請求內容中至少有一個 ARN 不得符合您政策中的任何 ARN 模式。

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

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

JSON
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "logs:PutDeliverySource", "Resource": "arn:aws::logs::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,您可以在政策中包含 Null 條件運算子,其中包含要檢查內容索引鍵是否存在且其值不是 null false的值。

...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"}} } }