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

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

AWS JSON 政策元素: NotPrincipal

NotPrincipal 元素使用 "Effect":"Deny"來拒絕存取除 NotPrincipal 元素中指定的主體以外的所有主體。委託人可以是 IAM 使用者、聯合身分使用者、IAM 角色、擔任的角色工作階段 AWS 帳戶、 AWS 服務或其他委託人類型。如需主體的詳細資訊,請參閱 AWS JSON 政策元素: Principal

NotPrincipal 必須與 "Effect":"Deny" 搭配使用。不支援將其與 "Effect":"Allow" 搭配使用。

重要

我們不建議將 NotPrincipal用於新的資源型政策,作為安全和授權策略的一部分。使用 NotPrincipal 時,會難以疑難排解多個政策類型的影響。我們建議改為將 aws:PrincipalArn 內容索引鍵與 ARN 條件運算子搭配使用。

重點

  • 某些 AWS 服務的資源型政策支援 NotPrincipal元素,包括 VPC 端點。資源型政策是您直接內嵌在資源中的政策。您無法在以 IAM 身分為基礎的政策或 IAM 角色信任政策中使用 NotPrincipal 元素。

  • 對於已附加許可界限政策的 IAM 使用者或角色,請勿使用所含 NotPrincipal 政策元素具有 Deny 效果的資源型政策陳述式。無論在 NotPrincipal 元素中指定何值,具有 Deny 效果的 NotPrincipal 元素將始終拒絕任何已附加許可界限政策的 IAM 主體。這會造成部分本可存取資源的 IAM 使用者或角色失去存取權。我們建議您變更資源型政策陳述式,將條件運算子 ArnNotEqualsaws:PrincipalArn 內容索引鍵搭配使用來限制存取,而不是使用 NotPrincipal 元素。如需有關許可界限的資訊,請參閱 IAM 實體的許可界限

  • 使用 時NotPrincipal,您還必須指定未拒絕主體的帳戶 ARN。否則,政策可能會拒絕存取包含主體的整個帳戶。根據您包含在政策中的服務, AWS 可能先驗證帳戶,再來才是使用者。如果正在評估擔任角色的使用者 (使用角色的人), AWS 則 可能會先驗證帳戶,然後驗證角色,然後驗證擔任角色使用者。擔任角色的使用者由該使用者擔任角色時指定的角色工作階段名稱來進行識別。因此,我們強烈建議您明確包含使用者帳戶的 ARN,或同時包含角色 ARN 和包含該角色的帳戶的 ARN。

  • 服務控制政策 (SCP) 和資源控制政策 (RCP) 不支援 NotPrincipal元素。

NotPrincipal 元素的替代方案

在 中管理存取控制時 AWS,在某些情況下,您可能需要明確拒絕所有主體對資源的存取,但您指定的一個或多個主體除外。 AWS 建議使用拒絕陳述式搭配全域條件內容索引鍵,以更精確地控制和更輕鬆地進行故障診斷。下列範例顯示使用 StringNotEquals或 等條件運算子的替代方法ArnNotEquals,以拒絕存取條件元素中指定的主體以外的所有主體。

使用 IAM 角色的範例案例

您可以使用資源型政策搭配拒絕陳述式,以防止除條件元素中指定的 IAM 角色以外,存取或操作您的資源。此方法遵循 AWS 安全原則,即明確拒絕一律優先於任何允許陳述式,並有助於維護整個 AWS 基礎設施的最低權限原則。

我們建議您使用拒絕陳述式搭配全域條件內容索引鍵和 條件運算子NotPrincipal,而不是使用 ArnNotEquals,以明確允許 IAM 角色存取您的 資源。下列範例使用 aws:PrincipalArn明確允許角色read-only-role存取 Bucket_Account_Audit 資料夾中的 Amazon S3 儲存貯體。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyCrossAuditAccess", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::Bucket_Account_Audit", "arn:aws:s3:::Bucket_Account_Audit/*" ], "Condition": { "ArnNotEquals": { "aws:PrincipalArn": "arn:aws:sts::444455556666:role/read-only-role" } } } ] }

使用服務主體的範例案例

您可以使用拒絕陳述式來防止除 Condition元素中指定的所有服務主體存取或操作您的資源。當您需要實作精細存取控制,或在環境中 AWS 的不同服務和應用程式之間建立安全界限時,此方法特別有用。

我們建議您使用拒絕陳述式搭配全域條件內容索引鍵和條件運算子NotPrincipal,而不是使用 StringNotEquals,以明確允許服務主體存取您的 資源。下列範例使用 aws:PrincipalServiceName明確允許 AWS CodeBuild 服務主體存取 BUCKETNAME 資料夾中的 Amazon S3 儲存貯體。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyNotCodeBuildAccess", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::BUCKETNAME", "arn:aws:s3:::BUCKETNAME/*" ], "Condition": { "StringNotEqualsIfExists": { "aws:PrincipalServiceName": "codebuild.amazonaws.com" } } } ] }