RAM (Resource Access Management)是阿里雲提供的資源存取控制服務。RAM Policy是基於使用者的授權策略。通過設定RAM Policy,您可以集中管理您的使用者(比如員工、系統或應用程式),以及控制使用者可以訪問您名下哪些資源的許可權。比如能夠限制您的使用者只擁有對某一個 Bucket 的讀許可權。子帳號是從屬於主帳號的,並且這些帳號下不能擁有實際的任何資源,所有資源都屬於主帳號。

说明 您可以使用RAM策略編輯器快速產生RAM Policy。

常見Policy樣本

  • 完全授權的Policy

    完全授權的Policy表示允許應用可以對OSS進行任何操作。

    警告 完全授權的Policy對行動裝置 App來說是不安全的授權,不推薦使用。
    {
      "Statement": [
        {
          "Action": [
            "oss:*"
          ],
          "Effect": "Allow",
          "Resource": ["acs:oss:*:*:*"]
        }
      ],
      "Version": "1"
    }
    對OSS的操作 結果
    列舉所有建立的Bucket 成功
    上傳不帶首碼的Object,test.txt 成功
    下載不帶首碼的Object,test.txt 成功
    上傳帶首碼的Object,user1/test.txt 成功
    下載帶首碼的Object,user1/test.txt 成功
    列舉Object,test.txt 成功
    帶首碼的Object,user1/test.txt 成功
  • 不限制首碼的唯讀不寫Policy

    此Policy表示應用對Bucketapp-base-oss下所有的Object可列舉,可下載。

    {
        "Statement": [
          {
            "Action": [
              "oss:GetObject",
              "oss:ListObjects"
            ],
            "Effect": "Allow",
            "Resource": ["acs:oss:*:*:app-base-oss/*", "acs:oss:*:*:app-base-oss"]
          }
        ],
        "Version": "1"
      }
    對OSS的操作 結果
    列舉所有建立的Bucket 失敗
    上傳不帶首碼的Object,test.txt 失敗
    下載不帶首碼的Object,test.txt 成功
    上傳帶首碼的Object,user1/test.txt 失敗
    下載帶首碼的Object,user1/test.txt 成功
    列舉不帶首碼的Object,test.txt 成功
    列舉帶首碼的Object,user1/test.txt 成功
  • 限制首碼的唯讀不寫Policy

    此Policy表示應用對Bucketapp-base-oss下帶有首碼user1/的Object可列舉、可下載,但無法下載其他首碼的Object。採用此種Policy,如果不同的應用對應不同的首碼,就可以達到在同一個Bucket中空間隔離的效果。

    {
        "Statement": [
          {
            "Action": [
              "oss:GetObject",
              "oss:ListObjects"
            ],
            "Effect": "Allow",
            "Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"]
          }
        ],
        "Version": "1"
      }
    對OSS的操作 結果
    列舉所有建立的Bucket 失敗
    上傳不帶首碼的Object,test.txt 失敗
    下載不帶首碼的Object,test.txt 失敗
    上傳帶首碼的Object,user1/test.txt 失敗
    下載帶首碼的Object,user1/test.txt 成功
    列舉Object,test.txt 成功
    帶首碼的Object,user1/test.txt 成功
  • 不限制首碼的唯寫不讀Policy

    此Policy表示應用可以對Bucketapp-base-oss下所有的Object進行上傳。

    {
        "Statement": [
          {
            "Action": [
              "oss:PutObject"
            ],
            "Effect": "Allow",
            "Resource": ["acs:oss:*:*:app-base-oss/*", "acs:oss:*:*:app-base-oss"]
          }
        ],
        "Version": "1"
      }
    對OSS的操作 結果
    列舉所有建立的Bucket 失敗
    上傳不帶首碼的Object,test.txt 成功
    下載不帶首碼的Object,test.txt 失敗
    上傳帶首碼的Object,user1/test.txt 成功
    下載帶首碼的Object,user1/test.txt 成功
    列舉Object,test.txt 成功
    帶首碼的Object,user1/test.txt 成功
  • 限制首碼的唯寫不讀Policy

    此Policy表示應用可以對Bucketapp-base-oss下帶有首碼user1/的Object進行上傳。但無法上傳其他首碼的Object。採用此種Policy,如果不同的應用對應不同的首碼,就可以達到在同一個Bucket中空間隔離的效果。

    {
        "Statement": [
          {
            "Action": [
              "oss:PutObject"
            ],
            "Effect": "Allow",
            "Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"]
          }
        ],
        "Version": "1"
      }
    對OSS的操作 結果
    列舉所有建立的Bucket 失敗
    上傳不帶首碼的Object,test.txt 失敗
    下載不帶首碼的Object,test.txt 失敗
    上傳帶首碼的Object,user1/test.txt 成功
    下載帶首碼的Object,user1/test.txt 失敗
    列舉Object,test.txt 失敗
    帶首碼的Object,user1/test.txt 失敗
  • 不限制首碼的讀寫Policy

    此Policy表示應用可以對Bucketapp-base-oss下所有的Object進行列舉、下載、上傳和刪除。

    {
        "Statement": [
          {
            "Action": [
              "oss:GetObject",
              "oss:PutObject",
              "oss:DeleteObject",
              "oss:ListParts",
              "oss:AbortMultipartUpload",
              "oss:ListObjects"
            ],
            "Effect": "Allow",
            "Resource": ["acs:oss:*:*:app-base-oss/*", "acs:oss:*:*:app-base-oss"]
          }
        ],
        "Version": "1"
      }
    對OSS的操作 結果
    列舉所有建立的Bucket 失敗
    上傳不帶首碼的Object,test.txt 成功
    下載不帶首碼的Object,test.txt 成功
    上傳帶首碼的Object,user1/test.txt 成功
    下載帶首碼的Object,user1/test.txt 成功
    列舉Object,test.txt 成功
    帶首碼的Object,user1/test.txt 成功
  • 限制首碼的讀寫Policy

    此Policy表示應用可以對Bucketapp-base-oss下帶有首碼user1/的Object進行列舉、下載、上傳和刪除,但無法對其他首碼的Object進行讀寫。採用此種Policy,如果不同的應用對應不同的首碼,就可以達到在同一個Bucket中空間隔離的效果。

    {
        "Statement": [
          {
            "Action": [
              "oss:GetObject",
              "oss:PutObject",
              "oss:DeleteObject",
              "oss:ListParts",
              "oss:AbortMultipartUpload",
              "oss:ListObjects"
            ],
            "Effect": "Allow",
            "Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"]
          }
        ],
        "Version": "1"
      }
    對OSS的操作 結果
    列舉所有建立的Bucket 失敗
    上傳不帶首碼的Object,test.txt 失敗
    下載不帶首碼的Object,test.txt 失敗
    上傳帶首碼的Object,user1/test.txt 成功
    下載帶首碼的Object,user1/test.txt 成功
    列舉Object,test.txt 成功
    帶首碼的Object,user1/test.txt 成功

複雜Policy樣本

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "oss:GetBucketAcl",
                "oss:ListObjects"
            ],
            "Resource": [
                "acs:oss:*:1775305056529849:mybucket"
            ],
            "Effect": "Allow",
            "Condition": {
                "StringEquals": {
                    "acs:UserAgent": "java-sdk",
                    "oss:Prefix": "foo"
                },
                "IpAddress": {
                    "acs:SourceIp": "192.168.0.1"
                }
            }
        },
        {
            "Action": [
                "oss:PutObject",
                "oss:GetObject",
                "oss:DeleteObject"
            ],
            "Resource": [
                "acs:oss:*:1775305056529849:mybucket/file*"
            ],
            "Effect": "Allow",
            "Condition": {
                "IpAddress": {
                    "acs:SourceIp": "192.168.0.1"
                }
            }
        }
    ]
}

這是一個較為複雜的授權 Policy,使用者用這樣的一個 Policy 通過 RAM 或 STS 服務向其他使用者授權。Policy 當中有一個 Statement(一條 Policy 當中可以有多條 Statement)。Statement 裡面規定了相應的 Action、Resource、Effect 和 Condition。

這條 Policy 把使用者自己名下的mybucketmybucket/file*這些資源授權給相應的使用者,並且支援 GetBucketAcl、GetBucket、PutObject、GetObject 和 DeleteObject 這幾種操作。Condition 中的條件表示 UserAgent為 java-sdk,源IP為192.168.0.1的時候鑒權才能通過,被授權的使用者才能訪問相關的資源。Prefix 這個 Condition 是在 GetBucket(ListObjects)的時候起作用的,關於這個欄位的解釋詳見 OSS的 API 文檔。

Version

Version定義了Policy的版本,本文檔中 Version 設定為1

Statement

通過Statement描述授權語義,其中可以根據業務情境包含多條語義,每條包含對 Action、Effect、Resource 和 Condition 的描述。每次請求系統會逐條依次匹配檢查,所有匹配成功的 Statement 會根據 Effect 的設定不同分為通過(Allow)、禁止(Deny),其中禁止(Deny)的優先。如果匹配成功的都為通過,該條請求即鑒權通過。如果匹配成功有一條禁止,或者沒有任何條目匹配成功,該條請求被禁止訪問。

Action

Action 分為三大類:

  • Service 層級操作,對應的是 GetService 操作,用來列出所有屬於該使用者的 Bucket 列表。
  • Bucket 層級操作,對應類似於 oss:PutBucketAcl、oss:GetBucketLocation之類的操作,操作的對象是 Bucket,它們的名稱和相應的介面名稱一一對應。
  • Object 層級操作,分為 oss:GetObject、oss:PutObject、oss:DeleteObject和oss:AbortMultipartUpload,操作對象是 Object。

如想授權某一類的 Object 的操作,可以選擇這幾種的一種或幾種。另外,所有的 Action 前面都必須加上oss:,如上面例子所示。Action 是一個列表,可以有多個 Action。具體的 Action 和 API 介面的對應關係如下:

  • Service層級
    API Action
    GetService(ListBuckets) oss:ListBuckets
  • Bucket 層級
    API Action
    PutBucket oss:PutBucket
    GetBucket(ListObjects) oss:ListObjects
    PutBucketAcl oss:PutBucketAcl
    DeleteBucket oss:DeleteBucket
    GetBucketLocation oss:GetBucketLocation
    GetBucketAcl oss:GetBucketAcl
    GetBucketLogging oss:GetBucketLogging
    PutBucketLogging oss:PutBucketLogging
    DeleteBucketLogging oss:DeleteBucketLogging
    GetBucketWebsite oss:GetBucketWebsite
    PutBucketWebsite oss:PutBucketWebsite
    DeleteBucketWebsite oss:DeleteBucketWebsite
    GetBucketReferer oss:GetBucketReferer
    PutBucketReferer oss:PutBucketReferer
    GetBucketLifecycle oss:GetBucketLifecycle
    PutBucketLifecycle oss:PutBucketLifecycle
    DeleteBucketLifecycle oss:DeleteBucketLifecycle
    ListMultipartUploads oss:ListMultipartUploads
    PutBucketCors oss:PutBucketCors
    GetBucketCors oss:GetBucketCors
    DeleteBucketCors oss:DeleteBucketCors
    PutBucketReplication oss:PutBucketReplication
    GetBucketReplication oss:GetBucketReplication
    DeleteBucketReplication oss:DeleteBucketReplication
    GetBucketReplicationLocation oss:GetBucketReplicationLocation
    GetBucketReplicationProgress oss:GetBucketReplicationProgress
  • Object 層級
    API Action
    GetObject oss:GetObject
    HeadObject oss:GetObject
    PutObject oss:PutObject
    PostObject oss:PutObject
    InitiateMultipartUpload oss:PutObject
    UploadPart oss:PutObject
    CompleteMultipart oss:PutObject
    DeleteObject oss:DeleteObject
    DeleteMultipleObjects oss:DeleteObject
    AbortMultipartUpload oss:AbortMultipartUpload
    ListParts oss:ListParts
    CopyObject oss:GetObject,oss:PutObject
    UploadPartCopy oss:GetObject,oss:PutObject
    AppendObject oss:PutObject
    GetObjectAcl oss:GetObjectAcl
    PutObjectAcl oss:PutObjectAcl
    RestoreObject oss:RestoreObject

Resource

Resource 指代的是 OSS 上面的某個具體的資源或者某些資源(支援*通配),resource的規則是acs:oss:{region}:{bucket_owner}:{bucket_name}/{object_name}。對於所有 Bucket 層級的操作來說不需要最後的斜杠和{object_name},即acs:oss:{region}:{bucket_owner}:{bucket_name}。Resource 也是一個列表,可以有多個 Resource。其中的 region 欄位暫時不做支援,設定為*

Effect

Effect 代表本條的Statement的授權的結果,分為 Allow 和 Deny,分別指代通過和禁止。多條 Statement 同時匹配成功時,禁止(Deny)的優先順序更高。

例如,期望禁止使用者對某一目錄進行刪除,但對於其他檔案有全部許可權:
{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "oss:*"
      ],
      "Resource": [
        "acs:oss:*:*:bucketname"
      ]
    },
    {
      "Effect": "Deny",
      "Action": [
        "oss:DeleteObject"
      ],
      "Resource": [
        "acs:oss:*:*:bucketname/index/*",
      ]
    }
  ]
}

Condition

Condition 代表 Policy 授權的一些條件,上面的樣本裡面可以設定對於 acs:UserAgent 的檢查、acs:SourceIp 的檢查,還有 oss:Prefix 項用來在 GetBucket 的時候對資源進行限制。

OSS 支援的 Condition 如下:

condition 功能 合法取值
acs:SourceIp 指定 ip 網段 普通的 ip,支援*通配
acs:UserAgent 指定 http useragent 頭 字串
acs:CurrentTime 指定合法的訪問時間 ISO8601格式
acs:SecureTransport 是否是 https 協議 “true”或者”false”
oss:Prefix 用作 ListObjects 時的 prefix 合法的object name

最佳實務

OSS提供了RAM策略編輯器協助您快速產生RAM Policy。您也可以使用圖形化管理工具 ossbrowser 的簡化 Policy 授權,一鍵完成對子帳號授予特定 Bucket 或特定目錄的許可權 。

針對具體情境更多的授權策略配置樣本,可以參考教程樣本:控制儲存空間和檔案夾的存取權限OSS 授權常見問題