使用签名POST上传S3时报access denied,是否为存储桶策略导致?
问题根因排查
核心原因:当前存储桶策略缺少上传权限授权
你当前未开公共访问的shofi-mod存储桶,现有策略仅授予CloudFront源访问身份(OAI)s3:GetObject的读取权限,完全没有给你发起签名POST请求所使用的IAM身份(用户/角色)授予任何写入类权限,这是返回access denied的最直接原因。
对比你另一台可正常上传的存储桶策略,其明确给指定IAM用户授予了包含s3:Put*在内的写入权限,对应上传操作的权限要求。
其他可能的排查点
- 确认生成签名POST所用的IAM身份,除了存储桶策略授权外,自身的IAM权限策略也需要放开对应桶的
s3:PutObject权限,资源需要同时覆盖桶本身(arn:aws:s3:::shofi-mod)和桶内对象路径(arn:aws:s3:::shofi-mod/*) - 检查签名POST的请求参数是否与生成签名时的预设条件完全匹配:包括签名有效期、文件大小限制、对象key前缀、ACL配置等,参数不匹配也会返回403错误
- 若存储桶开启了KMS默认加密,需要额外给所用IAM身份授予对应KMS密钥的
kms:GenerateDataKey、kms:Decrypt权限 - 检查存储桶的公共访问阻止配置,若使用跨账号IAM身份发起请求,需要确认公共访问规则没有拦截跨账号写入操作
修复示例
你可以在现有shofi-mod存储桶策略的Statement数组中新增一条授权规则,给你发起上传所用的IAM身份开放上传权限,示例如下(替换Principal为你实际使用的身份ARN):
{ "Sid": "AllowSignedPostUpload", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam:::user/shofi-stuff-bucket-user" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::shofi-mod/*" }
内容的提问来源于stack exchange,提问作者Christopher Jakob
相关产品推荐
相关产品推荐

