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

背景信息

  • 使用RAM对OSS进行权限管理前,请先了解以下系统策略:
    • AliyunOSSFullAccess:管理OSS的权限。
    • AliyunOSSReadOnlyAccess:只读访问OSS的权限。

    当系统策略不能满足您的需要时,您可以创建自定义策略。

  • 使用RAM对OSS进行权限管理前,请先了解OSS的权限定义。更多信息,请参见RAM Policy概述

操作步骤

  1. 创建RAM用户。
    具体操作,请参见创建RAM用户
  2. 创建自定义策略。
    更多信息,请参见创建自定义权限策略权限策略示例
  3. 为RAM用户授权。
    具体操作,请参见为RAM用户授权

权限策略示例

  • 示例1:授权RAM用户管理一个名为myphotos的存储空间。
    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "oss:*",
                "Resource": [
                    "acs:oss:*:*:myphotos",
                    "acs:oss:*:*:myphotos/*"
                ]
            }
        ]
    }
  • 示例2:授权RAM用户列出并读取一个存储空间中的资源。
    • 授权RAM用户通过OSS SDK或OSS命令行工具列出并读取一个存储空间中的资源。存储空间名称为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控制台会额外调用ListBucketsGetBucketAclGetObjectAcl,以确定存储空间属性是公开还是私有。
      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                            "oss:ListBuckets",
                            "oss:GetBucketStat",
                            "oss:GetBucketInfo",
                            "oss:GetBucketTagging",
                            "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.16.0.1/16两个IP地址段读取myphotos中的信息。
      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                            "oss:ListBuckets",
                            "oss:GetBucketStat",
                            "oss:GetBucketInfo",
                            "oss:GetBucketTagging",
                            "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.16.1.0/16"]
                      }
                  }
              }
          ]
      }
    • Deny授权中增加IP限制:如果源IP不在192.168.0.0/16中,则禁止对OSS执行任何操作。
      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                            "oss:ListBuckets",
                            "oss:GetBucketStat",
                            "oss:GetBucketInfo",
                            "oss:GetBucketTagging",
                            "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"]
                      }
                  }
              }
          ]
      }
      说明 因为权限策略的鉴权规则是Deny优先,所以访问者从192.168.0.0/16以外的IP地址访问myphotos中的内容时,OSS会提示没有权限。
  • 示例4:OSS目录级别的授权。

    假设用于存放照片的存储空间名为myphotos,该存储空间下有一些目录,代表照片的拍摄地,每个拍摄地目录下又有年份子目录。

    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:GetBucketTagging",
                            "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/*"
                          ]
                      }
                  }
              }
          ]
      }