AWS 存储桶策略语句优先级顺序

问题描述

我正在尝试使用我的存储桶策略限制用户访问我的存储桶。我有一组用户,他们都有一个 S3FullAccess 策略。我无法更改 IAM 中的任何内容。我只能访问我的存储桶策略。所以我想使用存储桶策略来控制用户的访问。我将用户分为 3 类。

  1. 对我的存储桶的管理员访问权限(对我的存储桶的所有访问权限)
  2. 对我的存储桶具有有限访问权限的用户(例如 get-bucket-policy、get-bucket-location)
  3. 无法访问我的存储桶。 (无法访问我的存储桶)

以下策略是我尝试过的,但不起作用。

{
    "Version": "2012-10-17","Id": "PolicyTesting","Statement": [
        {
            "Sid": "0","Effect": "Allow","Principal": {
                "AWS": "arn:aws:iam::<<account_id>>:user/users_with_limited_access"
            },"Action": [
                "s3:GetBucketPolicy","s3:GetBucketLocation","s3:ListBucket"
            ],"Resource": [
                "arn:aws:s3:::<<my_bucket_name>>","arn:aws:s3:::<<my_bucket_name>>/*"
            ]
        },{
            "Sid": "1","Effect": "Deny","NotPrincipal": {
                "AWS": "arn:aws:iam::<<account_id>>:user/admin_users"
            },"Action": "s3:*","arn:aws:s3:::<<my_bucket_name>>/*"
            ]
        }
    ]
}

我尝试了上述策略,但只有管理员用户才能访问存储桶。访问受限的用户无法执行他们授予的操作,如 get-bucket-policy、get-bucket-location。他们收到拒绝访问异常。帮我解决这个问题。

解决方法

AWS IAM 策略中没有优先级顺序。请参考策略评估逻辑here

AWS 执行代码会评估账户中适用于请求的所有策略。如果代码发现即使是一个适用的明确拒绝,代码也会返回拒绝的最终决定。

您当前的政策拒绝除管理员用户以外的所有用户进行任何 S3 操作。因此 users_with_limited_access 无法执行授予的操作。

请使用适当的委托人更新您的政策(根据您问题中的评论),并参考以下更新后的政策以使其生效。

{
    "Version": "2012-10-17","Statement": [
        {
            "Sid": "1","Effect": "Allow","Principal": {
                "AWS": "arn:aws:iam::111111111111:user/s3-limited-access-user"
            },"Action": [
                "s3:GetBucketPolicy","s3:GetBucketLocation","s3:ListBucket"
            ],"Resource": [
                "arn:aws:s3:::example-bucket","arn:aws:s3:::example-bucket/*"
            ]
        },{
            "Sid": "2","Effect": "Deny","Principal": {
                "AWS": "arn:aws:iam::111111111111:user/s3-no-access-user"
            },"Action": "s3:*",{
            "Sid": "3","Principal": {
                "AWS": "arn:aws:iam::111111111111:user/admin-user"
            },"arn:aws:s3:::example-bucket/*"
            ]
        }
    ]
}
,

您应该非常小心NotPrincipal。最好的做法是避免同时使用它们。大多数情况下,无需使用“危险的”NotPrincipal 即可轻松实现相同的功能(策略语义)。

我认为您最好创建特定的 IAM 角色并将它们分配给您希望允许访问 S3 存储桶的相应用户组。之后,使用针对 Deny"Principal" : "*"aws:userId 的显式 aws:PrincipalArn 阻止对存储桶的所有其他访问。

查看这篇文章了解更多详情https://levelup.gitconnected.com/how-i-locked-the-whole-company-out-of-an-amazon-s3-bucket-1781de51e4be

最好的,斯蒂芬

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...