本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS JSON 政策元素:NotPrincipal
可以使用 NotPrincipal
元素來拒絕所有主體的存取,除了 IAM 使用者、聯合身分使用者、IAM 角色、AWS 帳戶、AWS 服務或在 NotPrincipal
中指定的其他主體以外。
對於一些 AWS 服務 (包括 VPC 端點),您可以在資源型政策中使用它。資源型政策是您直接內嵌在資源中的政策。您無法在以 IAM 身分為基礎的政策或 IAM 角色信任政策中使用 NotPrincipal
元素。
NotPrincipal
必須與 "Effect":"Deny"
搭配使用。不支援將其與 "Effect":"Allow"
搭配使用。
重要
極少有需要使用 NotPrincipal
的情況。我們建議在決定使用 NotPrincipal
前,先了解其他授權選項。使用 NotPrincipal
時,會難以疑難排解多個政策類型的影響。我們建議改為將 aws:PrincipalArn
內容索引鍵與 ARN 條件運算子搭配使用。如需詳細資訊,請參閱所有主體。
使用 Deny
來指定 NotPrincipal
當您使用 NotPrincipal
和 Deny
時,您還必須指定非拒絕主體的帳戶 ARN。否則,政策可能會拒絕存取包含主體的整個帳戶。根據您包含在政策中的服務,AWS 可能先驗證帳戶,再來才是使用者。如果 AWS 正在評估一個擔任角色的使用者 (使用角色的某個人),它會先驗證帳戶,然後是角色,最後才是擔任角色的使用者。擔任角色的使用者由該使用者擔任角色時指定的角色工作階段名稱來進行識別。因此,我們強烈建議您明確包含使用者帳戶的 ARN,或同時包含角色 ARN 和包含該角色的帳戶的 ARN。
重要
對於已附加許可界限政策的 IAM 使用者或角色,請勿使用所含 NotPrincipal
政策元素具有 Deny
效果的資源型政策陳述式。無論在 NotPrincipal
元素中指定何值,具有 Deny
效果的 NotPrincipal
元素將始終拒絕任何已附加許可界限政策的 IAM 主體。這會造成部分本可存取資源的 IAM 使用者或角色失去存取權。我們建議您變更資源型政策陳述式,將條件運算子 ArnNotEquals 與 aws:PrincipalArn 內容索引鍵搭配使用來限制存取,而不是使用 NotPrincipal
元素。如需有關許可界限的資訊,請參閱 IAM 實體的許可界限。
注意
根據最佳實務,您應該在政策中包含適用於帳戶的 ARN。有些服務需要帳戶 ARN,雖然不是所有情況都是如此。不含必要的 ARN 的任何現有政策將持續運作,但包含這些服務的新政策必須符合這項需求。IAM 不會追蹤這些服務,所以建議您一律包括帳戶 ARN。
以下範例顯示了在同一政策陳述式中有效使用 NotPrincipal
與 "Effect":
"Deny"
的方法。
範例 相同或不同帳戶中的 IAM 使用者範例
在下列範例中,除了 AWS 帳戶 444455556666 中名為 Bob 的使用者外,所有其他主體均被明確拒絕存取某個資源。請注意,根據最佳實務,NotPrincipal
元素包含使用者 Bob 以及 Bob 所屬 AWS 帳戶 的 ARN (arn:aws:iam::444455556666:root
)。如果 NotPrincipal
元素僅包含 Bob 的 ARN,則政策的效果可能會明確拒絕對包含使用者 Bob 之 AWS 帳戶 的存取。在一些情況下,使用者不能擁有比其父帳戶更多的許可,因此,如果 Bob 的帳戶被明確拒絕存取,則 Bob 可能無法存取該資源。
若本範例是資源類型政策中連接至相同或不同 AWS 帳戶 (非 444455556666) 中資源的政策陳述式一部分,則它可以正常運作。本範例本身不會向 Bob 授予存取權限,而只會將 Bob 從被明確拒絕的主體的清單中省略。若要讓 Bob 存取資源,另一個政策陳述式必須使用 "Effect":
"Allow"
明確允許存取。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Deny", "NotPrincipal": {"AWS": [ "arn:aws:iam::444455556666:user/Bob", "arn:aws:iam::444455556666:root" ]}, "Action": "s3:*", "Resource": [ "arn:aws:s3:::BUCKETNAME", "arn:aws:s3:::BUCKETNAME/*" ] }] }
範例 相同或不同帳戶中的 IAM 角色範例
在下列範例中,除了 AWS 帳戶 中名為 444455556666 的擔任角色使用者之外,所有其他主體均被明確拒絕存取某個資源。根據最佳實務,NotPrincipal
元素包含擔任角色的使用者 (cross-account-audit-app)、角色 (cross-account-read-only-role) 和角色所屬的 AWS 帳戶 的 ARN (444455556666)。如果 NotPrincipal
元素缺少角色的 ARN,政策的效果可能會明確拒絕對角色的存取。同樣,如果 NotPrincipal
元素缺少角色所屬 AWS 帳戶 的 ARN,政策的效果可能會明確拒絕對 AWS 帳戶 以及該帳戶中所有實體的存取。在一些情況下,擔任了角色的使用者不能擁有比其父角色更多的許可,而且角色不能擁有比其父 AWS 帳戶 更多的許可,因此,當角色或帳戶被明確拒絕存取時,擔任了角色的使用者可能無法存取資源。
若本範例是資源類型政策中連接至不同 AWS 帳戶 (非 444455556666) 中資源的政策陳述式一部分,則它可以正常運作。本範例本身不會允許存取擔任角色的使用者 cross-account-audit-app,而只會將 cross-account-audit-app 從被明確拒絕的主體的清單中省略。要向 cross-account-audit-app 授予對資源的存取許可,另一個政策陳述式必須使用 "Effect":
"Allow"
明確允許存取。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Deny", "NotPrincipal": {"AWS": [ "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/cross-account-audit-app", "arn:aws:iam::444455556666:role/cross-account-read-only-role", "arn:aws:iam::444455556666:root" ]}, "Action": "s3:*", "Resource": [ "arn:aws:s3:::Bucket_AccountAudit", "arn:aws:s3:::Bucket_AccountAudit/*" ] }] }
當您在 NotPrincipal
元素中指定取得角色工作階段時,您無法使用萬用字元 (*) 來表示「所有工作階段」。主體一律必須命名特定工作階段。