本文介绍了通过RAM的权限管理功能,创建相应的权限策略,从而对对象存储(OSS)进行权限管理,以满足RAM用户操作OSS的多种需求。

前提条件

请确保您已经注册了阿里云账号。如还未注册,请先完成账号注册。详情请参见账号注册

基本信息

使用RAM对OSS进行权限管理前,需先了解几个常用的权限策略。

权限策略 描述
AliyunOSSFullAccess 为RAM用户授予OSS的完全管理权限。
AliyunOSSReadOnlyAccess 为RAM用户授予OSS的只读访问权限。
说明 查看OSS的权限定义,请参见OSS产品文档中的权限控制概述

将自定义策略授权给RAM用户

  1. 根据下述OSS授权样例创建相应的自定义策略。

    详情请参见创建自定义策略

  2. 找到创建好的权限策略,单击其权限策略名称
  3. 单击引用记录 > 新增授权
  4. 被授权主体处输入需要授权的用户名称或ID。
  5. 单击确定
    说明 您也可以直接对用户用户组授予创建好的权限策略,详情请参见为RAM用户授权为用户组授权

OSS授权样例

  • 示例1:授权RAM用户完全管理某个Bucket的权限。
    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "oss:*",
                "Resource": [
                    "acs:oss:*:*:myphotos",
                    "acs:oss:*:*:myphotos/*"
                ]
            }
        ]
    }
  • 示例2:授权RAM用户列出并读取一个Bucket中的资源。
    • 授权RAM用户通过OSS SDK或OSS命令行工具列出并读取一个Bucket中的资源。Bucket名称为:myphotos
      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "oss:ListObjects",
                  "Resource": "acs:oss:*:*:myphotos"
              },
              {
                  "Effect": "Allow",
                  "Action": "oss:GetObject",
                  "Resource": "acs:oss:*:*:myphotos/*"
              }
          ]
      }
    • 授权RAM用户能够通过OSS控制台进行操作。
      说明 用户登录OSS控制台时,为了操作体验的优化,OSS控制台会额外调用ListBuckets操作,以及GetBucketAclGetObjectAcl,以确定bucket属性是公开还是私有。
      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                            "oss:ListBuckets",
                            "oss:GetBucketStat",
                            "oss:GetBucketInfo",
                            "oss:GetBucketAcl" 
                            ],    
                  "Resource": "acs:oss:*:*:*"
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "oss:ListObjects",
                      "oss:GetBucketAcl"
                  ],
                  "Resource": "acs:oss:*:*:myphotos"
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "oss:GetObject",
                      "oss:GetObjectAcl"
                  ],
                  "Resource": "acs:oss:*:*:myphotos/*"
              }
          ]
      }
  • 示例3:授权RAM用户通过特定的IP地址访问OSS。
    • Allow授权中增加IP限制:允许通过192.168.0.0/16, 172.12.0.0/16两个IP段读取myphotos中的信息。
      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                            "oss:ListBuckets",
                            "oss:GetBucketStat",
                            "oss:GetBucketInfo",
                            "oss:GetBucketAcl" 
                            ], 
                  "Resource": [
                      "acs:oss:*:*:*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "oss:ListObjects",
                      "oss:GetObject"
                  ],
                  "Resource": [
                      "acs:oss:*:*:myphotos",
                      "acs:oss:*:*:myphotos/*"
                  ],
                  "Condition":{
                      "IpAddress": {
                          "acs:SourceIp": ["192.168.0.0/16", "172.12.0.0/16"]
                      }
                  }
              }
          ]
      }
    • Deny授权中增加IP限制:如果源IP不在192.168.0.0/16中,则禁止对OSS执行任何操作。
      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                            "oss:ListBuckets",
                            "oss:GetBucketStat",
                            "oss:GetBucketInfo",
                            "oss:GetBucketAcl" 
                            ], 
                  "Resource": [
                      "acs:oss:*:*:*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "oss:ListObjects",
                      "oss:GetObject"
                  ],
                  "Resource": [
                      "acs:oss:*:*:myphotos",
                      "acs:oss:*:*:myphotos/*"
                  ]
              },
              {
                  "Effect": "Deny",
                  "Action": "oss:*",
                  "Resource": [
                      "acs:oss:*:*:*"
                  ],
                  "Condition":{
                      "NotIpAddress": {
                          "acs:SourceIp": ["192.168.0.0/16"]
                      }
                  }
              }
          ]
      }
      说明 因为Policy的鉴权规则是Deny优先,所以访问者从192.168.0.0/16以外的IP地址访问myphotos中的内容时,OSS服务会提示没有权限。
  • 示例4:OSS目录级别的授权。

    假设用于存放照片的Bucket:myphotos。这个Bucket下有一些目录,代表照片的拍摄地,每个拍摄地目录下又有年份子目录。

    myphotos[Bucket]
      ├── beijing
      │   ├── 2014
      │   └── 2015
      ├── hangzhou
      │   ├── 2013
      │   ├── 2014
      │   └── 2015 //授予此目录只读权限
      └── qingdao
          ├── 2014
          └── 2015

    若要授权RAM用户访问myphotos/hangzhou/2015/目录的只读权限。目录级别的授权属于授权的高级功能,根据使用场景不同,授权策略的复杂程度也不同,以下几种场景可供参考。

    • 场景1:授予RAM用户读取文件内容的权限,不需要列出文件的权限。

      RAM用户知道文件的完整路径,可以使用完整的文件路径直接去读取文件内容,通常会将这样的权限授予应用程序。

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "oss:GetObject"
                  ],
                  "Resource": [
                      "acs:oss:*:*:myphotos/hangzhou/2015/*"
                  ]
              }
          ]
      }
    • 场景2:授权RAM用户使用OSS命令行工具访问目录myphotos/hangzhou/2015/并列出目录中文件的权限。

      RAM用户不清楚目录中有哪些文件,可以使用OSS命令行工具或API直接获取目录信息,通常会将这样的权限授予软件开发者。

      此场景需要新增ListObjects的权限。

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "oss:GetObject"
                  ],
                  "Resource": [
                      "acs:oss:*:*:myphotos/hangzhou/2015/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "oss:ListObjects"
                  ],
                  "Resource": [
                      "acs:oss:*:*:myphotos"
                  ],
                  "Condition":{
                      "StringLike":{
                          "oss:Prefix":"hangzhou/2015/*"
                      }
                  }
              }
          ]
      }
    • 场景3: 授予RAM用户使用OSS控制台访问目录。

      RAM用户使用可视化的OSS客户端访问目录myphotos/hangzhou/2015/,可视化的客户端类似Windows文件管理器,RAM用户可以从根目录开始,一层一层的进入要访问的目录,此场景是最易用的场景。

      此场景需要新增以下权限:

      • 列出所有Bucket的权限
      • 列出myphotos下目录的权限。
      • 列出myphotos/hangzhou下的目录的权限。
      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                            "oss:ListBuckets",
                            "oss:GetBucketStat",
                            "oss:GetBucketInfo",
                            "oss:GetBucketAcl" 
                            ], 
                  "Resource": [
                      "acs:oss:*:*:*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "oss:GetObject",
                      "oss:GetObjectAcl"
                  ],
                  "Resource": [
                      "acs:oss:*:*:myphotos/hangzhou/2015/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "oss:ListObjects"
                  ],
                  "Resource": [
                      "acs:oss:*:*:myphotos"
                  ],
                  "Condition": {
                      "StringLike": {
                          "oss:Delimiter": "/",
                          "oss:Prefix": [
                              "",
                              "hangzhou/",
                              "hangzhou/2015/*"
                          ]
                      }
                  }
              }
          ]
      }