如何将 S3 存储桶锁定到特定用户和 IAM 角色

Posted

技术标签:

【中文标题】如何将 S3 存储桶锁定到特定用户和 IAM 角色【英文标题】:How to lockdown S3 bucket to specific users and IAM role(s) 【发布时间】:2017-02-11 05:39:53 【问题描述】:

在我们的环境中,所有 IAM 用户账户都分配了一个客户管理的策略,该策略授予对许多 AWS 服务的只读访问权限。这是我想做的:

将 sql server 2012 express 数据库从本地迁移到 RDS 实例 限制对包含数据库文件的 S3 存储桶的访问

这是根据 AWS 的要求:

用于存储 .bak 数据库文件的 S3 存储桶 有权访问存储桶的角色 附加到 RDS 实例的 SQLSERVER_BACKUP_RESTORE 选项

到目前为止,我已经完成了以下工作:

创建了一个名为“test-bucket”的存储桶(并在此处上传了 .bak 文件) 创建了一个名为“rds-s3-role”的角色

使用以下设置创建名为“rds-s3-policy”的策略:


    "Version": "2012-10-17",
    "Statement": [
     
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation"
        ],
        "Resource": "arn:aws:s3:::test-bucket/"
     ,
     
        "Effect": "Allow",
        "Action": [
            "s3:GetObjectMetaData",
            "s3:GetObject",
            "s3:PutObject",
            "s3:ListMultipartUploadParts",
            "s3:AbortMultipartUpload"
        ],
        "Resource": "arn:aws:s3:::test-bucket/*"
     
    ]

将策略分配给角色

向 RDS 服务授予 AssumeRole 权限以代入上面创建的角色 在 RDS 中使用 SQLSERVER_BACKUP_RESTORE 选项创建了一个新选项组并将其链接到我的 RDS 实例

我的 S3 存储桶没有任何限制,我可以很好地执行恢复;但是,我找不到一种可靠的方法来限制对存储桶的访问,而不妨碍 RDS 服务进行还原。

在我尝试限制对 S3 存储桶的访问方面,我发现网上有一些帖子建议使用显式拒绝语句来拒绝对所有类型的主体的访问,并根据一些条件语句授予访问权限。

这是我的存储桶策略的内容:

    
        "Version": "2012-10-17",
        "Id": "Policy1486769843194",
        "Statement": [
            
                 "Sid": "Stmt1486769841856",
                 "Effect": "Deny",
                 "Principal": "*",
                 "Action": "s3:*",
                 "Resource": [
                     "arn:aws:s3:::test-bucket",
                     "arn:aws:s3:::test-bucket/*"
                 ],
                 "Condition": 
                     "StringNotLike": 
                         "aws:userid": [
                             "<root_id>",
                             "<user1_userid>",
                             "<user2_userid>",
                             "<user3_userid>",
                             "<role_roleid>:*"
                         ]
                     
                 
             
         ]
     

我可以确认存储桶策略确实将访问权限限制为我指定的 IAM 用户,但我不确定它如何处理 IAM 角色。根据我在 aws 论坛上找到的文档,我使用了上面的 :* 语法,其中作者指出“:*”是每个承担指定角色的主体的统称。

我唯一遇到的问题是,有了这个存储桶策略,当我尝试进行数据库还原时,我收到拒绝访问错误。有没有人做过这样的事情?我整天都在努力,但找不到可行的解决方案。

【问题讨论】:

这可能会有所帮助:Granting access to S3 resources based on role name 我认为这与我上面已经尝试过的一致......我想知道问题是否与 RDS 服务试图承担我创建的角色有关...... 【参考方案1】:

以下内容,诚然,是猜测......但在有点难以导航的 IAM 文档和其他地方的字里行间阅读,并考虑到我最初解释它的方式(错误地),我怀疑您正在使用角色的名称,而不是策略中角色的ID

角色 ID 看起来类似于 AWSAccessKeyIds,只是它们以 AROA... 开头。

对于给定的角色,在输出中找到RoleId

$ aws iam get-role --role-name ROLE-NAME

https://aws.amazon.com/blogs/security/how-to-restrict-amazon-s3-bucket-access-to-a-specific-iam-role/

创建广泛的Deny 策略时要小心。您最终可能会拒绝 s3:PutBucketPolicy 给自己,这会使您处于您的策略阻止您更改策略的情况......在这种情况下,您唯一的办法可能是说服 AWS 支持删除存储桶策略。更安全的配置是使用它来仅拒绝对象级权限。

【讨论】:

我正在使用我使用上面列出的 aws 命令检索的 RoleID。实际上,我认为您链接的文档是我关注的文档。我可能会尝试对象级别的权限方法,看看它是如何工作的。 哦。对此感到抱歉,@NiagNtawv。我考虑过将问题作为评论提出,然后,因为我真的看不出问题出在哪里,否则,我认为这可能是最有可能的解释。如果您没有尝试过,您可以启用存储桶日志以确保记录和拒绝的内容是您想要的操作。

以上是关于如何将 S3 存储桶锁定到特定用户和 IAM 角色的主要内容,如果未能解决你的问题,请参考以下文章

创建单个 IAM 用户以仅访问特定的 S3 存储桶

允许用户访问特定 S3 存储桶进行备份的 AWS IAM 策略

AWS:将 IAM 用户限制在 S3 存储桶中的特定文件夹

S3 存储桶策略授予/限制对特定联合用户的访问权限

如何在不创建 IAM 用户的情况下将文件从 EKS 上传到 S3 存储桶?

S3 AWS 的 IAM 角色和密钥设置使用 boto3 访问两个不同的账户存储桶