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

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

AWS 政策元素: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

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

重要

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

注意

根據最佳實務,您應該在政策中包含適用於帳戶的 ARN。有些服務需要帳戶 ARN,雖然不是所有情況都是如此。不含必要的 ARN 的任何現有政策將持續運作,但包含這些服務的新政策必須符合這項需求。IAM 不會追蹤這些服務,所以建議您一律包括帳戶 ARN。

以下範例顯示了在同一政策陳述式中有效使用 NotPrincipal"Effect": "Deny" 的方法。

範例 相同或不同帳戶中的 IAM 使用者範例

在下列範例中,除了 AWS 帳戶 444455556666 中名為 Bob 的使用者外,其他所有主參與者都會被明確拒絕存取資源。請注意,最佳作法是,NotPrincipal元素包含使用者 Bob 和 Bob 所屬的 ARN (arn:aws:iam::444455556666:root)。 AWS 帳戶 如果NotPrincipal元素僅包含 Bob 的 ARN,則原則的影響可能是明確拒絕存取 AWS 帳戶 包含使用者 Bob 的。在一些情況下,使用者不能擁有比其父帳戶更多的許可,因此,如果 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 中指 cross-account-audit-app 定的假定角色使用者以外的所有主參與者都會明確拒絕存取資源。最佳作法 AWS 帳戶 是,NotPrincipal元素包含指定角色使用者 (cross-account-audit-app) 的 ARN、角色 (cross-account-read-only-角色) 以及角色所屬的 (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 元素中指定取得角色工作階段時,您無法使用萬用字元 (*) 來表示「所有工作階段」。主體一律必須命名特定工作階段。