访问策略语言概述

最近更新时间: 2024-10-17 17:10:00

概述

访问策略可用于授予访问 COS 资源的权限。访问策略使用基于 JSON 的访问策略语言。您可以通过访问策略语言授权指定委托人(principal)对指定的 COS 资源执行指定的操作。

访问策略中的元素

访问策略语言包含以下基本意义的元素:

  • 委托人(principal):描述策略授权的实体。例如用户(开发商、子账号、匿名用户)、用户组等。该元素对于存储桶访问策略有效,对用户访问策略则不应添加。

  • 语句(statement):描述一条或多条权限的详细信息。该元素包括效力、操作、资源等多个其他元素的权限或权限集合。一条策略有且仅有一个语句元素。

    • 效力(effect):描述声明产生的结果是“允许”还是“显式拒绝”,包括 allow 和 deny 两种情况。该元素是必填项。

    • 操作(action):描述允许或拒绝的操作。操作可以是 API(以 name 前缀描述)或者功能集(一组特定的 API,以 permid 前缀描述)。该元素是必填项。

    • 资源(resource):描述授权的具体数据。资源是用六段式描述。每款产品的资源定义详情会有所区别。有关如何指定资源的信息,请参阅您编写的资源声明所对应的产品文档。该元素是必填项。

元素用法

元素用法

委托人 principal 元素用于指定被允许或拒绝访问资源的用户、账户、服务或其他实体。元素 principal 仅在存储桶中起作用;用户策略中不必指定,因为用户策略直接附加到特定用户。下面是指定 principal 的示例。

"principal": {
  "qcs": [
    "qcs::cam::uin/1:uin/1"
  ]
}

授予匿名用户权限:

"principal": {
  "qcs": [
    "qcs::cam::anonymous:anonymous"
  ]
}

授权主账户 UIN 1200000313 权限:

"principal": {
  "qcs": [
    "qcs::cam::uin/1200000313:uin/1200000313"
  ]
}

授权子账户 UIN 3030313(主账户 UIN 为 1200000313)权限:

注意:

操作前需确保子账号已被添加到主账号的子账号列表中。

"principal": {
  "qcs": [
    "qcs::cam::uin/1200000313:uin/3030313"
  ]
}

指定效力

如果没有显式授予(允许)对资源的访问权限,则隐式拒绝访问。您也可显式拒绝(deny)对资源的访问,这样可确保用户无法访问该资源,即使有其他策略授予了访问权限的情况下也是如此。下面是指定允许效力的示例。

"effect" : "allow"

指定操作

COS 定义了可在策略中指定的某一个特定的 COS 操作,指定的操作与发起的 API 请求操作完全一致。

存储桶操作

描述 对应的 API 接口
name/cos:GetService GET Service
name/cos:GetBucket GET Bucket (List Object)
name/cos:PutBucket PUT Bucket
name/cos:DeleteBucket DELETE Bucket
name/cos:HeadBucket HEAD Bucket
name/cos:GetBucketPolicy GET Bucket Policy
name/cos:PutBucketPolicy PUT Bucket Policy
name/cos:DeleteBucketPolicy DELETE Bucket Policy
name/cos:GetBucketACL GET Bucket ACL
name/cos:PutBucketACL PUT Bucket ACL
name/cos:ListMultipartUploads LIST in-progress multipart uploads

对象操作

描述 对应的 API 接口
name/cos:GetObject GET Object
name/cos:PutObject PUT Object
name/cos:HeadObject HEAD Object
name/cos:DeleteObject DELETE Object
name/cos:PutObjectCopy COPY Object
name/cos:PostObject POST Object
name/cos:GetObjectACL GET Object ACL
name/cos:PutObjectACL PUT Object ACL
name/cos:InitiateMultipartUpload Initiate a multipart upload
name/cos:UploadPart Upload a part in a multipart upload
name/cos:CompleteMultipartUpload Complete a multipart upload
name/cos:AbortMultipartUpload Abort a multipart upload

指定允许操作的示例如下:

"action": [
  "name/cos:GetObject",
  "name/cos:HeadObject"
]

指定资源

资源(resource)元素描述一个或多个操作对象,如 COS 存储桶或对象等。所有资源均可采用下述的六段式描述方式。

qcs:project_id:service_type:region:account:resource

其中:

  • qcs 是 qcloud service 的简称。

  • project_id 描述项目信息,仅为了兼容 CAM 早期逻辑。这里请不填。

  • service_type 描述产品简称,如 COS。

  • region 描述地域信息。

  • account 描述资源拥有者的根账号信息。目前支持两种方式描述的资源拥有者。一种方式是 uin 方式,即根账号的 qq 号,表示为 uin/${uin},如 uin/164256472。另外一种方式是 uid 方式,即根账号的 appid,表示为 uid/${appid},如 uid/1000382392。目前 COS 的资源拥有者统一使用 uid 的方式表述,即根账号的开发商 appid。

  • resource 描述具体资源详情,在 COS 服务中使用存储桶 XML API 访问域名来描述。

下面是指定存储桶 burningtest-1251500699 的示例。

"resource": ["qcs::cos:ap-guangzhou:uid/1251500699:burningtest-1251500699/*"]

下面是指定存储桶 burningtest-1251500699 中的 /test/ 文件夹下所有对象的示例。

"resource": ["qcs::cos:ap-guangzhou:uid/1251500699:burningtest-1251500699/test/*"]

下面是指定存储桶 burningtest-1251500699 中的 /test/1.txt 对象的示例。

"resource": ["qcs::cos:ap-guangzhou:uid/1251500699:burningtest-1251500699/test/1.txt"]

实际案例

当根账号允许匿名用户,在访问来源 IP 为 101.226..185/101.226..186 时,对华南地区存储桶 burningtest-1251500699 中的对象,执行 GET(下载)和 HEAD 操作,而无需鉴权。

{
   "version": "2.0",
   "principal": {
      "qcs": [
         "qcs::cam::anonymous:anonymous"
      ]
   },
    "statement": [
        {
            "action": [
                "name/cos:GetObject",
                "name/cos:HeadObject"
            ],
            "effect": "allow",
            "resource": [
                "qcs::cos:cn-south:uid/1251500699:burningtest-1251500699/*"
            ]
        }
    ]
}