配置S3存储桶策略后GET Object返回Access Denied问题咨询
问题原因
AWS IAM策略中显式Deny规则的优先级高于所有Allow规则,你当前配置的Deny语句会拦截所有未携带符合要求Referer头的s3:GetObject请求,即使你单独给Elastic Beanstalk EC2角色配置了Allow权限也会被拦截。
原因是EC2实例通过AWS NodeJS SDK调用S3接口时,默认不会携带aws:Referer请求头,刚好命中Deny规则,所以只有下载操作报错,而不在Deny限制范围内的上传、列桶操作正常。
解决方法
修改桶策略中的Deny语句,增加条件排除Elastic Beanstalk EC2角色,修改后的Deny规则如下:
{ "Sid": "Deny get requests originating not from www.*.domain.com and *.domain.com.", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::data/*", "Condition": { "StringNotLike": { "aws:Referer": [ "https://www.*.domain.com/*", "https://*.domain.com/*" ] }, "ArnNotEquals": { "aws:PrincipalArn": "arn:aws:iam::[redacted]:role/aws-elasticbeanstalk-ec2-role" } } }
修改后规则逻辑变为:仅当请求发起者不是Elastic Beanstalk EC2角色、且Referer头不符合要求时,才会拒绝GetObject请求,既保留了域名访问限制,也允许你的EC2服务正常调用下载接口。
可选优化
你当前上传代码中设置了ACL: 'public-read',该配置已无实际作用,因为桶策略的Deny规则会拦截所有未授权的公开访问,你可以将其修改为ACL: 'private'进一步降低权限风险。
内容的提问来源于stack exchange,提问作者ekclone
相关产品推荐
相关产品推荐

