全部產品
Search
文件中心

Object Storage Service:教程樣本:使用RAM Policy控制OSS的存取權限

更新時間:Feb 28, 2024

本教程樣本詳細示範了如何使用RAM Policy控制使用者對OSS儲存空間(Bucket)、檔案夾以及檔案夾下檔案(Object)的存取權限。

背景資訊

RAM Policy是基於使用者的授權策略。通過設定RAM Policy,您可以集中管理您的使用者(例如員工、系統或應用程式),以及控制使用者可以訪問您名下哪些資源的許可權,例如限制您的使用者只擁有對某一個Bucket的讀許可權。

RAM Policy為JSON格式。各欄位定義如下:

  • Statement:授權語句,一個權限原則可以有多條授權語句。
  • Effect:授權效力,包括允許(Allow)和拒絕(Deny)兩種。
    說明 當權限原則中既有Allow又有Deny的授權語句時,遵循Deny優先的原則。
  • Action:對具體資源的操作許可權。

如果您選擇使用RAM Policy,建議您通過官方工具RAM策略編輯器快速產生RAM策略。

相比於RAM Policy,Bucket Policy支援在控制台直接進行圖形化配置操作,並且Bucket擁有者可以直接進行授權訪問。更多資訊,請參見使用Bucket Policy授權其他使用者訪問OSS資源

儲存空間和檔案夾的基本概念

阿里雲OSS的資料模型為扁平型結構,所有檔案都直接隸屬於其對應的儲存空間。因此,OSS缺少檔案系統中類似於目錄與子檔案夾的階層。但是,您可以在OSS控制台上類比資料夾階層。在該控制台中,您可以按檔案夾對相關檔案進行分組、分類和管理,如下圖所示。ram

OSS提供使用索引值(key)對格式的分布式Object Storage Service服務。您可以根據其唯一的key(對象名)檢索對象的內容。例如,名為examplebucket的儲存空間有三個檔案夾,分別為DevelopmentMarketingPrivate,以及一個對象oss-dg.pdf

  • 在建立Development檔案夾時,控制台會建立一個key為Development/的對象,檔案夾的key包括分隔字元/
  • 當您將名為ProjectA.docx 的對象上傳到Development 檔案夾中時,控制台會上傳該對象並將其key設定為Development/ProjectA.docx

    在該key中,Development為首碼,而/為分隔字元。您可以從儲存空間中擷取具有特定首碼和分隔字元的所有對象的列表。在控制台中,單擊Development 檔案夾時,控制台會列出檔案夾中的對象,如下圖所示。

    development
    說明 當控制台列舉examplebucket儲存空間中的 Development檔案夾時,它會向OSS發送一個用於指定首碼 Development和分隔字元/的請求。因此,儲存空間examplebucket有三個對象,其key分別為Development/Alibaba Cloud.pdfDevelopment/ProjectA.docxDevelopment/ProjectB.docx

在本教程開始之前,您還需要瞭解根級儲存空間內容的概念。假設examplebucket儲存空間包含以下對象:

  • Development/Alibaba Cloud.pdf
  • Development/ProjectA.docx
  • Development/ProjectB.docx
  • Marketing/data2020.xlsx
  • Marketing/data2021.xlsx
  • Private/2017/images.zip
  • Private/2017/promote.pptx
  • oss-dg.pdf

這些對象的key構建了一個以DevelopmentMarketingPrivate作為根級檔案夾並以oss-dg.pdf作為根級對象的邏輯階層。當您單擊OSS控制台中的儲存空間名時,控制台會將一級首碼和一個分隔字元,例如Development/Marketing/Private/顯示為根級檔案夾。對象oss-dg.pdf沒有首碼,因此顯示為根層級項。

ram

OSS的請求和響應邏輯

在授予RAM使用者相關許可權之前,您需要瞭解單擊某個儲存空間的名字時控制台向OSS發送請求、OSS返迴響應,以及控制台如何解析該響應的邏輯。

  • 請求某個儲存空間

    單擊examplebucket儲存空間時,控制台會將GetBucket (ListObjects)請求發送至OSS。

    • 請求樣本
      GET /?prefix=&delimiter=/ HTTP/1.1
      Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
      Date: Fri, 24 Feb 2012 08:43:27 GMT
      Authorization: OSS qn6qrrqxo2oawuk53otf****:DNrnx7xHk3sgysx7I8U9I9IY****

      此請求包括prefix和delimiter參數,其中prefix的值為空白字串,delimiter的值為正斜線(/)。

    • 響應樣本
      HTTP/1.1 200 OK
      x-oss-request-id: 534B371674E88A4D8906****
      Date: Fri, 7 Aug 2020 08:43:27 GMT
      Content-Type: application/xml
      Content-Length: 712
      Connection: keep-alive
      Server: AliyunOSS
      <?xml version="1.0" encoding="UTF-8"?>
      <ListBucketResult xmlns=¡±http://doc.oss-cn-hangzhou.aliyuncs.com¡±>
      <Name>examplebucket</Name>
      <Prefix></Prefix>
      <Marker></Marker>
      <MaxKeys>100</MaxKeys>
      <Delimiter>/</Delimiter>
          <IsTruncated>false</IsTruncated>
          <Contents>
              <Key>oss-dg.pdf</Key>
              ...
          </Contents>
         <CommonPrefixes>
              <Prefix>Development</Prefix>
         </CommonPrefixes>
            <CommonPrefixes>
              <Prefix>Marketing</Prefix>
         </CommonPrefixes>
            <CommonPrefixes>
              <Prefix>Private</Prefix>
         </CommonPrefixes>
      </ListBucketResult>
    • 控制台解析

      控制台會解析此結果並顯示如下的根層級項:

      ram
  • 請求儲存空間下的某個檔案夾

    單擊Development/檔案夾,控制台會將GetBucket (ListObjects)請求發送至OSS。此請求包括以下參數:

    • 請求樣本
      GET /?prefix=Development/&delimiter=/ HTTP/1.1
      Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
      Date: Fri, 24 Feb 2012 08:43:27 GMT
      Authorization: OSS qn6qrrqxo2oawuk53otf****:DNrnx7xHk3sgysx7I8U9I9IY****

      此請求包括prefix和delimiter參數,其中prefix的值為Development/,delimiter的值為正斜線(/)。

    • 響應樣本

      作為響應,OSS返回以指定首碼開頭的key:

      HTTP/1.1 200 OK
      x-oss-request-id: 534B371674E88A4D8906****
      Date: Fri, 7 Aug 2020 08:43:27 GMT
      Content-Type: application/xml
      Content-Length: 712
      Connection: keep-alive
      Server: AliyunOSS
      <?xml version="1.0" encoding="UTF-8"?>
      <ListBucketResult xmlns=¡±http://doc.oss-cn-hangzhou.aliyuncs.com¡±>
      <Name>examplebucket</Name>
      <Prefix>Development/</Prefix>
      <Marker></Marker>
      <MaxKeys>100</MaxKeys>
      <Delimiter>/</Delimiter>
          <IsTruncated>false</IsTruncated>
          <Contents>
              <Key>ProjectA.docx</Key>
              ...
          </Contents>
          <Contents>
              <Key>ProjectB.docx</Key>
              ...
          </Contents>
          <Contents>
              <Key>Alibaba Cloud.pdf</Key>
              ...
          </Contents>
      </ListBucketResult>
    • 控制台解析

      控制台會解析此結果並顯示如下的key:

      development

情境樣本

假設您是目標儲存空間examplebucket的Owner,且該Bucket下所有的檔案或目錄讀寫權限ACL預設為私人。現在,您希望授予RAM使用者Anne訪問該Bucket下檔案夾Development及其子檔案夾和檔案的讀寫權限,RAM使用者Leo訪問檔案夾Marketing及其子檔案夾和檔案的唯讀許可權,以及當前阿里雲帳號下的所有RAM使用者均無權訪問檔案夾Private的許可權。

步驟一:建立儲存空間並上傳檔案

  1. 建立儲存空間examplebucket
    1. 使用阿里雲帳號登入OSS控制台
    2. 建立名為examplebucket的儲存空間。具體操作,請參見建立儲存空間
  2. 建立目錄DevelopmentMarketingPrivate。具體操作,請參見建立目錄
  3. 按如下要求將檔案上傳至指定路徑。
    • 將oss-dg.pdf檔案上傳至examplebucket的根目錄。
    • 將檔案Alibaba Cloud.pdf、ProjectA.docx以及ProjectB.docx上傳至Development目錄。
    • 將檔案data2020.xlsx和data2021.xlsx上傳至Marketing目錄。
    • 將檔案images.zip和promote.pptx上傳至Private目錄。

    具體操作,請參見上傳檔案

步驟二:建立RAM使用者Anne和Leo

通過RAM控制台建立RAM使用者Anne和Leo為例。關於建立RAM使用者的具體操作,請參見建立RAM使用者

步驟三:授予RAM使用者Anne擁有檔案夾Development的讀寫權限

  1. 建立自訂權限原則AllowAnneToReadAndWriteFolderDevelopment
    1. 在左側導覽列,選擇許可權管理 >
    2. 頁面,單擊
    3. 頁面,單擊指令碼編輯頁簽。
    4. 輸入以下權限原則內容,然後單擊繼續編輯基本資料
      以下策略用於授予RAM使用者Anne擁有檔案夾Development及檔案夾下所有檔案的讀寫權限。
      {
          "Version":"1",
          "Statement":[
              {
                  "Effect":"Allow",
                  "Action":[
                      "oss:ListObjects"
                  ],
                  "Resource":[
                      "acs:oss:*:*:examplebucket"
                  ],
                  "Condition":{
                      "StringLike":{
                          "oss:Prefix":[
                              "Development",
                              "Development/*"
                          ]
                      }
                  }
              },
              {
                  "Effect":"Allow",
                  "Action":[
                      "oss:GetObject",
                      "oss:PutObject",
                      "oss:GetObjectAcl"
                  ],
                  "Resource":[
                      "acs:oss:*:*:examplebucket/Development/*"
                  ]
              }
          ]
      }
    5. 輸入權限原則備忘
    6. 單擊
  2. 為RAM使用者Anne添加自訂權限原則AllowAnneToReadAndWriteFolderDevelopment。具體操作,請參見為RAM使用者授權

步驟四:授予RAM使用者Leo擁有檔案夾Marketing的唯讀許可權

參見步驟三建立自訂權限原則AllowLeoToReadAndWriteFolderMarketing,並授予RAM使用者Leo唯讀訪問檔案夾Marketing及檔案夾下所有檔案的許可權。其策略內容配置如下:
{
    "Version":"1",
    "Statement":[
        {
            "Effect":"Allow",
            "Action":[
                "oss:ListObjects"
            ],
            "Resource":[
                "acs:oss:*:*:examplebucket"
            ],
            "Condition":{
                "StringLike":{
                    "oss:Prefix":[
                        "Marketing",
                        "Marketing/*"
                    ]
                }
            }
        },
        {
            "Effect":"Allow",
            "Action":[
                "oss:GetObject",
                "oss:GetObjectAcl"
            ],
            "Resource":[
                "acs:oss:*:*:examplebucket/Marketing/*"
            ]
        }
    ]
}

步驟5:拒絕當前阿里雲帳號下的所有RAM使用者訪問Private檔案夾

  1. 建立使用者組並添加使用者群組成員。
    建立使用者組的具體操作,請參見建立使用者組。使用者組建立完成後,將當前阿里雲帳號下的所有RAM使用者添加到該使用者組。具體操作,請參見為使用者組添加RAM使用者
  2. 建立自訂權限原則DenyAllRamToAccessFolderPrivate
    1. 在左側導覽列,選擇許可權管理 >
    2. 頁面,單擊
    3. 輸入以下權限原則內容,然後單擊繼續編輯基本資料
      以下策略用於授予當前阿里雲帳號下的所有RAM使用者拒絕訪問Private檔案夾的許可權。
      {
          "Version":"1",
          "Statement":[
              {
                  "Effect":"Deny",
                  "Action":[
                      "oss:*"
                  ],
                  "Resource":[
                      "acs:oss:*:*:examplebucket/Private/*"
                  ],
                  "Condition":{
      
                  }
              },
              {
                  "Effect":"Deny",
                  "Action":[
                      "oss:ListObjects"
                  ],
                  "Resource":[
                      "acs:oss:*:*:*"
                  ],
                  "Condition":{
                      "StringLike":{
                          "oss:Prefix":[
                              "Private/",
                              "Private/*"
                          ]
                      }
                  }
              }
          ]
      }
    4. 輸入權限原則備忘
    5. 單擊
  3. 為使用者組添加自訂權限原則DenyAllRamToAccessFolderPrivate。具體操作,請參見為使用者組授權
    添加權限原則後,使用者組中的任何RAM使用者都不能訪問您儲存空間examplebucket中的檔案夾Private,且當RAM使用者請求列舉Private檔案夾下的Private/2017/images.zipPrivate/2017/promote.pptx檔案時,OSS也將返回錯誤響應。