阿里云访问控制设置子账号只允许操作一个bucket的写法

今天参与了阿里云的云翼计划购入了一台学生机,这样现在的代码部署就all in aliyun了。

最近打算分拆一部分静态页面到oss上降低服务器负载,之前的bucket只是存储网站的cdn文件于是打算新开一个bucket存储。

这时其实共享一个RAM子账号也是没有问题的,毕竟子账户授予了AliyunOSSFullAccess权限可以操作所有的bucket。但是考虑一个问题:

假设我们创建了一个子账号A授予了它AliyunOSSFullAccess权限,同时我们创建了附件oss(O1)和页面oss(O2)。然后因为程序bug、被后门或者是被入侵导致了子账号A丢失(管理员无感知时),入侵者可以凭借泄露的子账号任意操作删除我们的oss内容,细思极恐。

这时我打算分拆多个子账号,每个子账号只存在最小管理单元(即单个oss),这样一个账号丢失不会导致整个线上挂掉。于是开始写RAM的策略。

最初的写的策略是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Resource": [
"acs:oss:*:*:BucketName",
"acs:oss:*:*:BucketName/*"
],
"Condition": {}
}
]
}

结果发现虽然能够保存,但是用子账号进行访问时 提示 Access Failed:cannot list buckets.

改了好久,以为自己写的不标准,于是使用了阿里云提供的RAM Policy Editor去生成了一份,结果和我写的是一模一样。。。

emmm,这我就有点慌了啊。


最后在RAM Policy Editor的git中找到了答案

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
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Resource": [
"acs:oss:*:*:BucketName",
"acs:oss:*:*:BucketName/*"
],
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"oss:ListBuckets"
],
"Resource": [
"acs:oss:*:*:*"
],
"Condition": {}
}
]
}

评论区