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 services

  • 所有主體

您無法將使用者群組識別為原則中的主參與者 (例如以資源為基礎的策略),因為群組與權限相關,而非驗證,而主參與者則是已IAM驗證的實體。

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

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

您不能使用萬用字元來比對主參與者名稱的一部分或ARN。

AWS 帳戶 principals

您可以指定 AWS 帳戶 以資源為基礎的策略Principal元素或支援主體的條件索引鍵中的識別碼。這會委派帳戶的授權。當您允許存取不同帳戶時,該帳戶中的系統管理員必須接著授與該帳戶中身分識別 (IAM使用者或角色) 的存取權。當您指定 AWS 帳戶,您可以使用該帳戶ARN(ARN:aw:iam::account-ID:root),或由"AWS":前綴後跟帳號 ID 組成的縮短形式。

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

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

帳戶ARN和縮短的帳戶 ID 的行為方式相同。兩者都會委派帳戶的許可。在Principal元素ARN中使用帳號並不會將權限限制為只有帳號的 root 使用者。

注意

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

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

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

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

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

IAM角色主參與者

您可以ARNs在以資源為基礎的策略的Principal元素或支援主參與者的條件索引鍵中指定IAM角色主體。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如果有人希望藉由刪除並重新建立角色來提升特權,這麼做可有助於減輕此類風險。您通常不會在主控台中看到此識別碼,因為顯示信任原則ARN時會IAM使用反向轉換回角色。不過,如果您刪除角色,則關係會中斷。即使重新建立角色,您的政策都不再適用,因為新角色有不符合信任政策中所儲存的主體 ID 的新主體 ID。發生這種情況時,主體識別碼會出現在以資源為基礎的原則中 AWS 無法再將其映射回有效ARN。最終結果是,如果您刪除並重新建立信任原則Principal元素中參照的角色,則必須編輯原則中的角色,以正確的主參與者識別碼取代主參與者 ID ARN。當您儲存原則時,再ARN次轉換為角色的新主參與者識別碼。

或者,您可以指定角色主體作為資源型政策中的主體,或使用 aws:PrincipalArn 條件金鑰建立廣泛許可政策。當您使用此機碼時,會根據假設的角色 (而不是產生的工作階段) 來授與角色工作階段主體權限。ARN ARN因為 AWS 不會將條件索引鍵ARNs轉換為IDs,如果您刪除角色,然後建立具有相同名稱的新角色,則授予該角色的權限會ARN持續存在。在資源型政策的 Principal 元素中,使用 aws:PrincipalArn 條件金鑰及萬用字元 (*) 授予的許可,不受身分型政策類型 (例如許可界限或工作階段政策) 的限制,除非身分型政策包含明確拒絕。

角色工作階段主體

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

您用於角色工作階段主參與者的格式取決於 AWS STS 用來承擔角色的作業。

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

擔任角色工作階段主體

假定角色工作階段作業主參與者是使用 AWS STS AssumeRole操作。如需哪些主體可以使用此操作擔任角色的詳細資訊,請參閱 比較 AWS STS 認證

若要ARN在Principal元素中指定假設的角色工作階段,請使用下列格式:

"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 認證

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

在您的政策中使用此主體類型,可根據信任的 Web 身分提供者允許或拒絕存取。若要在OIDC角色信任原則的Principal元素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 認證

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

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

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

IAM使用者主體

您可以在以資源為基礎的策略的Principal元素或支援主參與IAM者的條件索引鍵中指定使用者。

注意

Principal元素中,Amazon 資源名稱 (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使用者的元素,則在您儲存原則時,將其IAM轉換為使用者的唯一主參與者 ID。ARN ARN如果有人希望藉由刪除並重新建立使用者來提升特權,這麼做可有助於減輕此類風險。您通常不會在主控台中看到這個識別碼,因為顯示信任原則ARN時也會反向轉換回使用者的 ID。不過,如果您刪除使用者,則關係會中斷。即使重新建立使用者,政策都不再適用。這是因為新的使用者有新的主體 ID,其不符合儲存在信任政策中的 ID。發生這種情況時,主體識別碼會出現在以資源為基礎的原則中 AWS 無法再將其映射回有效ARN。結果是,如果您刪除並重新建立信任原則Principal元素中參照的使用者,您必須編輯角色,將現在不正確的主參與者 ID 取代為正確的主參與者 ID ARN。IAM當您儲存原則時,再次ARN轉換為使用者的新主參與者識別碼。

IAM身分識別中心主體

在IAM身分識別中心中,以資源為基礎的原則中的主體必須定義為 AWS 帳戶 校長。若要指定存取權,請參考條件區塊中權限集ARN的角色。如需詳細資訊,請參閱參考資源政策 Amazon EKS 和中的權限集。 AWS KMSIAM身分識別中心使用者指南中。

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

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

重要

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

一個 AWS STS 同盟使用者工作階段主參與者是使用 AWS STS GetFederationToken操作。在這種情況下, AWS STS 使用身份聯合作為獲取臨時訪問令牌而不是使用IAM角色的方法。

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

  • IAM同盟使用者 — 使用作業建IAM立聯合身分的使用者工GetFederationToken作階段主參與者聯合會。IAM

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

當IAM使用者或 root 使用者要求臨時登入資料時 AWS STS 使用此操作,他們開始一個臨時的同盟用戶會話。此工作階段ARN是根據已聯合的原始身分識別。

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

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

AWS 服務主體

您可以指定 AWS 以資源為基礎的策略Principal元素或支援主體的條件金鑰中的服務。服務主體是服務的識別碼。

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

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

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

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

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

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

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

注意

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

所有主體

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

重要

強烈建議您不要在資源型政策的 Principal 中搭配使用萬用字元 (*) 與 Allow 效果,除非您打算授予公開或匿名存取。否則,請指定預定的主參與者、服務或 AWS Principal元素中的帳戶,然後進一步限制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:::amzn-s3-demo-bucket/*", "arn:aws:s3:::amzn-s3-demo-bucket" ], "Condition": { "ArnNotEquals": { "aws:PrincipalArn": "arn:aws:iam::444455556666:user/user-name" } } } ] }

其他資訊

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