IAM用户访问S3对象HTTPS URL的存储桶策略配置咨询
S3对象HTTPS URL无法访问的核心原因
你直接在浏览器中访问S3对象的原生HTTPS链接时,发起的是匿名访问请求。你当前的存储桶策略没有对匿名请求开放s3:GetObject权限,所以会被默认拒绝。你本地可以下载对象,是因为本地客户端用的是已经授权的IAM身份发起的带身份校验的请求,和直接访问URL的请求逻辑完全不同。
可选解决方案
方案一:仅指定IAM用户可访问,不开放任何匿名权限
你现有策略缺少Principal字段,没有明确指定授权的IAM身份,首先补全存储桶策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ListBucket", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[你的AWS账号ID]:user/[目标IAM用户名]" }, "Action": [ "s3:ListBucket" ], "Resource": "arn:aws:s3:::[你的存储桶名称]" }, { "Sid": "GetObject", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[你的AWS账号ID]:user/[目标IAM用户名]" }, "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::[你的存储桶名称]/*" } ] }
访问时你可以给目标用户生成预签名URL,预签名URL自带IAM身份的签名校验信息,你可以自定义有效期,有效期内所有拿到链接的用户都可以直接访问内容,不需要额外配置IAM权限,也不需要把存储桶设为公开。
方案二:允许符合指定条件的匿名请求可直接访问URL
如果你需要让指定范围的用户不需要IAM身份就能直接访问URL,可以在策略中添加Condition限制条件,避免存储桶被设为完全公开,示例策略如下(以来源IP限制为例):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetObjectWithLimit", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::[你的存储桶名称]/*", "Condition": { "IpAddress": { "aws:SourceIp": "192.168.1.0/24" } } } ] }
你可以根据需求调整Condition规则,比如限制来源VPC、请求头信息等。
注意事项
- 如果你使用带
Principal: "*"的策略,需要对应调整存储桶的「阻止公开访问」配置,不要开启全量阻止公开访问规则,避免策略被拦截。 - 上传对象时不要设置私有对象级别的ACL,避免覆盖存储桶策略的授权逻辑。
内容的提问来源于stack exchange,提问作者maddy23
相关产品推荐
相关产品推荐

