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

AWS JSON 政策元素:NotPrincipal

使用 NotPrincipal 元素來指定 IAM 使用者、聯合身分使用者、IAM 角色、AWS 帳戶、AWS 服務或其他委託人,以允許或拒絕存取資源。NotPrincipal 元素可讓您指定例外到委託人清單。使用此元素來拒絕對除了 NotPrincipal 元素中指定的委託人之外的所有委託人的存取。指定 NotPrincipal 的語法與指定 AWS JSON 政策元素:Principal 語法相同。

您無法在以 IAM 身分為基礎的政策中使用 NotPrincipal 元素。您可以在 IAM 角色和以資源為基礎政策的信任政策中使用該元素。以資源為基礎的政策是您直接內嵌在 IAM 資源中的政策。

重要

極少有需要使用 NotPrincipal 的情況,我們建議在決定使用 NotPrincipal 前了解其他授權選項。

NotPrincipal 搭配 Allow

我們強烈建議不要在與 NotPrincipal 相同的政策陳述式中使用 "Effect": "Allow"。這樣做可允許除了NotPrincipal 元素中命名者以外的所有委託人。我們不建議此政策,因為政策陳述式中指定的許可將授予已指定者除外的所有委託人。這樣一來,您可以將存取權授予匿名 (未驗證) 使用者。

NotPrincipal 搭配 Deny

當在與 "Effect": "Deny" 相同的政策陳述式中使用 NotPrincipal 時,政策陳述式中指定的動作會被明確拒絕授給除了指定的委託人之外的所有委託人。當您使用 NotPrincipalDeny 時,您還必須指定非拒絕委託人的帳戶 ARN。否則,政策可能會拒絕存取包含委託人的整個帳戶。根據您包含在政策中的服務,AWS 可能先驗證帳戶,再來才是使用者。如果 AWS 正在評估一個擔任角色的使用者 (使用角色的某個人),它會先驗證帳戶,然後是角色,最後才是擔任角色的使用者。擔任角色的使用者由該使用者擔任角色時指定的角色工作階段名稱來進行識別。因此,我們強烈建議您明確包含使用者帳戶的 ARN,或同時包含角色 ARN 和包含該角色的帳戶的 ARN。

注意

根據最佳實務,您應該在政策中包含適用於帳戶的 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 元素中指定取得角色工作階段時,您無法使用萬用字元 (*) 來表示「所有工作階段」。委託人一律必須命名特定工作階段。