AWS Bucket Policy - 使用存储桶策略限制对存储桶的访问

AWS Bucket Policy - limit access to a bucket with bucket policy

默认情况下,我们的用户通过 IAM 具有完全的 S3 访问权限,但我有一个存储桶,但我需要限制对一个特定用户的访问,并阻止所有其他用户。

我在这里遵循了这个指南https://aws.amazon.com/premiumsupport/knowledge-center/explicit-deny-principal-elements-s3/

并制定了这个存储桶策略 -

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
            "AWS": [
                "arn:aws:iam::XXXXXXXXXXXX:user/USERWHONEEDSACCESS"
            ]
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::NAMEOFBUCKET/*"
    },
    {
        "Sid": "",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::NAMEOFBUCKET/*",
        "Condition": {
            "StringNotLike": {
                "aws:userid": "USERWHONEEDSACCESS:*"
            }
        }
    }
]
}

然而它没有用。有什么建议吗?

您可以尝试以下方法:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Principal": {
                "AWS": [
                    "arn:aws:iam::XXXXXXXXXXXX:user/USERWHONEEDSACCESS"
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::nameofbucket/*",
                "arn:aws:s3:::nameofbucket"
            ],
            "Effect": "Allow"
        },
        {
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::XXXXXXXXXXXX:user/USERWHONEEDSACCESS"
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::nameofbucket/*",
                "arn:aws:s3:::nameofbucket"
            ],
            "Effect": "Deny"
        }
    ]
}

How to Restrict Amazon S3 Bucket Access to a Specific IAM Role 博客 post 中,您可以阅读有关使用 NotPrincipal 和限制访问单个 IAM User 的更多信息,特别是:

You can use the NotPrincipal element of an IAM or S3 bucket policy to limit resource access to a specific set of users. This element allows you to block all users who are not defined in its value array, even if they have an Allow in their own IAM user policies.

为了生成此策略代码片段,我使用了以下内容:https://asecure.cloud/a/s3_restrict_iam_user/ 和 pre-filled iamPrincipalbucketName 参数以及您的示例值。

确保您在条件中使用 IAM unique identifier(IAM 用户应以字母 AIDA 开头)。

"StringNotLike": {
      "aws:userid": "AIDAXXXXXXXXXXXXX:*"
 }

我怀疑您在条件中写了用户名,因为您使用了与 Principal 中相同的占位符。 IAM 用户 ID 与用户名和 arn 不同,无法通过控制台找到,但您可以使用 aws cli get-user command.

等检索它

虽然@Rigerta 的回答会奏效,但我认为有必要解释一下为什么以及如何使您的政策奏效

如果您注意到,您在策略中指定只有该用户才能访问您存储桶中的所有对象

"Resource": "arn:aws:s3:::NAMEOFBUCKET/*"

但是,IAM 权限对 S3 存储桶的工作方式有点棘手。是的,该用户可以访问所有对象,如果 he/she 尝试通过 cli push/pull 对象,操作可能会成功,尽管通过 AWS 控制台无法访问存储桶。这是因为用户只能访问存储桶中的对象,而不是存储桶本身

因此,您需要将存储桶添加到您的资源中。改变

"Resource": "arn:aws:s3:::NAMEOFBUCKET/*"

来自

"Resource": ["arn:aws:s3:::NAMEOFBUCKET/*", "arn:aws:s3:::NAMEOFBUCKET"]

应该可以正常工作。

您可以查看 this blogpost 以获取用于访问存储桶的 IAM 策略示例。注意如何将不同的操作授予不同的资源