如何配置AWS S3存储桶策略仅允许指定IAM用户访问、拒绝其他主体操作
S3存储桶仅允许指定IAM用户上传的可落地方案
前置检查(90%的配置异常都卡在这里)
- 进入S3存储桶的「权限」配置页,开启全部阻止公共访问选项,不要保留任何公共访问例外,避免权限绕过。
- 检查目标IAM用户的权限边界、所属AWS组织的SCP策略,确认没有附加针对S3上传的全局拒绝规则,否则桶策略配置正确也会被拦截。
步骤1:配置存储桶策略
直接在存储桶权限的「存储桶策略」编辑框粘贴以下配置,替换占位符为你自己的资源信息:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws-cn:s3:::替换成你的存储桶名称/*", "Condition": { "StringNotEquals": { "aws:PrincipalArn": "arn:aws-cn:iam::替换成你的12位AWS账号ID:user/替换成你指定的IAM用户名" } } } ] }
提示:使用AWS全球区而非中国区的话,把所有ARN字段里的
aws-cn改为aws即可。
这个策略的逻辑是默认拦截所有主体的上传请求,仅当请求发起者是你指定的IAM用户时跳过拦截,不会出现权限开放给所有人的问题。注意Resource字段末尾必须加/*,否则策略无法匹配桶内对象资源,会出现所有上传都被拦截的情况。
不要使用「Allow + 指定Principal」的写法配置存储桶策略:这种写法优先级低于其他全局允许规则,一旦存储桶存在公共访问配置、或其他IAM策略带了S3允许项,就会出现非授权用户也能上传的问题。
步骤2:给指定IAM用户配置最小上传权限
给目标IAM用户附加以下内联策略即可,不要给多余的权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws-cn:s3:::替换成你的存储桶名称/*" } ] }
配置验证
配置完成后直接用AWS IAM策略模拟器测试:
- 选择指定IAM用户,操作选
s3:PutObject,目标资源选对应桶内对象,结果应为「允许」 - 选择其他IAM用户/匿名用户,操作选
s3:PutObject,目标资源选对应桶内对象,结果应为「拒绝」
测试通过后再对接Node应用即可,如果你的应用用预签名URL实现前端直传,记得给生成预签名URL的服务实体也加上对应s3:PutObject权限。
内容的提问来源于stack exchange,提问作者Cat1
相关产品推荐
相关产品推荐

