为 AWS S3 特定目录访问策略

为 AWS S3 特定目录访问策略

团队协作时需要针对用户而设置不同权限,避免因为单个用户误操作导致整个存储服务不可用或对象丢失。

起因

最近因为 C 端项目改造,我们决定将前端的静态资源存储到 AWS S3 服务上,然后再通过 CDN 进行分发。这样减轻主站的流量压力的同时,提高用户的访问速度。

目前我们后端用的 Access ID 是拥有完全权限的,所以这里需要定义一个只能访问特定目录的用户。避免前端同事操作其他对象文件。

为用户指定策略

登录 AWS 控制台,访问Identity and Access Management 页面,点击右侧 User(用户)菜单。

然后在用户列表中点击需要设置访问策略的用户,进入详情页,在用户权限选项卡中点击添加内联策略。然后复制下面的 JSON 策略内容到你的策略编辑器的 JSON 编辑中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadBucketObjects",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": [
"arn:aws:s3:::BUCKET_NAME"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"SPECIFIC_PATH"
]
}
}
},
{
"Sid": "WriteStaticObjects",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::BUCKET_NAME/SPECIFIC_PATH/*"
]
}
]
}

上面的策略中,只需要根据你实际的情况替换 BUCKET_NAME 为你的 Bucket 名称, SPECIFIC_PATH 替换成指定的路径即可。

例如如果只允许用户访问名为 static 的 Bucket,下的 templates 目录,可以将上述的 BUCKET_NAMESPECIFIC_PATH 分别替换。

特殊情况

当我为用户分配了策略以后使用 Transmit 这个 GUI 客户端登录用户,发现依然可以访问 Bucket 下的所有对象,并且可以删除,似乎策略并没有生效。

经过多次的测试与排查,发现是因为在 Bucket 中的权限设置 ACL 勾选了 经身份验证的用户组(拥有 AWS 账户的任何人) 的所有权限。导致即使未分配任何策略也可以访问整个 Bucket。

# AWS, S3

评论