AWS JSON 政策元素:Principal - AWS Identity and Access Management

AWS JSON 政策元素:Principal

使用資源型 JSON 政策中的 Principal 元素來指定允許或拒絕存取資源的主體。

您可以在資源型政策中使用 Principal 元素。許多服務支援資源型政策,包括 IAM。IAM 資源型政策類型是角色信任政策。在 IAM 角色中,使用角色信任政策中的 Principal 元素來指定誰可擔任該角色。對於跨帳戶存取,您必須指定信任帳戶的 12 位數識別碼。若要了解在您信任區域 (受信任組織或帳戶) 外帳戶中的主體是否具有擔任您角色的許可,請參閱什麼是 IAM Access Analyzer?

注意

在您建立角色後,您可以變更帳戶為「*」,以允許每個人擔任該角色。若執行此操作,我們強烈建議您限制誰可以透過其他方式存取角色,例如 Condition 元素會限制只能存取特定 IP 地址。切勿讓任何人都能存取您的角色!

支援資源型政策的其他資源範例包括 Amazon S3 儲存貯體或 AWS KMS key。

您不能使用身分型政策中的 Principal 元素。身分型政策是指您連接到 IAM 身分 (使用者、群組或角色) 的許可政策。在這些情況中,主體由政策連接的身分隱含識別。

指定主體

您可以在資源型政策的 Principal 元素中指定主體,或在支援主體的條件索引鍵中指定。

您可以在政策中指定以下任何主體:

  • AWS 帳戶和根使用者

  • IAM 角色

  • 角色工作階段

  • IAM 使用者

  • 聯合身分使用者工作階段

  • AWS 服務

  • 所有主體

您無法將使用者群組識別為政策 (例如資源型政策) 中的主體,因為群組與許可 (而非驗證) 相關,並且主體是經過驗證的 IAM 實體。

您可以使用陣列在以下幾節中為每個主體類型指定一個以上的主體類型。陣列可以使用一個或多個值。當您在元素中指定多個主體時,便會授予每個主體許可。這是邏輯 OR,而不是邏輯 AND,因為您一次只會驗證為一位主體。如果包含多個值,請使用方括號 ([]),並以逗號分隔陣列的每個項目。下列範例政策會定義 123456789012 帳戶或 555555555555 帳戶的許可。

"Principal" : { "AWS": [ "123456789012", "555555555555" ] }
注意

您不能使用萬用字元來比對部分主體名稱或 ARN。

AWS 帳戶主體

您可在資源型政策的 Principal 元素中指定 AWS 帳戶識別碼,或在支援主體的條件索引鍵中指定。這會委派帳戶的授權。當您允許存取其他帳戶時,該帳戶中的管理員必須接著授予該帳戶中身分 (IAM 使用者或角色) 的存取權。當您指定 AWS 帳戶時,可以使用帳戶 ARN (arn:aws:iam::account-ID:root),或是包含後接帳戶 ID 之 "AWS": 字首的簡化形式。

例如,指定帳戶 ID 123456789012,您就可以使用以下其中一種方法來指定 Principal 元素中的帳戶:

"Principal": { "AWS": "arn:aws:iam::123456789012:root" }
"Principal": { "AWS": "123456789012" }

帳戶 ARN 和簡化帳戶 ID 的行為方式相同。兩者都會委派帳戶的許可。使用 Principal 元素中的帳戶 ARN 不會將許可限制為帳戶的根使用者。

注意

當您儲存包含簡化帳戶 ID 的資源型政策時,服務可能會將其轉換為主體 ARN。如此並不會變更政策的功能。

有些 AWS 服務支援指定帳戶主體的其他選項。例如,Amazon S3 可讓您使用以下格式指定正式使用者 ID

"Principal": { "CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be" }

您也可以使用陣列指定多個 AWS 帳戶 (或正式使用者 ID) 作為主體。例如,您可以使用全部三種方法在儲存貯體政策中指定主體。

"Principal": { "AWS": [ "arn:aws:iam::123456789012:root", "999999999999" ], "CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be" }

IAM 角色主體

您可以在資源型政策的 Principal 元素中指定 IAM 角色主體 ARN,或在支援主體的條件索引鍵中指定。IAM 角色是身分。在 IAM 中,身分是您可以指派許可的資源。角色信任另一個已驗證的身分來擔任該角色。這包括 AWS 中的主體或來自外部身分提供者 (IdP) 的使用者。當主體或身分擔任角色時,他們會收到具有擔任角色許可的暫時安全憑證。當他們使用這些工作階段憑證來執行 AWS 中的操作時,則會成為角色工作階段主體

IAM 角色是存在於 IAM 中的身分。角色信任另一個已驗證的身分,例如 AWS 中的主體或來自外部身分提供者的使用者。當主體或身分擔任角色時,它們會接收暫時安全憑證。然後,他們可以使用這些憑證,作為角色工作階段主體執行 AWS 中的操作。

當您在資源型政策中指定角色主體時,主體的有效許可會受限於限制角色許可的任何政策類型。其中包括工作階段政策和許可界限。如需有關如何評估角色工作階段的有效許可的詳細資訊,請參閱 政策評估邏輯

若要在 Principal 元素中指定角色 ARN,請使用以下格式:

"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:role/role-name" }
重要

如果角色信任政策中您的 Principal 元素包含指向特定 IAM 角色的 ARN,則該 ARN 會在儲存政策時轉換為角色的唯一主體 ID。如果有人希望藉由刪除並重新建立角色來提升特權,這麼做可有助於減輕此類風險。您通常不會在主控台中看到此 ID,因為在顯示信任政策時,IAM 會反向轉換回角色 ARN。不過,如果您刪除角色,則關係會中斷。即使重新建立角色,您的政策都不再適用,因為新角色有不符合信任政策中所儲存的主體 ID 的新主體 ID。發生這種情況時,主體 ID 會出現在資源型政策中,因為 AWS 不能再將它對應回有效的 ARN。結果是,如果您刪除並重新建立了信任政策的 Principal 元素所引用的角色,您必須編輯角色來以正確 ARN 替換不正確的主體 ID。當您儲存政策時,ARN 再次轉換為角色的新主體 ID。

或者,您可以指定角色主體作為資源型政策中的主體,或使用 aws:PrincipalArn 條件索引鍵建立廣泛許可政策。當您使用此索引鍵時,角色工作階段主體會根據擔任的角色 ARN 授予許可,而不是根據所產生之工作階段的 ARN 授予許可。由於 AWS 不會將條件索引鍵 ARN 轉換為 ID,如果您刪除該角色,然後建立具有相同名稱的新角色,則授予角色 ARN 的許可會持續存在。在資源型政策的 Principal 元素中,使用 aws:PrincipalArn 條件索引鍵及萬用字元 (*) 授予的許可,不受身分型政策類型的限制 (例如許可界限或工作階段政策)。所有這類政策中的明確拒絕都會覆寫該允許。

角色工作階段主體

您可以在資源型政策的 Principal 元素中指定角色工作階段,或在支援主體的條件索引鍵中指定。當主體或身分擔任角色時,他們會收到具有擔任角色許可的暫時安全憑證。當他們使用這些工作階段憑證來執行 AWS 中的操作時,則會成為角色工作階段主體

角色工作階段主體所使用的格式取決於用來擔任該角色的 AWS STS 操作。

此外,系統管理員可以設計程序來控制如何發出角色工作階段。例如,他們可以為使用者提供一鍵式解決方案,以建立可預測的工作階段名稱。如果您的系統管理員執行這項操作,則可以在政策或條件索引鍵中使用角色工作階段主體。否則,您可以在 aws:PrincipalArn 條件索引鍵中將角色 ARN 指定為主體。將角色指定為主體的方式可以變更產生工作階段的有效許可。如需詳細資訊,請參閱 IAM 角色主體

擔任角色工作階段主體

擔任角色工作階段主體是使用 AWS STS AssumeRole 操作得到的工作階段主體。如需哪些主體可以使用此操作擔任角色的詳細資訊,請參閱 AWS STS API 操作的比較

若要在 Principal 元素中指定擔任角色工作階段 ARN,請使用以下格式:

"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name" }

當您在 Principal 元素中指定擔任角色工作階段時,您無法使用萬用字元 (*) 來表示所有工作階段。主體一律必須命名特定工作階段。

Web 身分工作階段主體

Web 身分工作階段主體是使用 AWS STS AssumeRoleWithWebIdentity 操作得到的工作階段主體。您可以使用外部 Web 身分提供者 (IdP) 登入,然後使用此操作擔任 IAM 角色。這會利用聯合身分,並發出角色工作階段。如需哪些主體可以使用此操作擔任角色的詳細資訊,請參閱 AWS STS API 操作的比較

從 Web 身分提供者發出角色時,您會取得此特殊類型的工作階段主體,其中包含 Web 身分提供者的相關資訊。

在您的政策中使用此主體類型,可根據信任的 Web 身分提供者允許或拒絕存取。若要在角色信任政策的 Principal 元素中指定 Web 身分角色工作階段 ARN,請使用下列格式:

"Principal": { "Federated": "cognito-identity.amazonaws.com" }
"Principal": { "Federated": "www.amazon.com" }
"Principal": { "Federated": "graph.facebook.com" }
"Principal": { "Federated": "accounts.google.com" }

SAML 工作階段主體

SAML 工作階段主體是使用 AWS STS AssumeRoleWithSAML 操作得到的工作階段主體。您可以使用外部 SAML 身分提供者 (IdP) 登入,然後使用此操作擔任 IAM 角色。這會利用聯合身分,並發出角色工作階段。如需哪些主體可以使用此操作擔任角色的詳細資訊,請參閱 AWS STS API 操作的比較

當您從 SAML 身分提供者發出角色時,會取得此特殊類型的工作階段主體,其中包含 SAML 身分提供者的相關資訊。

在您的政策中使用此主體類型,可根據信任的 SAML 身分提供者允許或拒絕存取。若要在角色信任政策的 Principal 元素中指定 Web 身分角色工作階段 ARN,請使用下列格式:

"Principal": { "Federated": "arn:aws:iam::AWS-account-ID:saml-provider/provider-name" }

IAM 使用者主體

您可以在資源型政策的 Principal 元素中指定 IAM 使用者,或在支援主體的條件索引鍵中指定。

注意

Principal 元素中,Amazon Resource Name (ARN) 的使用者名稱部分區分大小寫。

"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:user/user-name" }
"Principal": { "AWS": [ "arn:aws:iam::AWS-account-ID:user/user-name-1", "arn:aws:iam::AWS-account-ID:user/user-name-2" ] }

當您在 Principal 元素中指定使用者時,您無法使用萬用字元 (*) 來表示「所有使用者」。主體必須一律指定特定的使用者。

重要

如果角色信任政策中您的 Principal 元素包含指向特定 IAM 使用者的 ARN,則該 ARN 會在儲存政策時將 ARN 轉換為使用者的唯一主體 ID。如果有人希望藉由刪除並重新建立使用者來提升特權,這麼做可有助於減輕此類風險。您通常不會在主控台中看到此 ID,因為在顯示信任政策時還會反向轉換回使用者的 ARN。不過,如果您刪除使用者,則關係會中斷。即使重新建立使用者,政策都不再適用。這是因為新的使用者有新的主體 ID,其不符合儲存在信任政策中的 ID。發生這種情況時,主體 ID 會出現在資源型政策中,因為 AWS 不能再將它對應回有效的 ARN。結果是,如果您刪除並重新建立了信任政策的 Principal 元素所引用的使用者,您必須編輯角色來以正確 ARN 替換不正確的主體 ID。當您儲存政策時,IAM 再次將 ARN 轉換為使用者的新主體 ID。

AWS STS 聯合身分使用者工作階段主體

您可以在資源型政策的 Principal 元素中指定聯合身分使用者工作階段,或在支援主體的條件索引鍵中指定。

重要

AWS 建議僅在必要時使用 AWS STS 聯合身分使用者工作階段,例如需要根使用者存取權時。反之,使用角色以委派許可

AWS STS聯合身分使用者工作階段主體是使用 AWS STS GetFederationToken 操作得到的工作階段主體。在此情況中,AWS STS 使用聯合身分作為獲取暫時存取字符的方法,而不是使用 IAM 角色。

在 AWS 中,IAM 使用者或 AWS 帳戶 根使用者可以使用長期存取金鑰進行驗證。如需哪些主體可以使用此操作聯合身分的詳細資訊,請參閱 AWS STS API 操作的比較

  • IAM 聯合身分使用者 – IAM 使用者使用 GetFederationToken 操作聯合,該操作會產生 IAM 使用者的聯合身分使用者工作階段主體。

  • 聯合身分根使用者 – 根使用者使用 GetFederationToken 操作聯合,該操作會產生根使用者的聯合身分使用者工作階段主體。

當 IAM 使用者或根使用者使用此操作從 AWS STS 要求暫時憑證時,它們會開始暫時聯合身分使用者工作階段。此工作階段的 ARN 是以聯合的原始身分為基礎。

若要在 Principal 元素中指定聯合身分使用者工作階段 ARN,請使用以下格式:

"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:federated-user/user-name" }

AWS 服務主體

您可在資源型政策的 Principal 元素中指定 AWS 服務,或在支援主體的條件索引鍵中指定。服務主體是服務的識別碼。

可由 AWS 服務擔任的 IAM 角色稱為服務角色。服務角色必須包含信任政策。信任政策是連接到角色的資源型政策,這些政策定義可擔任該角色的主體。有些服務角色具有已預先定義的信任政策。不過,在某些情況下,您必須在信任政策中指定服務主體。

服務主體的識別碼包含服務名稱,而且通常採用以下格式:

service-name.amazonaws.com

服務主體是由服務定義。您可以藉由開啟 可搭配 IAM 運作的 AWS 服務,尋找某些服務的服務主體,檢查 Service-linked role (服務連結角色) 資料欄中是否為 Yes (是),並開啟 Yes (是) 連結,以檢視該服務的服務連結角色文件。尋找該服務的 Service-Linked Role Permissions (服務連結角色許可) 區段,以檢視服務主體。

以下範例顯示一個可以連接到服務角色的政策。政策啟用兩種服務,分別為 Amazon ECS 和 Elastic Load Balancing,來擔任角色。然後服務可以執行指派給角色的許可政策所授予的任何任務 (不顯示)。若要指定多個服務主體,不用指定兩個 Service 元素;您可以只使用一個該元素。實際上,您可以將一組多個服務主體作為單一 Service 元素的值。

"Principal": { "Service": [ "ecs.amazonaws.com", "elasticloadbalancing.amazonaws.com" ] }

所有主體

可使用萬用字元 (*) 在資源型政策的 Principal 元素中或支援主體的條件索引鍵中指定所有主體。資源型政策 授予許可和條件索引鍵用於限制政策陳述式的條件。

重要

強烈建議您不要在資源型政策的 Principal 中搭配使用萬用字元 (*) 與 Allow 效果,除非您打算授予公開或匿名存取。否則,請指定預定的主體、服務或 Principal 元素中的 AWS 帳戶,然後進一步限制 Condition 元素中的存取。IAM 角色信任政策尤其如此,因為它們允許其他主體成為您帳戶中的主體。

對於資源型政策,搭配使用萬用字元 (*) 與 Allow 效果可授權存取所有使用者,包括匿名使用者 (公開存取)。對於您帳戶中的 IAM 使用者和角色主體,不需要其他許可。對於其他帳戶中的主體,他們也必須在其帳戶中具有身分型許可,以允許他們存取您的資源。這稱為跨帳戶存取

對於匿名使用者,下列元素相同:

"Principal": "*"
"Principal" : { "AWS" : "*" }

您不能使用萬用字元來比對部分主體名稱或 ARN。

以下範例顯示可用於明確拒絕所有主體的資源型政策 (而不是 NotPrincipal 搭配 Deny),但在 Condition 元素中指定的主體除外

{ "Version": "2012-10-17", "Statement": [ { "Sid": "UsePrincipalArnInsteadOfNotPrincipalWithDeny", "Effect": "Deny", "Action": "s3:*", "Principal": "*", "Resource": [ "arn:aws:s3:::BUCKETNAME/*", "arn:aws:s3:::BUCKETNAME" ], "Condition": { "ArnNotEquals": { "aws:PrincipalArn": "arn:aws:iam::444455556666:user/user-name" } } } ] }

其他資訊

如需詳細資訊,請參閱下列內容: