对象存储

  • 对象存储 > 使用指南 > 开发指南 > AWS 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
    • 用户(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 一致。

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

    以上内容是否对您有帮助?
  • Qvm free helper
    Close