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

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

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

Condition 元素中使用條件運算子來將政策中的條件鍵和值與請求內容中的值進行比對。如需有關 Condition 元素的詳細資訊,請參閱 IAM JSON 政策元素: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:::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}/*" ] } ] }

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

萬用字元比對

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

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

使 ArnLike 用時,ARN 的分區,服務,帳戶 ID,資源類型和部分資源 ID 部分必須與請求內容中的 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 金鑰來指定申請者一次「最多」可在 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 SDK 要求中。在此範例中,如果 IAM 使用者嘗試檢視或編輯存取金鑰,則會拒絕請求。

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

布林值條件運算子

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

條件運算子 描述

Bool

布林值相符

例如,如果請求不在 SSL 上,則此身分型政策會使用 Bool 條件運算子搭配 aws:SecureTransport 金鑰,拒絕將物件和物件標籤複寫到目的地儲存貯體及其內容。

重要

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

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

如果您在政策條件中指定的索引鍵不存在於請求內容中,則值不相符。aws:SecureTransport 請求內容會傳回 true 或 false。

您可以使用政策變數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,且此陳述式會隱含拒絕請求。

您不可使用政策變數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 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 索引鍵的值。

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