IAMJSON原則元素:條件運算子 - AWS Identity and Access Management

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

IAMJSON原則元素:條件運算子

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

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

重要

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

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

字串條件運算子

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

條件運算子 描述

StringEquals

完全相符,區分大小寫

StringNotEquals

否定相符

StringEqualsIgnoreCase

完全相符,不區分大小寫

StringNotEqualsIgnoreCase

否定相符,不區分大小寫

StringLike

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

注意

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

StringNotLike

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

例如,下列陳述式包含的 Condition 元素使用 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:::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}/*" ] } ] }

如需顯示如何根據應用程式 ID 和OIDC聯合使用者識別碼使用Condition元素來限制資源存取的原則範例,請參閱Amazon S3:可讓 Amazon Cognito 使用者存取其儲存貯體中的物件

萬用字元比對

字串條件運算子會執行不強制執行預先定義格式的無模式比對。ARN和 Date 條件運算子是字串運算子的子集,它們會在條件索引鍵值上強制執行結構。當您針對 StringLike 或日期的部分字串相符項目使用ARN或 StringNotLike運算子時,相符項目會忽略結構的哪一部分是萬用字元。

例如,下列條件會搜尋ARN使用不同條件運算子的部分相符項目。

使 ArnLike 用時,分割區、服務、帳戶 ID、資源類型和部分資源 ID 部分ARN必須與請求內容中的完全相符。ARN只有區域和資源路徑允許部分相符。

"Condition": {"ArnLike": {"aws:SourceArn": "arn:aws:cloudtrail:*:111122223333:trail/*"}}

使 StringLike 用代替時 ArnLike,match 會忽略ARN結構並允許部分比對,而不考慮使用萬用字元的部分。

"Condition": {"StringLike": {"aws:SourceArn": "arn:aws:cloudtrail:*:111122223333:trail/*"}}
ARN ArnLike StringLike

arn:aws:cloudtrail:us-west-2:111122223333:trail/finance

匹配

匹配

arn:aws:cloudtrail:us-east-2:111122223333:trail/finance/archive

匹配

匹配

arn:aws:cloudtrail:us-east-2:444455556666:user/111122223333:trail/finance

無相符項目

匹配

數位條件運算子

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

條件運算子 描述

NumericEquals

相符

NumericNotEquals

否定相符

NumericLessThan

「小於」相符

NumericLessThanEquals

「小於或等於」相符

NumericGreaterThan

「大於」相符

NumericGreaterThanEquals

「大於或等於」相符

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

{ "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 的操作,才允許執行。

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

日期條件運算子

運用日期條件運算子,您可以建構以索引鍵與日期/時間值的對比為基礎來限制存取的 Condition 元素。您同時使用這些條件運算子與 aws:CurrentTime 索引鍵或 aws:EpochTime 索引鍵。您必須使用 ISO8601 日期格式的 W3C 實作之一或 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 SDK使用存取金鑰所提出的要求。在此範例中,如果IAM使用者嘗試檢視或編輯存取金鑰,則會拒絕該要求。

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

布林值條件運算子

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

條件運算子 描述

Bool

布林值相符

例如,此身分型原則會使用Bool條件運算子搭配索aws:SecureTransport引鍵,拒絕將物件和物件標籤複寫到目的地值區及其內容 (如果要求尚未結束)。SSL

重要

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

{ "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:SecureTransport 請求內容會傳回 true 或 false。

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

二進位條件運算子

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

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

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

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

IP 地址條件運算子

IP 位址條件運算子可讓您根據將索引鍵與 IP 位址或 IP 位IPv6址IPv4或範圍進行比較,來建構限制存取的Condition元素。您可以搭配 aws:SourceIp 索引鍵來使用運算子。該值必須採用標準CIDR格式(例如::1234:5678:DB8/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 地址。

如果您在政策條件中指定的索引鍵不存在於請求內容中,則值不相符。除非請求者使用VPC端點發出請求,否則aws:SourceIp密鑰始終存在於請求上下文中。在此情況下,此條件會傳回 false,且此陳述式會隱含拒絕請求。

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

下列範例顯示如何混合使用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是一個字符串。

條件運算子 描述

ArnEquals, ArnLike

區分大小寫的相符。ARN的六個以冒號分隔的元件中的每一個都會分別檢查,且每個元件都可以包含多字元比對萬用字元 (*) 或單一字元比對萬用字元 (?)。ARNArnEqualsArnLike 條件運算子的行為完全相同。

ArnNotEquals, ArnNotLike

的否定比對。ARNArnNotEqualsArnNotLike 條件運算子的行為完全相同。

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

以下以資源為基礎的政策範例顯示附加至您要傳送SNS訊息之 Amazon SQS 佇列的政策。它SNS允許 Amazon 將消息發送到您選擇的隊列(或隊列),但前提是該服務代表特定 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 檢查時並非使用遺失索引鍵。如果您使用具有否定條件運算符的"Effect": "Deny"元素StringNotEqualsIfExists,則即使條件鍵不存在,該請求仍會被拒絕。

使用 IfExists 的範例

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

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

{ "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 陳述式包含在主控台檢視執行個體所需的動作。

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