Bucket Policy

更新时间:
复制 MD 格式

Bucket Policy是附加在存储空间(Bucket)上的授权策略。当需要授权其他阿里云账号、RAM用户或匿名用户访问Bucket时,可通过Bucket Policy定义访问规则,实现跨账号授权、匿名访问控制和基于IP/VPC的访问限制。

工作原理

Bucket Policy采用基于资源的授权模式,策略直接附加在Bucket上,定义哪些主体(Principal)在满足哪些条件(Condition)时,可对哪些资源(Resource)执行哪些操作(Action)。

用户发起访问请求时,OSS会综合评估所有相关策略(包括Bucket PolicyRAM Policy),权限判定遵循显式拒绝优先原则:任何一条明确的Deny规则都会立即阻止请求执行,该优先级高于所有Allow策略;若无Deny也无Allow,则请求默认被拒绝。

Bucket PolicyBucket Owner有特殊的生效规则:

  • Principal设置为通配符(*)且 不包含Condition ,策略仅对Bucket Owner以外的用户生效

  • Principal设置为通配符(*)且 包含Condition ,策略对所有用户生效,包括Bucket Owner和匿名用户——选择拒绝访问,Bucket Owner自身也会被拒绝,可能导致整个Bucket无法访问;选择允许访问,匿名用户也会被允许,可能导致数据公开暴露。

为同一用户配置多条Bucket Policy规则时,该用户拥有的权限是所有规则的叠加,遵循拒绝优先原则。

重要
  • acs:SourceIp条件关键字仅匹配请求的源IP地址,不区分该IP来自公网还是VPC内网。这意味着,如果仅使用acs:SourceIp限制访问,其他VPC中恰好使用相同IP地址段的请求也会被匹配放行,存在越权访问风险。因此,配置Bucket Policy时,如果配置了acs:SourceIp,必须同时配置acs:SourceVpc来明确请求的网络来源。

  • 该约束仅对新增Bucket Policy生效,存量Bucket Policy不受影响。但修改存量Bucket Policy等同于提交新的Bucket Policy,同样受此约束。

配置Bucket的授权策略

OSS提供图形化和语法策略两种配置方式,满足不同场景的配置需求。

  • 图形策略方式:提供直观的操作体验,通过表单化配置覆盖常见授权场景,降低配置门槛。

  • 语法策略方式:采用JSON格式编写完整策略,支持所有高级功能和复杂条件组合,提供最大的配置灵活性。通过语法策略添加或修改授权策略后,图形策略视图会同步显示对应策略条目,两种方式配置的策略相互联动。策略中的 Resource 字段用于限定授权的作用范围。

图形策略方式

  1. 前往Bucket列表,单击目标Bucket。

  2. 在左侧菜单栏单击权限控制 > Bucket授权策略

  3. 选择按图形策略添加,然后单击新增授权,配置授权内容。

    配置项

    说明

    授权资源

    选择授权对象是整个Bucket还是指定资源

    资源路径

    • 授权资源选择整个Bucket时,资源路径bucket-name/*

    • 授权资源选择指定资源时,填写待授权资源的目录或单个Object,支持添加多条记录。

    授权用户

    指定被授权对象。

    • 所有账号(*):授权对象为任何人(包括匿名访问者)。

    • 子账号:选择当前阿里云账号下的RAM用户。

      当前登录账号必须是阿里云主账号或拥有此Bucket管理权限及RAM控制台ListUsers权限的RAM用户,否则无法查看当前账号的RAM用户列表。

    • 其他账号:填写其他待授权账号、子账号的UID或以arn:sts开头的临时授权用户(如arn:sts::1798************:assumed-role/role-name/session-name)。支持授权给多个用户,一行填写一个。

      当被授权的对象是RAM角色时,该账号无法通过OSS控制台访问授权资源,需通过命令行工具ossutil、SDK、API等方式进行访问。

    授权操作

    • 简单设置:选择常见的授权操作组合,可选的设置项包括只读(不包含ListObject操作)只读(包含ListObject操作)读/写完全控制拒绝访问

    • 高级设置:自定义授权效力允许拒绝)和授权操作

    条件(可选)

    设置授权的生效条件。

    • 访问方式:可选项包括HTTPSHTTP。勾选后,仅当以选择的方式访问时,策略生效。

    • IP =:填写IP列表。勾选后,仅当访问IP在填写的IP列表内时,策略生效。

    • IP ≠:填写IP列表。勾选后,仅当访问IP不在填写的IP列表内时,策略生效。

    • VPC =:选择当前账号的VPC或填写其他账号的VPC。勾选后,仅当从指定的VPC访问时,策略生效。

    • VPC ≠:选择当前账号的VPC或填写其他账号的VPC。勾选后,仅当不从指定的VPC访问时,策略生效。

    当配置多个条件时,所有条件必须同时满足(AND关系),策略才会生效。

  4. 确认授权配置无误后,单击确定,应用Bucket Policy。

语法策略方式

  1. 前往Bucket列表,单击目标Bucket。

  2. 在左侧菜单栏单击权限控制 > Bucket授权策略

  3. 选择按语法策略添加,然后单击编辑,在编辑框内输入JSON格式的授权策略。

    示例授权策略:对于用户20214760404935xxxx,如果访问请求不是来自VPC网络vpc-t4nlw426y44rd3iq4xxxx,则拒绝其对example-bucket的所有操作。

    {
        "Version": "1",
        "Statement": [
            {
                "Sid": "DenyNonVpcAccess",
                "Effect": "Deny",
                "Action": "oss:*",
                "Principal": [
                    "20214760404935xxxx"
                ],
                "Resource": [
                    "acs:oss:*:174649585760xxxx:example-bucket",
                    "acs:oss:*:174649585760xxxx:example-bucket/*"
                ],
                "Condition": {
                    "StringNotEquals": {
                        "acs:SourceVpc": "vpc-t4nlw426y44rd3iq4xxxx"
                    }
                }
            }
        ]
    }

    完整的授权策略包含Version(版本号)和Statement(授权语句)。

    • Version:权限策略版本,固定为1,不允许修改。

    • Statement:策略语句的主体,包含一条或多条具体的授权/拒绝规则。每条授权语句支持Sid(可选)、Effect(授权效力)、Action(授权操作)、Principal(授权主体)、Resource(授权资源)和Condition(授权条件)。

      策略元素

      说明

      示例授权策略中的含义

      Sid(可选)

      语句ID,用于为策略中的每条语句提供可读的唯一标识,方便区分、管理和审计,不影响权限本身的生效。

      标识该拒绝语句为DenyNonVpcAccess

      Effect

      策略的效力,可选值为Allow(允许)或Deny(拒绝)。

      拒绝请求。

      Action

      对资源执行的具体操作,支持使用通配符*

      拒绝所有OSS操作(oss:*)。

      Principal

      策略作用的主体(用户、账号、角色等)。

      Principal字段配置为空列表(即Principal:[])时,其行为与配置为所有账号(即Principal:["*"])完全相同。

      策略仅对RAM用户20214760404935xxxx生效。

      Resource

      策略作用的资源范围。

      策略作用于example-bucket本身及其下的所有对象文件。

      Condition

      策略生效的条件。

      当配置多个条件时,所有条件必须同时满足(AND关系),策略才会生效。

      仅当请求的来源VPC不等于vpc-t4nlw426y44rd3iq4xxxx时,此Deny策略才生效。

      完整的授权元素列表请参见授权语法与元素

  4. 确认授权策略无误后,单击保存,根据页面提示保存授权策略。

语法策略可仅指定单个或多个 Action(如oss:DeleteObject),相比图形策略简单设置的完全控制oss:*)权限范围更小。图形策略高级设置也可指定具体操作,达到同等粒度。如需查看具体操作对应的权限,请参见 OSS API 接口列表。

配置向量Bucket的授权策略

向量Bucket目前只支持语法策略方式配置Bucket Policy。

  1. 前往向量Bucket列表,单击目标向量Bucket。

  2. 在左侧菜单栏单击权限控制 > Bucket授权策略

  3. 单击编辑,在编辑框内输入JSON格式的授权策略。

    示例授权策略:对于vector-bucket-example中的索引表indextest,授予用户20816353761158****读写向量数据的权限。

    {
      "Version": "1",
      "Statement": [{
        "Effect": "Allow",
        "Action": [
          "oss:PutVectors",
          "oss:GetVectors"
        ],
        "Principal": [
          "20816353761158****"
        ],
        "Resource": [
          "acs:ossvector:*:*:vector-bucket-example/indextest"
        ]
      }]
    }

    完整的授权策略包含Version(版本号)和Statement(授权语句)。

    • Version:权限策略版本,固定为1,不允许修改。

    • Statement:策略语句的主体,包含一条或多条具体的授权/拒绝规则。每条授权语句包含Effect(授权效力)、Action(授权操作)、Principal(授权主体)、Resource(授权资源)和Condition(授权条件)。

      策略元素

      说明

      示例授权策略中的含义

      Effect

      策略的效力,可选值为Allow(允许)或Deny(拒绝)。

      允许请求。

      Action

      对资源执行的具体操作,支持使用通配符*

      读写向量数据。

      Principal

      策略作用的主体(用户、账号、角色等)。

      Principal字段配置为空列表(即Principal:[])时,其行为与配置为所有账号(即Principal:["*"])完全相同。

      策略仅对RAM用户20816353761158****生效。

      Resource

      策略作用的资源范围。

      策略作用于vector-bucket-example中的索引表indextest

      Condition

      策略生效的条件。

      当配置多个条件时,所有条件必须同时满足(AND关系),策略才会生效。

      无。

      完整的授权元素列表请参见授权语法与元素

  4. 确认授权策略无误后,单击保存,根据页面提示保存授权策略。

配置OSS-HDFS的授权策略

为确保OSS-HDFS服务用户能正常访问.dlsdata/目录及其下的任意Object,在为开通了OSS-HDFS服务的Bucket配置Bucket Policy时,禁止设置拒绝访问的授权操作,详见OSS-HDFS使用前须知

如果因安全需要必须限制指定网络 IP 地址或 VPC 访问时,所有Deny配置对应的Condition中必须添加以下条件,以确保OSS-HDFS后台服务能够通过经典网络正常读写Bucket。

"StringNotLike": {
    "oss:ClassicIntranet": [
        "true"
    ]
}

常见授权场景-权限授予

以下场景展示了如何通过Bucket Policy为指定用户、角色或所有访问者授予访问权限。每个场景提供完整的策略配置示例,可根据实际需求进行调整。

场景1:授予指定RAM用户读写权限

当需要允许团队成员或合作方的指定成员上传、下载、管理存储空间中的文件时,可通过Bucket Policy为对应的RAM用户统一授予权限。以下示例授予指定RAM用户(UID27737962156157xxxx20214760404935xxxx)对目标存储空间(example-bucket)的读写权限。

说明

由于以下策略未授予RAM用户列举存储空间的权限,指定RAM用户无法在Bucket列表页面查看所有Bucket并点击进入目标Bucket。指定RAM用户可在控制台左侧菜单栏的我收藏的路径 > +添加并访问目标Bucket。

{
    "Version":"1",
    "Statement":[
        {
            "Effect":"Allow",
            "Action":[
                "oss:GetObject",
                "oss:PutObject",
                "oss:GetObjectAcl",
                "oss:PutObjectAcl",
                "oss:AbortMultipartUpload",
                "oss:ListParts",
                "oss:RestoreObject",
                "oss:GetVodPlaylist",
                "oss:PostVodPlaylist",
                "oss:PublishRtmpStream",
                "oss:ListObjectVersions",
                "oss:GetObjectVersion",
                "oss:GetObjectVersionAcl",
                "oss:RestoreObjectVersion"
            ],
            "Principal":[
                "27737962156157xxxx",
                "20214760404935xxxx"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket/*"
            ]
        },
        {
            "Effect":"Allow",
            "Action":[
                "oss:ListObjects"
            ],
            "Principal":[
                "27737962156157xxxx",
                "20214760404935xxxx"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket"
            ],
            "Condition":{
                "StringLike":{
                    "oss:Prefix":[
                        "*"
                    ]
                }
            }
        }
    ]
}

场景2:授予指定RAM用户对指定目录的只读权限

当需要保护存储空间中的特定项目文件不被篡改,但允许相关项目成员读取这些文件时,可为对应的RAM用户授予只读权限。以下示例授予指定RAM用户(UID20214760404935xxxx)对目标存储空间(example-bucket)下指定目录(前缀为hangzhou/2020shanghai/2015)的只读权限。

说明

由于以下策略未授予RAM用户列举存储空间的权限,指定RAM用户无法在Bucket列表页面查看所有Bucket并点击进入目标Bucket。指定RAM用户可在控制台左侧菜单栏的我收藏的路径 > +添加并访问目标Bucket。

{
    "Version":"1",
    "Statement":[
        {
            "Action":[
                "oss:GetObject",
                "oss:GetObjectAcl",
                "oss:GetObjectVersion",
                "oss:GetObjectVersionAcl"
            ],
            "Effect":"Allow",
            "Principal":[
                "20214760404935xxxx"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket/hangzhou/2020/*",
                "acs:oss:*:174649585760xxxx:example-bucket/shanghai/2015/*"
            ]
        },
        {
            "Action":[
                "oss:ListObjects",
                "oss:ListObjectVersions"
            ],
            "Condition":{
                "StringLike":{
                    "oss:Prefix":[
                        "hangzhou/2020/*",
                        "shanghai/2015/*"
                    ]
                }
            },
            "Effect":"Allow",
            "Principal":[
                "20214760404935xxxx"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket"
            ]
        }
    ]
}

场景3:授予指定RAM用户查看存储空间并列举文件的权限

当需要让团队或合作方的指定成员查看存储空间的所有信息并列举其中的文件时,可通过Bucket Policy为对应的RAM用户授予相应权限。以下示例授予指定RAM用户查看目标存储空间(example-bucket)的所有信息并列举其中文件的权限。

说明

由于以下策略未授予RAM用户列举存储空间的权限,指定RAM用户无法在Bucket列表页面查看所有Bucket并点击进入目标Bucket。指定RAM用户可在控制台左侧菜单栏的我收藏的路径 > +添加并访问目标Bucket。

{
    "Version":"1",
    "Statement":[
        {
            "Action":[
                "oss:Get*",
                "oss:ListObjects",
                "oss:ListObjectVersions"
            ],
            "Effect":"Allow",
            "Principal":[
                "20214760404935xxxx"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket"
            ]
        }
    ]
}

场景4:授予指定RAM角色读取文件的权限

当需要允许RAM用户或应用程序临时访问存储空间文件时,可创建RAM角色并授予相应权限。RAM用户或应用程序通过扮演该角色,获得读取存储空间文件的临时访问凭证。以下示例为一个阿里云账号下的1RAM角色下的所有会话以及1RAM角色下的指定会话授予读取存储空间(example-bucket)下所有文件的权限。

说明

RAM角色授权时,Principal需要遵循以下格式:arn:sts::<uid>:assumed-role/<role-name>/<session-name>。其中,<role-name>以及<session-name>的值应该全为小写。

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "oss:GetObject"
            ],
            "Effect": "Allow",
            "Principal": [
                "arn:sts::10323xxxxx72056:assumed-role/role-name/session-name",
                "arn:sts::10323xxxxx72056:assumed-role/role2-name/*"
            ],
            "Resource": [
                "acs:oss:*:10323xxxxx72056:example-bucket/*"
            ]
        }
    ]
}

场景5:授予所有访问者列举所有文件的权限

当存储空间用于公共资源共享,需要让所有访问者都能查看文件名但不能访问文件实际内容时,可设置Principal为通配符星号(*),并为其授予列举所有文件的权限。以下示例授予所有访问者列举目标存储空间(example-bucket)下所有文件的权限。

{
    "Version":"1",
    "Statement":[
        {
            "Action":[
                "oss:ListObjects",
                "oss:ListObjectVersions"
            ],
            "Effect":"Allow",
            "Principal":[
                "*"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket"
            ]
        }
    ]
}

场景 6:ECS 内网免 AK 访问 OSS

当需要通过同地域 ECS 的内网 Endpoint 访问 OSS 时,是否需要额外授权取决于目标存储空间的读写权限:

  • 公共读存储空间:ECS 可直接通过内网 URL 访问,无需额外配置 Bucket Policy。

  • 私有存储空间:需在 Bucket Policy 中使用 acs:SourceVpc 条件关键字配置 VPC 授权,允许来自 ECS 所在 VPC 的访问请求。

内网 URL 格式如下,请将 bucketname 替换为目标存储空间名称,将 <region> 替换为 Bucket 所在地域(如 cn-hangzhou):

https://bucketname.oss-<region>-internal.aliyuncs.com/objectname

可通过以下命令验证内网访问是否正常:

curl -I https://bucketname.oss-<region>-internal.aliyuncs.com/objectname

若返回 403 AccessDenied,说明当前 ECS 所在 VPC 尚未被 Bucket Policy 授权,请按以下步骤排查:

  1. 前往Bucket列表,单击目标 Bucket。

  2. 在左侧菜单栏单击权限控制 > Bucket授权策略,单击新增授权

  3. 配置授权条件,选择VPC =,指定 ECS 实例所在的 VPC。

  4. 确认授权配置无误后,单击确定,应用 Bucket Policy。

  5. 确认 ECS 实例使用内网 Endpoint(而非公网 Endpoint)发起访问请求。

  6. 重新执行 curl 命令验证。若仍返回 403,检查 Bucket Policy 中 VPC 条件填写的 VPC ID 是否与 ECS 实例所在 VPC ID 一致。

常见授权场景-网络访问限制

以下场景展示了如何通过Bucket Policy基于网络来源(公网IP、VPC)限制对存储空间的访问。配置涉及IPVPC条件时,需使用acs:SourceIpacs:SourceVpc条件关键字。下表列出了常见的网络限制需求、策略设计思路和对应的配置场景,帮助快速理解各场景的区别并定位适合的配置方案。

允许的访问来源

策略思路

对应场景

任意VPC

拒绝SourceVpc不以vpc-*开头的请求

场景1:限制无法从公网访问

指定VPC

拒绝SourceVpc不等于指定VPC ID的请求

场景2:限制只能从指定VPC访问

指定公网IP

语句1拒绝非指定IP的公网请求;语句2拒绝所有VPC请求

场景3:限制只能从指定公网IP地址访问

指定VPC内的指定IP

语句1拒绝非指定VPC的请求;语句2拒绝指定VPC内非指定IP段的请求

场景4:限制只能从指定VPC的指定IP地址网段访问

指定公网IP或指定VPC

语句1拒绝非指定IP的公网请求;语句2拒绝非指定VPCVPC请求

场景5:限制只能从指定公网IP地址或指定VPC访问

除指定IP外(黑名单)

拒绝指定IP的请求,SourceVpc用通配符*满足约束

场景6:设置IP黑名单

经典网络

允许经典网络访问

场景8:设置经典网络访问

场景1:限制无法从公网访问

当需要禁止从公网访问指定Bucket时,可使用acs:SourceVpc条件关键字创建拒绝策略语句并添加到Bucket Policy中,阻止非VPC网络的请求。公网请求会因不符合VPC网络前缀而被拒绝。以下示例拒绝除VPC网络外的所有访问者访问目标Bucket(example-bucket)。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "oss:*",
      "Principal": [
        "*"
      ],
      "Resource": [
        "acs:oss:*:174649585760xxxx:example-bucket/*",
        "acs:oss:*:174649585760xxxx:example-bucket"
      ],
      "Condition": {
        "StringNotLike": {
          "acs:SourceVpc": [
            "vpc-*"
          ]
        }
      }
    }
  ]
}

场景2:限制只能从指定VPC访问

当需要限制存储空间只能从指定VPC访问时,可使用acs:SourceVpc条件关键字创建拒绝策略语句并添加到Bucket Policy中,阻止其他VPC或公网的请求。其他VPC或公网的请求会因不符合指定VPC ID条件而被拒绝。以下示例拒绝除指定VPC(IDt4nlw426y44rd3iq4xxxx)外的所有访问者读取目标存储空间(example-bucket)的文件。

说明
  • 由于以下拒绝策略语句中Principal为通配符星号(*)且包含Condition,该拒绝策略语句会对所有访问者生效,包括Bucket Owner。

  • 以下拒绝策略语句仅用于限制访问,不会授予任何访问权限。如果授权主体没有被授予过访问权限,可添加一条允许策略语句来授予其访问权限。

{
    "Version":"1",
    "Statement":[
        {
            "Effect":"Deny",
            "Action":[
                "oss:GetObject"
            ],
            "Principal":[
                "*"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket/*"
            ],
            "Condition":{
                "StringNotEquals":{
                    "acs:SourceVpc":[
                        "vpc-t4nlw426y44rd3iq4xxxx"
                    ]
                }
            }
        }
    ]
}

场景3:限制只能从指定公网IP地址访问

当需要限制存储空间只能从指定公网IP地址访问时,需要创建两条拒绝策略语句:

  • 语句 1(拒绝非指定IP的公网请求):通过StringNotLike: acs:SourceVpc: vpc-*识别公网请求(公网请求的acs:SourceVpc值不以vpc-开头),再通过NotIpAddress: acs:SourceIp拒绝非指定IP的公网请求。两个条件同时满足时触发拒绝。

  • 语句 2(拒绝所有VPC请求):通过StringLike: acs:SourceVpc: vpc-*匹配所有VPC请求并拒绝,因为目标是只允许指定公网IP访问。

如果需要限制其他阿里云账号的 VPC 访问,可在语句 2 的 Condition 中将 vpc-* 替换为目标账号的 VPC ID(格式为 vpc-xxx,可在目标账号的 VPC 控制台获取)。acs:SourceVpc 条件键支持填写当前账号和其他阿里云账号的 VPC ID。

将以上两条拒绝策略语句添加到Bucket Policy后,满足任一条件即触发拒绝。以下示例拒绝除指定公网IP地址203.0.113.5外的所有访问者对example-bucket的读取操作。

说明
  • 由于以下拒绝策略语句中Principal为通配符星号(*)且包含Condition,该拒绝策略语句会对所有访问者生效,包括Bucket Owner。

  • 以下拒绝策略语句仅用于限制访问,不会授予任何访问权限。如果授权主体没有被授予过访问权限,可添加一条允许策略语句来授予其访问权限。

{
  "Version": "1",
  "Statement": [{
    "Effect": "Deny",
    "Action": [
      "oss:GetObject"
    ],
    "Principal": [
      "*"
    ],
    "Resource": [
      "acs:oss:*:174649585760xxxx:example-bucket/*"
    ],
    "Condition": {
      "NotIpAddress": {
        "acs:SourceIp": [
          "203.0.113.5"
        ]
      },
      "StringNotLike": {
        "acs:SourceVpc": [
          "vpc-*"
        ]
      }
    }
  },
    {
      "Effect": "Deny",
      "Action": [
        "oss:GetObject"
      ],
      "Principal": [
        "*"
      ],
      "Resource": [
        "acs:oss:*:174649585760xxxx:example-bucket/*"
      ],
      "Condition": {
        "StringLike": {
          "acs:SourceVpc": [
            "vpc-*"
          ]
        }
      }
    }
  ]
}

场景4:限制只能从指定VPC的指定IP地址网段访问

当需要限制存储空间只能从指定VPC的指定IP地址网段访问时,需要创建两条拒绝策略语句:

  • 语句 1(拒绝非指定VPC的所有请求):通过StringNotEquals: acs:SourceVpc拒绝来自其他VPC和公网的请求。

  • 语句 2(拒绝指定VPC内非指定IP段的请求):通过StringEquals: acs:SourceVpc匹配指定VPC的请求,再通过NotIpAddress: acs:SourceIp拒绝不在指定IP段内的请求。两个条件同时满足时触发拒绝。

将以上两条拒绝策略语句添加到Bucket Policy后,满足任一条件即触发拒绝。以下示例拒绝除指定VPC(IDt4nlw426y44rd3iq4xxxx)的指定IP地址网段(192.168.0.0/16)以外的所有访问者对目标存储空间(example-bucket)进行读取文件操作。

说明
  • 由于以下拒绝策略语句中Principal为通配符星号(*)且包含Condition,该拒绝策略语句会对所有访问者生效,包括Bucket Owner。

  • 以下拒绝策略语句仅用于限制访问,不会授予任何访问权限。如果授权主体没有被授予过访问权限,可添加一条允许策略语句来授予其访问权限。

{
    "Version":"1",
    "Statement":[
        {
            "Effect":"Deny",
            "Action":[
                "oss:GetObject"
            ],
            "Principal":[
                "*"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket/*"
            ],
            "Condition":{
                "StringNotEquals":{
                    "acs:SourceVpc":[
                        "vpc-t4nlw426y44rd3iq4xxxx"
                    ]
                }
            }
        },
        {
            "Effect":"Deny",
            "Action":[
                "oss:GetObject"
            ],
            "Principal":[
                "*"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket/*"
            ],
            "Condition":{
                "StringEquals":{
                    "acs:SourceVpc":[
                        "vpc-t4nlw426y44rd3iq4xxxx"
                    ]
                },
                "NotIpAddress":{
                    "acs:SourceIp":[
                        "192.168.0.0/16"
                    ]
                }
            }
        }
    ]
}

场景5:限制只能从指定公网IP地址或指定VPC访问

当需要限制存储空间只能从指定公网IP地址或指定VPC访问时,需要创建两条拒绝策略语句:

  • 语句 1(对公网请求,拒绝非指定IP):通过StringNotLike: acs:SourceVpc: vpc-*识别公网请求,再通过NotIpAddress: acs:SourceIp拒绝非指定IP的公网请求。两个条件同时满足时触发拒绝。VPC请求因acs:SourceVpcvpc-开头而不会匹配此语句。

  • 语句 2(对VPC请求,拒绝非指定VPC):通过StringLike: acs:SourceVpc: vpc-*识别VPC请求,再通过StringNotEquals: acs:SourceVpc拒绝非指定VPC的请求。两个条件同时满足时触发拒绝。公网请求因acs:SourceVpc不以vpc-开头而不会匹配此语句。

acs:SourceVpc 条件键支持填写当前账号的 VPC ID,也支持填写其他阿里云账号的 VPC ID,实现跨账号 VPC 访问控制。如需允许其他账号的指定 VPC 访问,将语句 2 中的 VPC ID 替换为目标账号的 VPC ID 即可。

将以上两条拒绝策略语句添加到Bucket Policy后,满足任一条件即触发拒绝。以下示例拒绝除指定公网IP地址(203.0.113.5)或指定VPC(IDt4nlw426y44rd3iq4xxxx)以外的所有访问者对目标存储空间(example-bucket)进行读取文件操作。

说明
  • 由于以下拒绝策略语句中Principal为通配符星号(*)且包含Condition,该拒绝策略语句会对所有访问者生效,包括Bucket Owner。

  • 以下拒绝策略语句仅用于限制访问,不会授予任何访问权限。如果授权主体没有被授予过访问权限,可添加一条允许策略语句来授予其访问权限。

{
    "Version":"1",
    "Statement":[
        {
            "Effect":"Deny",
            "Action":[
                "oss:GetObject"
            ],
            "Principal":[
                "*"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket/*"
            ],
            "Condition":{
                "StringNotLike":{
                    "acs:SourceVpc":[
                        "vpc-*"
                    ]
                },
                "NotIpAddress":{
                    "acs:SourceIp":[
                        "203.0.113.5"
                    ]
                }
            }
        },
        {
            "Effect":"Deny",
            "Action":[
                "oss:GetObject"
            ],
            "Principal":[
                "*"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket/*"
            ],
            "Condition":{
                "StringLike":{
                    "acs:SourceVpc":[
                        "vpc-*"
                    ]
                },
                "StringNotEquals":{
                    "acs:SourceVpc":[
                        "vpc-t4nlw426y44rd3iq4xxxx"
                    ]
                }
            }
        }
    ]
}

场景6:设置IP黑名单

当需要拒绝特定IP地址访问Bucket及其下的Object文件时,可使用IP黑名单策略。通过在Bucket Policy中设置拒绝策略,可阻止指定IP地址或IP地址段的所有访问请求。

策略中的StringLike: acs:SourceVpc: *使用通配符匹配所有值,不会实际限制VPC范围。该条件是为了满足"配置acs:SourceIp时必须同时配置acs:SourceVpc"的强制约束。

说明
  • 由于以下拒绝策略语句中Principal为通配符星号(*)且包含Condition,该拒绝策略语句会对所有访问者生效,包括Bucket Owner。

  • 可同时配置多个IP地址和IP地址段,用逗号分隔。

{
  "Version": "1",
  "Statement": [{
    "Effect": "Deny",
    "Action": "oss:*",
    "Principal": [
      "*"
    ],
    "Resource": [
      "acs:oss:*:174649585760xxxx:example-bucket/*",
      "acs:oss:*:174649585760xxxx:example-bucket"
    ],
    "Condition": {
      "IpAddress": {
        "acs:SourceIp": [
          "101.***.***.100"
        ]
      },
      "StringLike": {
        "acs:SourceVpc": [
          "*"
        ]
      }
    }
  }]
}

场景7:定向拒绝特定IP的下载操作

当需要拒绝特定IP地址下载(GetObject)和列举(ListObjects)Bucket中的文件,但允许该IP继续上传(PutObject)时,可将DenyAction限定为GetObjectListObjects。与场景6IP黑名单(Deny oss:*)不同,此策略仅拒绝下载类操作,上传不受影响。

策略中的StringLike: acs:SourceVpc: *使用通配符匹配所有值,不会实际限制VPC范围。该条件是为了满足“配置acs:SourceIp时必须同时配置acs:SourceVpc”的强制约束。

说明
  • 由于以下拒绝策略语句中Principal为通配符星号(*)且包含Condition,该拒绝策略语句会对所有访问者生效,包括Bucket Owner。

  • 可同时配置多个IP地址和IP地址段,用逗号分隔。

{
  "Version": "1",
  "Statement": [{
    "Effect": "Deny",
    "Action": [
      "oss:GetObject",
      "oss:ListObjects"
    ],
    "Principal": [
      "*"
    ],
    "Resource": [
      "acs:oss:*:174649585760xxxx:example-bucket/*",
      "acs:oss:*:174649585760xxxx:example-bucket"
    ],
    "Condition": {
      "IpAddress": {
        "acs:SourceIp": [
          "101.***.***.100"
        ]
      },
      "StringLike": {
        "acs:SourceVpc": [
          "*"
        ]
      }
    }
  }]
}

此策略生效后,被拒绝的IP地址执行GetObjectListObjects将返回403 AccessDenied,PutObject上传操作不受影响。

场景8:设置经典网络访问

oss:ClassicIntranet条件关键字用于标识请求是否来自OSS经典网络,取值为truefalse。OSS的部分后台服务(如日志转存、存储空间清单)通过经典网络访问Bucket。使用以下条件可匹配来自经典网络的请求。

"Condition": {
    "StringEquals": {
        "oss:ClassicIntranet": [
            "true"
        ]
    }
}

配置网络访问限制(Deny策略)时,若需放行上述后台服务,可在Deny语句对应的Condition中添加以下条件,排除经典网络请求,避免误拦截。

"StringNotEquals": {
    "oss:ClassicIntranet": [
        "true"
    ]
}

场景9:指定IP可读写、其他IP只读

当需要让指定公网IP地址段的访问者拥有读写权限,其他来源的访问者仅拥有只读权限时,需要创建两条允许(Allow)策略语句。仅使用单条语句配置acs:SourceIp条件无法保存策略,因为Bucket Policy要求配置acs:SourceIp时必须同时配置acs:SourceVpc条件关键字,因此需拆分为两条语句分别授权。以下示例授予指定公网IP地址段(192.168.0.0/16)对目标存储空间(example-bucket)的读写权限,其他所有访问者仅拥有只读权限。

  • 语句 1(指定IP可读写):授予来源IP192.168.0.0/16范围内(且非VPC请求)的访问者对目标存储空间的读写权限。

  • 语句 2(所有IP只读):不附加网络来源条件,授予所有访问者对目标存储空间的只读权限。

{
    "Version":"1",
    "Statement":[
        {
            "Effect":"Allow",
            "Action":[
                "oss:GetObject",
                "oss:PutObject",
                "oss:ListObjects"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket",
                "acs:oss:*:174649585760xxxx:example-bucket/*"
            ],
            "Condition":{
                "IpAddress":{
                    "acs:SourceIp":[
                        "192.168.0.0/16"
                    ]
                },
                "StringNotLike":{
                    "acs:SourceVpc":[
                        "vpc-*"
                    ]
                }
            }
        },
        {
            "Effect":"Allow",
            "Action":[
                "oss:GetObject",
                "oss:ListObjects"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket",
                "acs:oss:*:174649585760xxxx:example-bucket/*"
            ]
        }
    ]
}

多 Statement 共存时的全量校验

当 Bucket 包含多条 Policy Statement 时,新增或修改任意一条 Statement 都会触发对该 Bucket 全部 Statement 的校验:只要某条 Statement 的 Condition 中包含 acs:SourceIp 条件关键字,就必须同时包含 acs:SourceVpc 条件关键字,否则 PutBucketPolicy 操作会失败,并返回如下错误:

{
  "Code": "InvalidPolicyDocument",
  "EC": "0030-00000008"
}

例如,Bucket 已有两条 Statement,其中一条同时配置了 acs:SourceIpacs:SourceVpc,另一条只配置了 acs:SourceIp:此时提交 Policy 会因后者缺少 acs:SourceVpc 而返回上述错误;只有两条 Statement 均同时配置 acs:SourceIpacs:SourceVpc,提交才能成功。

遇到该错误时,可按以下步骤排查并修复已有 Policy:

  1. 调用 GetBucketPolicy 接口,获取目标 Bucket 当前生效的完整 Policy 内容。

  2. 逐条检查返回结果中每条 Statement 的 Condition 字段,确认所有包含 acs:SourceIp 的 Statement 是否同时包含 acs:SourceVpc

  3. 为缺少 acs:SourceVpc 的 Statement 补充该条件关键字(例如参考本节前述场景中的 StringNotLikeStringLike 写法),修改完成后重新调用 PutBucketPolicy 提交。

常见授权场景-安全策略控制

以下场景展示了如何通过Bucket Policy实施安全策略,包括限制凭证类型、防止公共访问和控制保留策略等。

场景1:限制API调用方式必须为临时访问凭证

通过API方式访问存储空间资源时,如果需要限制API调用方式必须是临时访问凭证,可使用acs:AccessId条件关键字创建一条拒绝策略语句并将其添加到Bucket Policy中,用于阻止其他非临时访问凭证(例如通过阿里云账号或者RAM用户的长期访问密钥)的访问方式。对于通过非临时访问凭证的访问方式,会触发策略中的拒绝规则。以下示例拒绝除临时访问凭证(以TMP.或者STS.开头的)以外的所有访问者查看目标存储空间(example-bucket)以及列举文件的操作。

{
    "Version": "1",
    "Statement": [
        {            
            "Effect": "Deny",
            "Action":[
                "oss:Get*",
                "oss:ListObjects",
                "oss:ListObjectVersions"
            ],
            "Principal":[
                "*"
            ],
            "Resource":[
                "acs:oss:*:174649585760xxxx:example-bucket/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "acs:AccessId": [
                        "TMP.*",
                        "STS.*"
                 ]
                }
            }
        }
    ]
}

场景2:禁止将 Bucket 和 Object 的 ACL 设置为公共访问

当需要禁止将 Bucket 和 Object 的 ACL 设置为公共访问时,可创建两条拒绝策略语句:

  • 使用 oss:x-oss-acl 条件关键字创建一条拒绝策略语句,阻止将 Bucket ACL 设置为除 private 以外的权限。任何尝试设置公共读或公共读写权限的操作会被识别为不符合私有条件,触发拒绝规则。

  • 使用 oss:x-oss-object-acl 条件关键字创建一条拒绝策略语句,阻止将 Object ACL 设置为除 private 和 default 以外的权限。

将以上两条拒绝策略语句添加到 Bucket Policy 后,满足任一条件即触发拒绝。以下示例拒绝对目标存储空间(example-bucket)设置公共访问权限的操作。

{
    "Version": "1",
    "Statement": [
        {            
            "Effect": "Deny",
            "Action": [
                "oss:PutBucketAcl"
            ],
            "Principal": [
                "*"
            ],
            "Resource": [
                "acs:oss:*:*:example-bucket"
            ],
            "Condition": {
                "StringNotEquals": {
                    "oss:x-oss-acl": "private"
                }
            }
        },
        {            
            "Effect": "Deny",
            "Action": [
                "oss:PutObjectAcl"
            ],
            "Principal": [
                "*"
            ],
            "Resource": [
                "acs:oss:*:*:example-bucket/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "oss:x-oss-object-acl": [
                        "private",
                        "default"
                    ]
                }
            }
        }
    ]
}

场景3:限制ObjectWorm保留策略的最长保留时间

Bucket开启了对象级别保留策略(ObjectWorm)后,可通过Bucket Policy限制用户设置保留策略时允许的最长保留天数。例如,以下策略限制用户最多只能设置30天的保留策略,超过30天的PutObjectRetention请求将被拒绝。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "oss:PutObjectRetention"
      ],
      "Principal": [
        "*"
      ],
      "Resource": [
        "acs:oss:*:174649585760xxxx:example-bucket/*"
      ],
      "Condition": {
        "NumericGreaterThan": {
          "oss:object-remaining-retention-days": "30"
        }
      }
    }
  ]
}
说明
  • oss:object-remaining-retention-daysObjectWorm保留策略的Condition Key,表示请求中设置的保留策略剩余天数。

  • 由于该策略的Principal为通配符(*)且包含Condition,该策略对所有用户生效,包括Bucket Owner。

匿名访问诊断

当 Bucket 中出现来源不明的文件时,检查 Bucket Policy 是否存在 Principal 为通配符(*)的 Allow 策略。该策略允许任何人通过脚本(如 python-requestscurl)匿名上传文件,无需身份认证即可成功写入 Object。存在此类策略时,可通过 OSS 实时日志查询定位匿名上传来源,诊断步骤如下:

  1. 在 OSS 控制台开启实时日志查询:进入目标 Bucket,在左侧菜单栏单击 日志管理,选择 实时查询,单击 立即开通

  2. 实时日志查询开通后,通过 SLS SQL 查询访问日志,过滤匿名上传记录:

    select access_id, user_agent, client_ip, http_method, object
    from oss-log-store
    where access_id = '-' and user_agent like '%python-requests%'
  3. 根据诊断字段分析匿名上传来源:

    • access_id-(空)表示该请求未经身份认证,即匿名访问。

    • user_agent 显示发起请求的客户端或工具(例如 python-requests/2.28.1),可用于定位上传所用的脚本或工具。

    • client_ip 为匿名上传请求的来源 IP 地址,可用于定位上传者。

  4. 根据 sign_type 字段确认请求的签名状态:匿名上传请求的 sign_type 字段值为 NotSign;使用访问密钥或 STS 令牌签名的请求,sign_type 字段值为 NORMAL_SIGN4

确认匿名上传后,修改或删除 Principal 为通配符(*)的 Allow 策略。该操作仅拒绝未签名的匿名请求,不影响通过控制台、ossbrowserossutil 等方式使用签名认证的正常访问。

只读权限用户仍可写入

当为 RAM 用户仅授予 AliyunOSSReadOnlyAccess 系统策略后,该用户仍能通过 AccessKey 成功调用 PutObject 写入数据(返回 HTTP 200)时,说明该用户存在叠加的写权限来源。AliyunOSSReadOnlyAccess 仅授予 oss:Get*oss:List* 等读操作,不包含任何写权限,只读用户仍可写入必然来自其他叠加的授权来源。

按以下顺序排查叠加的写权限来源:

  1. RAM 自定义策略:调用 ListPoliciesForUser 接口查看该 RAM 用户附加的所有策略,确认是否存在授予 oss:Put*oss:* 等写操作的自定义策略。

  2. Bucket Policy:查看目标 Bucket 的 Bucket Policy,确认 Principal 中是否包含该 RAM 用户(或其所属用户组、所属账号),且对应 StatementAction 中是否包含写操作。

  3. RAM 用户组策略:如果该 RAM 用户加入了某个用户组,检查该用户组是否附加了授予写权限的策略;用户组附加的策略会叠加到用户的最终权限中。

排查确认叠加来源后,移除或修改对应的写权限策略,确保该 RAM 用户仅通过 AliyunOSSReadOnlyAccess 获得只读权限。修改完成后可重新调用 PutObject 验证:返回 403 AccessDenied 表示叠加的写权限已清除,只读权限已恢复生效。

开发和工具集成

除了通过控制台进行手动配置,还可以使用图形化或命令行工具、SDK等方式进行Bucket Policy授权。

  • 使用图形化工具ossbrowser

    支持Bucket级别的策略操作,提供与控制台相似的可视化配置体验。安装并登录ossbrowser后按照界面指引完成Bucket Policy的配置操作。

  • 使用命令行工具ossutil

    通过调用put-bucket-policy接口设置授权策略。

    说明

    为向量Bucket设置授权策略时,需使用ossutil vectors-api put-bucket-policy命令。

  • 使用SDK

    支持Java SDKPython SDKGo SDKNode.js SDK等多种编程语言进行策略配置,更多SDK支持请参见SDK参考

  • 直接调用API

    调用PutBucketPolicy接口为Bucket设置授权策略。

配额与限制

  • 策略大小:单个存储空间支持添加多条Bucket Policy,所有策略的总大小不能超过16 KB。

  • 字段长度:Bucket Policy中每个字段的长度不能超过4095字节。

相关文档