human: 如何处理七牛云的对象存储使用 Bucket Policy 授权

gpt: [对象存储](https://developer.qiniu.com/kodo) > 使用指南 >
[开发指南](https://developer.qiniu.com/kodo/development_guidelines/8596/development-
guidelines) > [AWS S3
兼容](https://developer.qiniu.com/kodo/development_guidelines/4086/aws-s3-compatible)
> [兼容
API](https://developer.qiniu.com/kodo/development_guidelines/4087/compatible-s3-api)
> 使用 Bucket Policy 授权

#  使用 Bucket Policy 授权

最近更新时间: 2024-05-22 14:43:36

Bucket Policy 是基于资源的授权策略，常见的应用场景如下：

  * 向其他账号授权访问。  
您可以授予其他账号访问您对象存储资源的权限。

  * 授予带特定 IP 条件限制的访问权限。  
某些场景下，您需要授予带 IP
限制的访问策略。例如，企业内部的机密文档，只允许在企业内部访问，不允许在其他区域访问。由于企业内部人员较多，如果针对每个人配置子账号，工作量非常大。此时，您可以基于
Bucket Policy 设置带 IP 限制的访问策略，从而高效方便地进行授权。

Bucket Policy 使用限制

  * 只有 Bucket 拥有者可以设置 Bucket Policy
  * 每个 Bucket 默认最多设置 20条 Bucket Policy，超出限制服务端返回 400：too many statement in policy
  * 每个 Bucket 的 Policy 总内容大小限制为 20KB，超出限制服务端返回 400：EntityTooLarge

# **策略模型**

Bucket Policy 是一组规定谁能以什么样的权限访问 Bucket/Object 的策略。  
Policy 可定义的内容包括：

  * 版本（Version）：请指定为 2024-05-20
  * 资源（Resource） 
    * Bucket
    * 资源/Object：单个 Object key 或 Prefix 指定
  * 权限（Action）：每个 Action 对应一组 API 
    * 分别定义有 Bucket 级别和 Object 级别的 Action
    * 详见 支持的权限列表
  * 用户（Principal）：被授权者 
    * 全部用户（不含匿名账户）
    * 指定用户
  * 效果（Effect） 
    * Deny，禁止权限，优先级高于 Allow
    * Allow，允许权限
  * 条件（Condition） 
    * 支持的运算符 
      * IpAddress：IP 列表，支持指定地址或地址段
      * NotIpAddress：排除的 IP 列表，支持指定地址或地址段
      * StringLike：字符串匹配（区分大小写），值可以包含 ? 和 * 通配符。如需匹配字符本身需添加 `${}` 进行转义，即定义为 `${*}` 和 `${?}`；如需匹配 `$` 转义符本身，需定义为 `${$}`
      * StringNotLike：字符串否定匹配（区分大小写），值可以包含 ? 和 * 通配符。如需匹配字符本身需添加 `${}` 进行转义，即定义为 `${*}` 和 `${?}`；如需匹配 `$` 转义符本身，需定义为 `${$}`
      * StringEquals：字符串精确匹配（区分大小写），值不支持通配符
      * StringNotEquals：字符串精确否定匹配（区分大小写），值不支持通配符
    * 条件按键 
      * aws:SourceIp：可使用运算符 IpAddress、NotIpAddress
      * aws:Referer、aws:Host、aws:AccessKey、s3:Prefix：可使用运算符 StringLike、StringNotLike、StringEquals、StringNotEquals；其中 s3:Prefix 仅限用于 ListBucket action 的授权。

# **策略声明格式**

Bucket Policy声明样例如下：

    
    
    {
    "Version":"2024-05-20", 
    "Id": "samplepolicy",
    "Statement" : [
        {
            "Sid":"AddPerm",  
            "Effect":"Allow", 
            "Principal" : {  
                "AWS":["111122223333","444455556666","iam::111122223333:3984935484"]
             },
            "Action":["s3:*"],  
            "Resource":"arn:aws:s3:::bucket/*",    
            "Condition": {   
               "IpAddress": {"aws:SourceIp": ["54.240.143.0/24","2001:DB8:1234:5678::/64","1.1.1.1"]},
               "NotIpAddress": {"aws:SourceIp": "54.240.143.188/32"},
               "StringLike": {
    				     "aws:Referer": ["*.uuci.net",""],
    				     "aws:Host": ["fly.uuci.net",""]			        
               }
        },
       {},...
     ]
    }
    

字段说明：

字段 | 必填 | 说明 | 样例  
---|---|---|---  
Version | 是 | 请指定为 2024-05-20 | `"Version":"2024-05-20"`  
Resource | 是 | 授权资源，可以是 Bucket 或 Object，以字符串或字符串列表表示，大小写敏感：`"arn:aws:s3:::<bucket>"`，`"arn:aws:s3:::<bucket>/<key_regex>"`。  

* Object 支持正则表达式。Object 名支持通配符 * 和 ?，如需匹配字符本身需添加 `${}` 进行转义，即定义为 `${*}` 和 `${?}`；如需匹配 `$` 转义符本身，需定义为 `${$}`。  

* 如果不带/ 认为是 bucket 形式, 否则认为是 object 形式。  

* 指定为 Bucket 时, 要求包含至少一个 Bucket 级别的 Action；指定为 Object 时，则要求包含至少一个 Object 级别的 Action。
| `"Resource":["arn:aws:s3:::examplebucket"]`  
`"Resource":["arn:aws:s3:::examplebucket/abc/*"]`  
`"Resource":"arn:aws:s3:::examplebucket/* "`  
`"Resource":"arn:aws:s3:::examplebucket/ab?df* "`  
Action | 是 | 权限，仅限使用系统定义的 Action 名来设置，支持指定多个 Action，格式为字符串 | `"Action":["s3:PutObject","s3:GetObject","s3:DeleteObject"]`  
`"Action":"s3:*"`  
Principal | 是 | 被授权者，以七牛云账号的用户 id 表示，支持指定多个用户：`"AWS":<id>`，`"AWS":<id list>`。AWS必须大写。  

* IAM 用户 id 的格式为 `iam::<root_id>:<iamid>`。  

* 当 Bucket 拥有者被 Principal 指定时，Bucket 拥有者也会被策略限制；但是 Bucket 拥有者可以修改 Policy 来解除限制。
| `"Principal":{"AWS":["11","22"]}`  
`"Principal":{"AWS":["iam::111111:123123"]}`  
`"Principal":{"AWS":"*"}`  
Effect | 是 | 效果，可以设置为允许（Allow）或拒绝（Deny），大小写敏感。  

* 拒绝优先级高于允许；其他字段都匹配成功后，Effect字段才生效。
| `"Effect":"Allow"`  
Condition | 否 | 策略生效条件。目前支持 IpAddress、NotIpAddress、StringLike、StringNotLike、StringEquals、StringNotEquals 六种运算符，aws:SourceIp、aws:Referer、aws:Host、aws:AccessKey、s3:Prefix 五种条件键；均大小写敏感。  

* IpAddress 和 NotIpAddress 支持指定多个IP地址或地址段：`"IpAddress":{"aws:SourceIp":<IP>}`,`"IpAddress":{"aws:SourceIp":<IP segment>}`。  

* StringLike、StringNotLike、StringEquals、StringNotEquals 支持设定 aws:Referer、aws:Host 和 aws:AccessKey，来实现对请求 Referer、Host 和 AccessKey 的校验；StringLike、StringNotLike 的设置支持空、每个值最多包含1个多字符匹配的通配符 * 或 ?。如需匹配字符本身需添加 `${}` 进行转义，即定义为 `${*}` 和 `${?}`；如需匹配 `$` 转义符本身，需定义为 `${$}`。  

* StringLike、StringNotLike、StringEquals、StringNotEquals 支持设定 s3:prefix，且必须配合 Action s3:ListBucket 授权。
| `"Condition": {`  
`"IpAddress": {"aws:SourceIp":["54.240.143.0/24", "1.1.1.1"] },`  
`"NotIpAddress": {"aws:SourceIp": "54.240.143.188/32"},`  
`"StringLike": {`  
`"aws:Referer": ["*.uuci.net",""],`  
`"aws:Host": ["fly.uuci.net",""]`  
`}`  
`}`  
  
# **支持的权限列表**

Bucket Policy 的权限分为 Bucket 和 Object 两类，对应的 API相互独立，目前支持的权限列表如下：

Action | API | Level  
---|---|---  
s3:DeleteBucket | DELETE Bucket | Bucket  
s3:ListBucket | GET Bucket(List Objects)，HEAD Bucket | Bucket  
s3:GetBucketLocation | Get bucket location | Bucket  
s3:ListBucketMultipartUploads | List Multipart Uploads | Bucket  
s3:DeleteObject | DELETE Object, DELETE Multiple Object | Object  
s3:GetObject | GET Object, HEAD Object | Object  
s3:PutObject | PUT Object, POST Object, Initiate Multipart Upload, Upload Part, Complete Multipart Upload, PUT Object-Copy | Object  
s3:AbortMultipartUpload | Abort Multipart Upload | Object  
s3:ListMultipartUploadParts | List Parts | Object  
s3:* | All API above | Bucket、Object  
  
说明：

  * 不支持 Upload Part-copy 授权；PUT Object-Copy 需要对 src object 有读权限，对 dst object 有写权限
  * Action 和 Resource 需要匹配，否则无法设置，服务端返回错误：Action does not apply to any resource(s) in statement 
    * Level 为 Bucket 时，Resource 必须指定 Bucket
    * Level 为 Object 时，Resource 必须指定具体的 Object 或是 Prefix
  * 想要授予空间及其对象的完全控制权限时， 
    * 针对 Bucket 设置 Action 为`s3:* `
    * 同时针对 Bucket 下所有的 Object 设置 Action 为`s3:* `

# **Bucket Policy API**

## **设置 Bucket Policy**

本接口支持 Bucket Policy 的新增和修改操作。

### **请求**

**语法**

    
    
    PUT /?policy HTTP/1.1
    Host: <s3空间名>.s3.cn-east-1.qiniucs.com
    Date: Tue, 04 Apr 2019 20:34:56 GMT  
    Authorization: authorization string
    
    { Policy in JSON format }
    

**请求元素**  
Policy 声明。  
  

### **响应**

**响应码**  
与 AWS 一致。

**响应元素**  
该请求操作的响应体为空。  
  

## **查询 Bucket Policy**

本接口支持查询指定空间已设置的 Policy 信息。

### **请求**

**语法**

    
    
    GET /?policy HTTP/1.1
    Host: <s3空间名>.s3.cn-east-1.qiniucs.com
    Date: Tue, 04 Apr 2019 20:34:56 GMT  
    Authorization: authorization string
    

**请求元素**  
该请求操作的请求体为空。  
  

### **响应**

**响应码**  
与AWS一致。

**响应元素**  
Policy in JSON format。可参见 Bucket Policy声明样例  
  

## **删除 Bucket Policy**

本接口支持一键删除指定空间的所有 Policy 信息。

### **请求**

**语法**

    
    
    DELETE /?policy HTTP/1.1
    Host: <s3空间名>.s3.cn-east-1.qiniucs.com
    Date: Tue, 04 Apr 2019 20:34:56 GMT  
    Authorization: authorization string
    

**请求元素**  
该请求操作的请求体为空  
  

### **响应**

**响应码**  
与 AWS 一致。

**响应元素**  
该请求操作的响应体为空。

以上内容是否对您有帮助？