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>" 。${} 进行转义,即定义为 ${*} 和 ${?} ;如需匹配 $ 转义符本身,需定义为 ${$} 。 |
"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::<root_id>:<iamid> 。 |
"Principal":{"AWS":["11","22"]} "Principal":{"AWS":["iam::111111:123123"]} "Principal":{"AWS":"*"} |
Effect | 是 | 效果,可以设置为允许(Allow)或拒绝(Deny),大小写敏感。 |
"Effect":"Allow" |
Condition | 否 | 策略生效条件。目前支持 IpAddress、NotIpAddress、StringLike、StringNotLike、StringEquals、StringNotEquals 六种运算符,aws:SourceIp、aws:Referer、aws:Host、aws:AccessKey、s3:Prefix 五种条件键;均大小写敏感。"IpAddress":{"aws:SourceIp":<IP>} ,"IpAddress":{"aws:SourceIp":<IP segment>} 。${} 进行转义,即定义为 ${*} 和 ${?} ;如需匹配 $ 转义符本身,需定义为 ${$} 。 |
"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 设置 Action 为
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 一致。
响应元素
该请求操作的响应体为空。
文档反馈
(如有产品使用问题,请 提交工单)