使用AWS官方单Bucket访问示例遇权限拒绝问题求助
AWS S3 PutObject权限问题排查
问题描述
我按照AWS官方示例配置S3访问策略,将用户加入挂载了该策略的用户组后,生成STS令牌调用putObject接口时收到错误:
'User: x is not authorized to perform: s3:PutObject on resource: "arn:aws:s3:::dummy-bucket/test/test.txt" because no identity-based policy allows the s3:PutObject action'
但将策略中的Resource改为*后即可正常执行,想确认这是因为策略挂载在用户组而非用户,还是使用STS令牌导致的?
相关代码
生成STS令牌代码
$sdk = new Sdk([ 'region' => 'eu-central-1', 'credentials' => [ 'key' => $accessKey['AccessKeyId'], 'secret' => $accessKey['SecretAccessKey'], ], ]); $stsClient = $sdk->createSts(); $result = $stsClient->getSessionToken([ 'DurationSeconds' => $lifetime, // Set the duration in seconds (15 min minimum) ]);
调用putObject代码
$client = new S3Client([ 'region' => 'eu-central-1', 'version' => '2006-03-01', 'credentials' => [ 'key' => $token['key'], 'secret' => $token['secret'], 'token' => $token['token'] ], ]); $buckets = $client->listBuckets(); $res = $client->putObject([ 'Bucket' => 'dummy-bucket', 'Key' => 'test/test.txt', 'SourceFile' => __DIR__ . '/testfile.txt' ]);
问题原因与解决方案
- 核心问题是S3资源ARN的权限范围不匹配:官方示例策略中的
Resource如果是arn:aws:s3:::dummy-bucket,仅授权对Bucket本身的操作(比如创建、删除桶),而putObject针对的是桶内对象,对应的ARN格式应为arn:aws:s3:::dummy-bucket/*(匹配桶内所有对象)。 - 策略挂载在用户组和直接挂载到用户的权限生效逻辑完全一致;STS临时凭证会继承原身份的权限(只要原身份拥有
sts:GetSessionToken权限),这两个因素都不是导致权限错误的原因。 - 修正方案:将策略中的
Resource字段修改为arn:aws:s3:::dummy-bucket/*,即可授权对桶内所有对象的putObject操作;如果需要更精细的权限控制,可以指定具体前缀,比如arn:aws:s3:::dummy-bucket/test/*。
内容的提问来源于stack exchange,提问作者Oli
相关产品推荐
相关产品推荐

