IAM 政策元素:變數與標籤 - AWS Identity and Access Management

IAM 政策元素:變數與標籤

在編寫政策時,如果不知道資源或條件索引鍵的確切值,請使用 AWS Identity and Access Management (IAM) 政策變數作為預留位置。

注意

如果 AWS 無法解析變數,這可能會導致整個陳述式無效。例如,如果您使用 aws:TokenIssueTime 變數,此變數只會在請求者使用臨時憑證驗證時解析值 (IAM 角色)。為避免變數造成陳述式無效,請使用 ... IfExists 條件運算子。

簡介

在 IAM 政策中,許多動作允許您為要控制存取的特定資源提供名稱。例如,下列政策可讓使用者列出、讀取和寫入 Amazon S3 儲存貯體 mybucket 中具有 David 字首的物件。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["David/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/David/*"] } ] }

在某些情況下,您在編寫政策時可能不知道資源的確切名稱。您可能想要一般化政策,以使其適用於許多使用者,而不必為每個使用者製作政策的唯一副本。例如,考慮編寫政策允許每個使用者在 Amazon S3 儲存貯體中存取自己的物件,如之前的範例所示。但是不為明確指定使用者名稱做為資源一部分的各個使用者建立單獨的政策。反之,建立適用於群組中任何使用者的單一群組政策。

您可以使用「政策變數」執行此操作,該功能允許您在政策中指定預留位置。評估政策時,政策變數將取代為來自請求本身內容的值。

重要

您可以使用任何單一值條件索引鍵作為變數。您無法使用多重值條件金鑰做為變數。

以下範例顯示使用政策變數的 Amazon S3 儲存貯體的政策。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"] } ] }

當評估此政策時,IAM 將使用實際目前使用者的易記名稱取代變數 ${aws:username}。這表示套用至使用者群組的單一政策可以控制儲存貯體的存取。它會將使用者名稱作為資源名稱的一部分來執行此動作。

該變數使用 $ 字首標記,後跟一對大括號 ({ })。在 ${ } 字元內,您可以包含要在政策中想要使用的請求中的值的名稱。您可以使用的值將在本頁稍後討論。

注意

若要使用政策變數,必須在陳述式中包含 Version 元素,並且必須將版本設定為支援政策變數的版本。變數已導入版本 2012-10-17。舊版的政策語言不支援政策變數。如果不包含 Version 元素,並將其設定為適當的版本,則 ${aws:username} 等變數將被視為政策中的常值字串。

Version 政策元素與政策版本不同。Version 政策元素是在政策內使用,並定義政策語言的版本。另一方面,政策版本會在您在 IAM 中變更客戶受管政策時建立。變更的政策不會覆寫現有的政策。IAM 反而會建立新版本的受管政策。若要進一步了解 Version 政策元素,請參閱 IAM JSON 政策元素:Version。若要進一步了解政策版本,請參閱 版本控制 IAM 政策

您可以以類似的方式使用政策變數,以允許每個使用者管理自己的存取金鑰。允許使用者以程式設計方式變更使用者 David 的存取金鑰的政策如下所示:

{ "Version": "2012-10-17", "Statement": [{ "Action": ["iam:*AccessKey*"], "Effect": "Allow", "Resource": ["arn:aws:iam::account-id:user/David"] }] }

如果此政策連接到使用者 David,則該使用者可以變更自己的存取金鑰。與存取使用者特定的 Amazon S3 物件的政策一樣,您必須為包含使用者名稱的每個使用者建立獨立的政策。您接著會將每個政策連接到個別使用者。

透過使用政策變數,您可以建立政策如下所示:

{ "Version": "2012-10-17", "Statement": [{ "Action": ["iam:*AccessKey*"], "Effect": "Allow", "Resource": ["arn:aws:iam::account-id:user/${aws:username}"] }] }

對這樣的使用者名稱使用政策變數時,不必為每個個別使用者設定獨立的政策。反之,您可以將此新政策連接到 IAM 群組,該群組包括應該被允許管理自己的存取金鑰的每個使用者。當使用者發出修改其存取金鑰的請求時,IAM 會取代目前 ${aws:username} 變數請求中的使用者名稱並評估該政策。

做為政策變數的標籤

在某些 AWS 服務中,您可以將自己的自訂屬性連接至這些服務建立的資源。例如,您可以將標籤套用至 Amazon S3 儲存貯體或 IAM 使用者。這些標籤均為鍵值組。您定義標籤鍵名稱以及與該鍵名稱關聯的值。例如,您可以建立一個具有 department 索引鍵和 Human Resources 值的標籤。如需有關標記 IAM 實體的詳細資訊,請參閱 標記 IAM 資源。有關標記其他 AWS 服務建立之資源的資訊,請參閱該服務的文件。如需有關使用標籤編輯器的詳細資訊,請參閱 AWS Management Console 使用者指南中的使用標籤編輯器

您可以標記 IAM 資源以簡化探索、整理和追蹤您的 IAM 資源。您也可以標記 IAM 身分來控制存取資源或標記本身。若要進一步了解有關使用標籤以控制存取的詳細資訊,請參閱使用標籤控制對 IAM 使用者和角色的存取

在此您可以使用政策變數

您可以在 Resource 元素中使用政策變數,也可以在 Condition 元素中使用字串比較。

資源元素

您可以在 Resource 元素中使用政策變數,但只能在 ARN 的資源部分中使用政策變數。ARN 的這個部分會出現在第 5 個冒號 (:) 之後。您無法使用變數來取代第 5 個冒號之前的 ARN 部分,例如服務或帳戶。如需有關 ARN 格式的詳細資訊,請參閱 IAM ARN

以下政策可能連接到群組。它提供群組中的每個使用者在 Amazon S3 中對使用者特定物件 (他們自己的「主目錄」) 的完整程式設計存取。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"] } ] }
注意

此範例使用 aws:username 索引鍵,該索引鍵傳回使用者的易用名稱 (例如 "Adele" 或 "David")。在某些情況下,您可能想要使用 aws:userid 索引鍵,這是全域唯一的值。如需詳細資訊,請參閱 唯一識別碼

以下政策可能用於 IAM 群組。它讓該群組中的使用者能夠建立、使用和刪除佇列,該佇列具有其名稱和位於 us-east-2 區域。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ListForConsole", "Effect": "Allow", "Action": "sqs:ListQueues", "Resource": "*" }, { "Sid": "AllQueueActions", "Effect": "Allow", "Action": "sqs:*", "Resource": "arn:aws:sqs:us-east-2:*:${aws:username}-queue" } ] }

若要以標籤值取代 ARN 的一部分,請以 ${} 包住字首與索引鍵名稱。例如,以下 Resource 元素僅指其名稱與請求之使用者的 department 標籤值相同的儲存貯體。

"Resource": ["arn:aws:s3:::bucket/${aws:PrincipalTag/department}"]

條件元素

在涉及字串運算子或 ARN 運算子的任何條件下,您都可以將政策變數用於 Condition 值。字串運算子包括 StringEqualsStringLikeStringNotLike。ARN 運算子包括 ArnEqualsArnLike。您無法使用政策變數搭配其他運算子,例如 NumericDateBooleanBinaryIP AddressNull 運算子。如需有關條件運算子的詳細資訊,請參閱 IAM JSON 政策元素:條件運算子

下列 Amazon SNS 主題政策為 AWS 帳戶 999999999999 中的使用者提供管理 (執行所有動作) 主題的功能。但是,只有當 URL 與其 AWS 使用者名稱相符時,才會授予此許可。

{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": "999999999999" }, "Effect": "Allow", "Action": "sns:*", "Condition": { "StringLike": { "sns:endpoint": "https://example.com/${aws:username}/" }, "StringEquals": { "sns:Protocol": "https" } } } ] }

Condition 元素表達式中參照標籤時,請使用相關的字首和索引鍵名稱做為條件索引鍵。然後,使用您想在條件值中測試的值。例如,下列政策範例允許完整存取 IAM 使用者,但僅限在標籤 costCenter 連接至使用者時。此標籤也必須有一個 1234567890 的值。如果此標籤沒有值,或有任何其他值,請求將會失敗。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:*user*" ], "Resource": "*", "Condition": { "StringLike": { "iam:ResourceTag/costCenter": [ "12345", "67890" ] } } } ] }

您可以使用適用於政策變數的請求資訊

您可以使用 JSON 政策的 Condition 元素,來比較請求內容中的索引鍵和您在政策中指定的鍵值。當您使用政策變數時,AWS 會將請求內容索引鍵中的值取代為您政策中的變數。

在所有請求中可用的資訊

政策包含可用作政策變數的值的索引鍵。(在某些情況下,索引鍵不包含值 - 請參閱依照此名單的資訊)。

  • aws:CurrentTime:這可用於檢查日期和時間的條件。

  • aws:EpochTime 這是 epoch 或 Unix 時間的日期,用於日期/時間條件。

  • aws:TokenIssueTime:這是發出臨時安全憑證的日期和時間,以及可與日期/時間條件一起使用。注意:此索引鍵僅在使用暫時安全憑證簽署的請求中才會出現。如需有關臨時安全憑證檔案的詳細資訊,請參閱 IAM 中的暫時安全憑證

  • aws:PrincipalType 這個值指出主體是帳戶、使用者、聯合身分,或是擔任角色 - 請參閱稍後的說明。

  • aws:SecureTransport:這是布林值,代表是否使用 SSL 傳送請求。

  • aws:SourceIp:這是申請者的 IP 地址,用於 IP 地址條件。請參閱IP 地址條件運算子有關何時SourceIp有效和何時應使用 VPC 特定索引鍵的資訊。

  • aws:UserAgent:此值是字串,其中包含申請者的用戶端應用程式資訊。此字串是由用戶端所產生,因此可能不可靠。您只能使用來自 AWS CLI 的這個內容索引鍵。

  • aws:userid 這個值是目前使用者的唯一 ID - 請參閱下面的圖表。

  • aws:username 這是一個字串,其中包含目前使用者的易記名稱 - 請參閱圖表。

  • ec2:SourceInstanceARN 這是提出請求之 Amazon EC2 執行個體的 Amazon Resource Name (ARN)。僅當請求來自使用與 EC2 執行個體描述檔建立關聯之 IAM 角色的 Amazon EC2 執行個體時,才會顯示此索引鍵。

重要

索引鍵名稱不區分大小寫。例如,aws:CurrentTime 等同於 AWS:currenttime

主體索引鍵值

aws:usernameaws:useridaws:PrincipalType 的值取決於啟動請求之主體的類型。例如,請求可能是使用 IAM 使用者、IAM 角色或AWS 帳戶 根使用者的憑證提出。下列資料表顯示不同類型之主體的鍵值。

Principal aws:username aws:userid aws:PrincipalType
AWS 帳戶 根使用者 (不存在) AWS 帳戶 ID Account
IAM 使用者 :IAM-user-name :唯一 ID User
聯合身分使用者 (不存在) account:caller-specified-name FederatedUser
Web 聯合身分使用者 (Login with Amazon、Amazon Cognito、Facebook、Google)

有關使用 Web 聯合身分時可用的政策索引鍵的詳細資訊,請參閱 使用 Web 聯合身分識別使用者

(不存在)

role-idcaller-specified-role-name

其中 role-id角色的唯一 ID,caller-specified-role-name 由傳遞給 AssumeRoleWithWebIdentity 請求的 RoleSessionName 參數指定。

AssumedRole
SAML 聯合身分使用者

有關使用 SAML 聯合時可用的政策索引鍵的詳細資訊,請參閱 單獨辨識以 SAML 為基礎的聯合身分中的使用者

(不存在)

role-idcaller-specified-role-name

其中 role-id角色的唯一 ID,而 caller-specified-role-name 由 Attribute 元素指定,其 Name 屬性設定為 https://aws.amazon.com/SAML/attributes/RoleSessionName。

AssumedRole
擔任的角色 (不存在)

role-idcaller-specified-role-name

其中 role-id角色的唯一 ID,caller-specified-role-name 由傳遞給 AssumeRole 請求的 RoleSessionName 參數指定。

AssumedRole
指派給 Amazon EC2 執行個體的角色 (不存在)

role-id:ec2-instance-id

其中 role-id角色的唯一 ID,而 ec2-instance-id 是 EC2 執行個體的唯一識別符

AssumedRole
匿名呼叫者 (僅限 Amazon SQS、Amazon SNS 和 Amazon S3) (不存在) anonymous Anonymous

對於此表格、中的項目,請注意下列事項:

  • 「不存在」表示該值不在目前請求資訊中,並且任何符合它的嘗試都會失敗並導致陳述式無效。

  • role-id 是在建立時指派給每個角色的唯一識別符。您可以使用 AWS CLI 命令顯示角色 ID:aws iam get-role --role-name rolename

  • caller-specified-namecaller-specified-role-name 是呼叫程序 (例如,應用程式或服務) 在呼叫取得暫時憑證時所傳遞的名稱。

  • ec2-instance-id 是在啟動時指派給執行個體的值,並顯示在 Amazon EC2 主控台的 Instances (執行個體) 頁面上。您也可以執行 AWS CLI 命令來顯示執行個體 ID:aws ec2 describe-instances

聯合身分使用者在請求中可用的資訊

聯合身分使用者是使用 IAM 以外的系統進行身分驗證的使用者。例如,公司可能有一個內部使用的應用程式,可以呼叫 AWS。向使用該應用程式的每個公司使用者提供 IAM 身分可能是不切實際的。相反地,公司可能會使用具有單一 IAM 身分的代理 (中間層) 應用程式,或者公司可能使用 SAML 身分提供者 (IdP)。代理應用程式或 SAML IdP 使用公司網路對個別使用者進行身分驗證。然後,代理應用程式可以使用其 IAM 身分來取得個別使用者的臨時安全憑證。SAML IdP 可以有效交換 AWS 臨時安全憑證的身分資訊。然後,可以使用臨時憑證來存取 AWS 資源。

同樣,您可以為應用程式需要存取 AWS 資源的行動裝置建立應用程式。在這種情況下,您可以使用「Web 聯合身分」,其中應用程式使用 Login with Amazon、Amazon Cognito、Facebook 或 Google 等知名身分提供者對使用者進行身分驗證。然後,應用程式可以使用來自這些提供者的使用者身分驗證資訊來取得用來存取 AWS 資源的臨時安全憑證。

使用 Web 聯合身分的建議方法是利用 Amazon Cognito 和 AWS 行動軟體開發套件。如需詳細資訊,請參閱下列內容:

服務特定的資訊

請求還可以在其請求內容中包括服務特定的索引鍵和值。範例如下:

  • s3:prefix

  • s3:max-keys

  • s3:x-amz-acl

  • sns:Endpoint

  • sns:Protocol

如需有關可用於取得政策變數值的服務特定索引鍵的資訊,請參閱個別的服務的文件。例如,請參閱以下主題:

特殊字元

有幾個特殊的預先定義的政策變數具有固定值,使您能夠表示具有特殊含意的字元。如果這些特殊字元是字串的一部分,那麼您正在嘗試比對,並且從字面上插入它們會被轉譯。例如,在字串中插入 * 星號將被轉譯為萬用字元,比對任何字元,而不是做為文字 *。在這些情況下,您可以使用以下預定義的政策變數:

  • ${*} - 在需要 * 星號字元的地方使用。

  • ${?} - 在需要 ? 問號字元的地方使用。

  • ${$} - 在需要 $ 貨幣符號字元的地方使用。

這些預先定義的政策變數可以在可以使用一般政策變數的任何字串中使用。

指定預設值

如果 AWS 無法解析變數,這可能會導致整個陳述式無效。但是,將變數新增至政策時,您可以指定變數的預設值。如果沒有為變數 AWS 指定值,則使用您提供的預設文字。

若要將預設值新增到一個變數,請以單引號 (' ') 括住預設值,並使用逗號和空格 (, ) 分隔變數文字和預設值。

例如,如果主體標記為 team=yellow,他們可以存取名為 DOC-EXAMPLE-BUCKET-yellowExampleCorp's Amazon S3 儲存貯體。具有此資源的政策可讓團隊成員存取其團隊儲存貯體,但不能存取其他團隊的儲存貯體。對於沒有團隊標籤的使用者,它會將 company-wide 的預設值設定為儲存貯體名稱。這些使用者只能存取 DOC-EXAMPLE-BUCKET-company-wide 儲存貯體,其中他們可以檢視廣泛的資訊,例如加入團隊的指示。

"Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET-${aws:PrincipalTag/team, 'company-wide'}"

如需詳細資訊

如需有關政策的詳細資訊,請參閱以下項目: