阿里云访问控制设置子账号只允许操作一个bucket的写法
in 云服务器 with 0 comment

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

in 云服务器 with 0 comment

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

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

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

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

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

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

{
  "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中找到了答案

jjietu.png

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "oss:*"
      ],
      "Resource": [
        "acs:oss:*:*:BucketName",
        "acs:oss:*:*:BucketName/*"
      ],
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "oss:ListBuckets"
      ],
      "Resource": [
        "acs:oss:*:*:*"
      ],
      "Condition": {}
    }
  ]
}
Comments are closed.