Cognito认证AWS临时用户仅访问自建S3桶的权限策略咨询
解决Cognito用户仅能访问自身创建S3桶的权限问题
嘿,我来帮你搞定这个权限隔离的需求!要实现「新用户初始看不到任何桶,创建自己的桶后只能访问自己的」,核心是把用户的Cognito身份和S3桶的命名绑定起来,用IAM条件来做精准匹配。下面是具体的思路和完整的策略方案:
先明确一个前提
得先约定用户创建桶的命名规则,比如要求桶名必须带上用户的唯一标识——比如Cognito的用户ID ${aws:userid},或者更唯一的Cognito身份ID ${cognito-identity.amazonaws.com:sub}。举个例子,桶名格式可以是 user-${aws:userid}-*(比如user-abc123-myphotos)。这个规则是策略生效的基础,确保用户只能操作属于自己的桶。
完整的IAM策略示例
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:CreateBucket", "Resource": "*", "Condition": { "StringLike": { "s3:BucketName": "user-${aws:userid}-*" } } }, { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Resource": "*", "Condition": { "StringLike": { "s3:ResourceAccount": "${aws:accountId}", "s3:BucketName": "user-${aws:userid}-*" } } }, { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::user-${aws:userid}-*", "arn:aws:s3:::user-${aws:userid}-*/*" ] } ] }
策略细节解释
- 创建桶的权限:
- 允许用户创建桶,但通过
StringLike条件限制桶名必须以user-${aws:userid}-开头,这样用户只能创建属于自己的专属桶,没法乱建其他命名的桶。
- 允许用户创建桶,但通过
- 列表桶的权限:
- 虽然保留了
ListAllMyBuckets和GetBucketLocation权限,但加了双重条件:只显示本AWS账号内、且符合命名规则的桶。新用户还没创建桶的时候,列表就是空的,完美符合你要的初始状态;创建桶后,只会看到自己的那个桶。
- 虽然保留了
- 桶的操作权限:
- 给用户开放所有S3操作权限,但仅限符合命名规则的桶及其内部对象。这样用户可以完全管理自己的桶,上传、下载、删除都没问题,但碰不到别人的桶。
额外小提示
- 如果你想用Cognito用户名代替
aws:userid,可以换成${cognito-identity.amazonaws.com:username},不过要注意用户名可能有重复风险,更推荐用唯一的身份ID${cognito-identity.amazonaws.com:sub}。 - 如果担心用户不遵守命名规则,可以配合S3桶策略或者AWS组织的SCP(服务控制策略),强制所有桶的命名必须符合规则,从根源上杜绝乱建的情况。
- 要是你不需要用户自己创建桶,而是系统自动为每个用户生成桶,那可以删掉
CreateBucket那一段权限,直接用同样的条件策略给用户分配对应桶的操作权限就行。
内容的提问来源于stack exchange,提问作者Manish Goyal
相关产品推荐
相关产品推荐

