为 AWS S3 特定目录访问策略
起因⌗
最近因为 C 端项目改造,我们决定将前端的静态资源存储到 AWS S3 服务上,然后再通过 CDN 进行分发。这样减轻主站的流量压力的同时,提高用户的访问速度。
目前我们后端用的 Access ID 是拥有完全权限的,所以这里需要定义一个只能访问特定目录的用户。避免前端同事操作其他对象文件。
为用户指定策略⌗
登录 AWS 控制台,访问Identity and Access Management 页面,点击右侧 User(用户)菜单。
然后在用户列表中点击需要设置访问策略的用户,进入详情页,在用户权限选项卡中点击添加内联策略
。然后复制下面的 JSON 策略内容到你的策略编辑器的 JSON 编辑中。
{
"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_NAME
和 SPECIFIC_PATH
分别替换。
特殊情况⌗
当我为用户分配了策略以后使用 Transmit
这个 GUI 客户端登录用户,发现依然可以访问 Bucket 下的所有对象,并且可以删除,似乎策略并没有生效。
经过多次的测试与排查,发现是因为在 Bucket 中的权限设置 ACL 勾选了 经身份验证的用户组(拥有 AWS 账户的任何人)
的所有权限。导致即使未分配任何策略也可以访问整个 Bucket。
I hope this is helpful, Happy hacking…