本文介紹了通過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/*"
                          ]
                      }
                  }
              }
          ]
      }