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

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

IAM 政策元素:變數與標籤

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

注意

如果 AWS 無法解析變數,這可能會導致整個陳述式無效。例如,如果您使用 aws:TokenIssueTime變數,則只有在請求者使用臨時憑證 (IAM角色) 進行身分驗證時,該變數才會解析為 值。若要防止變數導致無效的陳述式,請使用 ...IfExists 條件運算子。

簡介

在IAM政策中,許多動作可讓您為要控制存取的特定資源提供名稱。例如,下列政策可讓使用者為 marketing 專案列出、讀取和寫入 S3 儲存貯體 amzn-s3-demo-bucket 中的物件。

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

在某些情況下,您在編寫政策時可能不知道資源的確切名稱。您可能想要一般化政策,以使其適用於許多使用者,而不必為每個使用者製作政策的唯一副本。建議您建立適用於該群組中任何使用者的單一群組政策,而不是為每個使用者建立單獨政策。

在政策中使用變數

您可以使用在政策中設定預留位置的政策變數來定義政策內的動態值。

變數使用 $ 字首後接一對大括號 ({ }) 進行標記,其中包含請求中的值的變數名稱。

評估政策時,政策變數將取代為來自請求中傳遞的條件式內容金鑰的值。變數可用於身分型政策、資源政策、服務控制政策、工作階段政策 VPC端點政策 。用作許可界限的以身分為基礎的政策也支援政策變數。

全域條件內容索引鍵可以用作跨 AWS 服務請求中的變數。與 AWS 資源互動時,服務特定條件索引鍵也可以用作變數,但只有在針對支援其資源提出請求時才可用。如需每個 AWS 服務和資源可用的內容索引鍵清單,請參閱服務授權參考。在某些情況下,您無法使用值填入全域條件內容索引鍵。若要進一步了解每個索引鍵,請參閱 AWS 全域條件內容索引鍵

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

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

下列範例顯示IAM角色或使用者的政策,以政策變數取代特定資源名稱。您可以利用 aws:PrincipalTag 條件索引鍵來重複使用此政策。此政策被評估時,僅在儲存貯體名稱以 team 主體標籤中的團隊名稱作為結尾時,${aws:PrincipalTag/team} 才會允許該動作。

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

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

如需有關此全域條件索引鍵的詳細資訊,請參閱全域條件金鑰清單中的 aws:PrincipalTag/tag-key

注意

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

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

允許主體從 S3 儲存貯體的 /David 路徑取得物件之政策如下所示:

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3::amzn-s3-demo-bucket/David/*"] }] }

如果此政策附加至使用者 David,該使用者會從其自己的 S3 儲存貯體取得物件,但您必須為包含使用者名稱的每個使用者建立獨立政策。您接著會將每個政策連接到個別使用者。

透過使用政策變數,您可以建立可重複使用的政策。如果 aws:PrincipalTag 的標籤鍵值與請求中傳遞的標籤鍵 owner 值相符,下列政策將允許使用者從 Amazon S3 儲存貯體取得物件。

{ "Version": "2012-10-17", "Statement": [{ "Sid": "AllowUnlessOwnedBySomeoneElse", "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": ["*"], "Condition": { "StringEquals": { "s3:ExistingObjectTag/owner": "${aws:PrincipalTag/owner}" } } } ] }

像這樣使用政策變數來替代使用者時,您不必為每個單獨使用者設定獨立的政策。在下列範例中,政策會連接至 Product Manager 使用臨時安全憑證擔任IAM的角色。當使用者提出新增 Amazon S3 物件的請求時, 會從${aws:PrincipalTag}變數的目前請求中IAM取代dept標籤值,並評估政策。

{ "Version": "2012-10-17", "Statement": [{ "Sid": "AllowOnlyDeptS3Prefix", "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket/${aws:PrincipalTag/dept}/*"], } ] }

做為政策變數的標籤

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

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

在此您可以使用政策變數

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

資源元素

您可以在 Resource元素中使用政策變數,但僅限於 的資源部分ARN。的此部分ARN會出現在第五個冒號 (:) 之後。您不能使用變數取代第五個冒號ARN之前的 部分,例如服務或帳戶。如需 ARN 格式的詳細資訊,請參閱 IAM ARNs

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

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

許多 AWS 資源使用ARNs包含使用者建立的名稱。下列IAM政策可確保只有具有相符的存取專案、存取應用程式和存取環境標籤值的預期使用者才能修改其資源。此外,使用 * 萬用字元比對時,它們能允許自訂資源名稱尾碼。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessBasedOnArnMatching", "Effect": "Allow", "Action": [ "sns:CreateTopic", "sns:DeleteTopic"], "Resource": ["arn:aws:sns:*:*:${aws:PrincipalTag/access-project}-${aws:PrincipalTag/access-application}-${aws:PrincipalTag/access-environment}-*" ] } ] }

條件元素

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

Condition 元素表達式中參照標籤時,請使用相關的字首和索引鍵名稱做為條件金鑰。然後,使用您想在條件值中測試的值。

例如,下列政策範例允許完整存取使用者,但僅限在標籤 costCenter 連接至使用者時。此標籤也必須有一個 1234567890 的值。如果此標籤沒有值,或有任何其他值,請求將會失敗。

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

沒有值的政策變數

當政策變數參考的條件內容索引鍵沒有值或不存在於請求授權內容中時,該值實際上是空值。沒有相等或類似的值。在以下情況下,授權內容中可能不存在條件內容索引鍵:

  • 您正在對不支援該條件索引鍵的資源請求中使用服務特定條件內容索引鍵。

  • IAM 主體、工作階段、資源或請求上的標籤不存在。

  • AWS 全域條件內容索引鍵 中列出了每個全域條件內容金鑰的其他情況。

當您使用在IAM政策條件元素中沒有值的變數時,IAM JSON政策元素:條件運算子例如 StringEqualsStringLike 不相符,且政策陳述式不會生效。

反向條件運算子 (例如 StringNotEqualsStringNotLike) 確實與空值匹配,因為其正在測試的條件索引鍵的值不等於或不類似於有效空值。

在下列範例中,aws:principaltag/Team 必須等於 s3:ExistingObjectTag/Team 才能允許存取。未設定 aws:principaltag/Team 時,系統會明確拒絕存取。如果在授權內容中沒有值的變數用作政策的 ResourceNotResource 元素的一部分,則包含沒有值之政策變數的資源將不會與任何資源相匹配。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition": { "StringNotEquals": { "s3:ExistingObjectTag/Team": "${aws:PrincipalTag/Team}" } } } ] }

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

您可以使用JSON政策的 Condition元素,將請求內容中的金鑰與您在政策中指定的金鑰值進行比較。當您使用政策變數時, 從請求內容索引鍵 AWS 取代 值,以取代政策中的變數。

主體索引鍵值

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
OIDC 聯合身分使用者

有關使用 Web 聯合身分時可用的政策索引鍵的詳細資訊,請參閱 聯合的 AWS OIDC可用金鑰

(不存在)

role-id:caller-specified-role-name

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

AssumedRole
SAML 聯合身分使用者

如需使用SAML聯合時可用政策金鑰的相關資訊,請參閱 以唯一方式識別以聯盟SAML為基礎

(不存在)

role-id:caller-specified-role-name

其中 role-id是角色的唯一 ID, caller-specified-role-name而 是由 屬性元素指定,名稱屬性設定為 https://aws.amazon.com/SAML/屬性/RoleSessionName。 唯一識別碼

AssumedRole
擔任的角色 (不存在)

role-id:caller-specified-role-name

其中 role-id是角色的唯一 ID, caller-specified-role-name而 是由傳遞給 AssumeRole 請求的 RoleSessionName 參數指定。 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids

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

role-id:ec2-instance-id

其中 role-id是角色的唯一 ID,而 ec2-instance-id 是EC2執行個體 的唯一識別符https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids

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

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

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

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

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

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

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

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

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

使用OIDC聯合的建議方法是利用 Amazon Cognito 和 AWS 行動裝置 SDKs。如需詳細資訊,請參閱下列內容:

特殊字元

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

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

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

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

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

指定預設值

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

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

"Resource":"arn:aws:s3:::amzn-s3-demo-bucket-${aws:PrincipalTag/team, 'company-wide'}"

如需詳細資訊

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