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

AWS JSON 政策元素:NotPrincipal

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

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

重要

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

重點

  • 某些 AWS 服務 (包括 VPC 端點) 的資源型政策支援 NotPrincipal 元素。資源型政策是您直接內嵌在資源中的政策。您無法在以 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 建議使用帶有全域條件內容索引鍵的拒絕陳述式,以實現更精確的控制和更輕鬆的疑難排解。下列範例展示了使用條件運算子 (例如 StringNotEqualsArnNotEquals) 來拒絕存取所有主體 (Condition 元素中指定的主體除外) 的替代方法。

使用 IAM 角色的案例範例

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

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

JSON
{ "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:iam::444455556666:role/read-only-role" } } } ] }

使用服務主體的案例範例

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

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

JSON
{ "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" } } } ] }