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

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

AWS 政策元素: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: aw:iam::: 帳戶 ID: 根),也可以使用由前綴後跟帳戶 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。發生這種情況時,主體識別碼會顯示在 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 元素中指定擔任角色工作階段時,您無法使用萬用字元 (*) 來表示所有工作階段。主體一律必須命名特定工作階段。

OIDC 工作階段主體

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

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

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

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

SAML 工作階段主體

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

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

在您的政策中使用此主體類型,可根據信任的 SAML 身分提供者允許或拒絕存取。若要在角色信任政策的 Principal 元素中指定 SAML 身分角色工作階段 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。發生這種情況時,主體識別碼會顯示在 AWS 以資源為基礎的策略中,因為無法再將其對應回有效的 ARN。結果是,如果您刪除並重新建立了信任政策的 Principal 元素所引用的使用者,您必須編輯角色來以正確 ARN 替換不正確的主體 ID。當您儲存政策時,IAM 再次將 ARN 轉換為使用者的新主體 ID。

IAM Identity Center 主體

在 IAM Identity Center 中,資源型政策中的主體必須定義為 AWS 帳戶 主體。若要指定存取權,請參照條件區塊中許可集合的角色 ARN。如需詳細資訊,請參閱《IAM Identity Center 使用者指南》中的資源政策、Amazon EKS 和 AWS KMS中的參考許可集合

AWS STS 同盟使用者工作階段主體

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

重要

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

AWS STS 同盟使用者工作階段主參與者是使用作業所產生的工 AWS STS GetFederationToken作階段主參與者。在此情況中, AWS STS 使用聯合身分作為獲取暫時存取字符的方法,而不是使用 IAM 角色。

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

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

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

當 IAM 使用者或 root 使用者要求 AWS STS 使用此作業的臨時登入資料時,他們會開始臨時的聯合身分識別使用者工作階段。此工作階段的 ARN 是以聯合的原始身分為基礎。

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

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

AWS 服務主體

您可以在以資源為基礎的策略的Principal項目或支援主體的條件索引鍵中指定 AWS 服務。服務主體是服務的識別碼。

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

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

service-name.amazonaws.com

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

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

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

AWS 選擇加入區域中的服務主體

您可以在多個 AWS 區域啟動資源,以及您必須選擇加入的部分地區。如需您必須選擇加入的區域的完整清單,請參閱AWS 一般參考指南中的管理 AWS 區域

當選擇加入區域中的 AWS 服務在相同區域內提出要求時,服務主體名稱格式會識別為其服務主要名稱的非區域化版本:

service-name.amazonaws.com

當選擇加入區域中的 AWS 服務向另一個區域發出跨區域要求時,服務主體名稱格式會識別為其服務主要名稱的區域化版本:

service-name.{region}.amazonaws.com

例如,您有一個位於區域 ap-southeast-1 中的 Amazon SNS 主題,而 Amazon S3 儲存貯體位於選擇加入區域 ap-east-1。您想要設定 S3 儲存貯體通知,將訊息發佈到 SNS 主題。若要允許 S3 服務將訊息張貼到 SNS 主題,您必須透過該主題以資源為基礎的存取政策授與 S3 服務主體 sns:Publish 權限。

如果您指定 S3 服務主體的非區域化版本 s3.amazonaws.com,則在存取政策主題中,從儲存貯體到主題的 sns:Publish 要求將會失敗。下列範例會在 SNS 主題存取政策的 Principal 政策元素中指定非區域化 S3 服務主體。

"Principal": { "Service": "s3.amazonaws.com" }

由於儲存貯體位於選擇加入的區域,而且要求是在同一個區域之外發出,因此 S3 服務主體會顯示為區域化服務主體名稱 s3.ap-east-1.amazonaws.com。當選擇加入區域中的服務向另一個區域提出要求時,您必須使用區域化 AWS 服務主要名稱。指定區域化服務主體名稱後,如果儲存貯體向位於另一個區域的 SNS 主題發出 sns:Publish 要求,則該要求將會成功。下列範例會在 SNS 主題存取政策的 Principal 政策元素中指定區域化 S3 服務主體。

"Principal": { "Service": "s3.ap-east-1.amazonaws.com" }

只有在您指定區域化服務主體名稱時,從選擇加入區域至另一個區域的跨區域要求的資源政策或服務主體型允許清單才會成功。

注意

對於 IAM 角色信任政策,建議使用非區域化服務主體名稱。IAM 資源是全球性的,因此可以在任何區域中使用相同的角色。

所有主體

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

重要

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

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

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

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

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

以下範例顯示可用於明確拒絕所有主體的資源型政策 (而不是 使用 Deny 來指定 NotPrincipal),但在 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" } } } ] }

其他資訊

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