阻止公共访问是OSS提供的安全防护功能。当需要防止数据被匿名用户访问时,可在OSS全局、Bucket、接入点或对象FC接入点维度开启此功能。开启后,已有的公共访问权限会被忽略,且无法创建新的公共访问权限。
工作原理
阻止公共访问通过多层级访问限制机制保护数据安全。开启后,OSS会忽略Bucket Policy和ACL中的公共访问权限配置,同时阻止创建新的公共访问权限;关闭后,已有权限恢复生效,并允许创建新的公共访问权限。
OSS支持在以下四个维度开启阻止公共访问,当不同维度的设置不一致时,遵循以下优先级:
OSS全局 > 单个Bucket > 单个接入点 > 单个对象FC接入点上层开启阻止公共访问后,下层无论如何设置都不允许公共访问:
如果希望单个Bucket允许公共访问,需关闭OSS全局和该Bucket的阻止公共访问。
如果希望单个接入点允许公共访问,需关闭OSS全局、接入点关联的Bucket和该接入点的阻止公共访问。
如果希望单个对象FC接入点允许公共访问,需关闭OSS全局、对象FC接入点关联的接入点、接入点关联的Bucket和该对象FC接入点的阻止公共访问。
开启方式
控制台
OSS全局
前往OSS管理控制台。
在左侧导航栏,选择。
开启阻止公共访问,按照页面指引完成操作。
OSS 全局阻止公共访问默认为关闭(BlockPublicAccess=false),即默认允许公共访问。可以调用 GetPublicAccessBlock 接口查询当前状态,调用 PutPublicAccessBlock 接口或通过上述控制台开关开启。
如果通过云治理中心的 EnrollAccount 接口创建了资源账号(ResourceAccount)类型的成员账号,该成员账号无法直接登录 OSS 控制台(控制台的登录、切换身份按钮均为置灰状态)。需要先为该成员账号创建 RAM 角色,再通过 STS AssumeRole 切换身份获取临时访问凭证,调用 PutPublicAccessBlock 接口为该账号配置 OSS 全局阻止公共访问。
云治理中心的账号基线不包含 OSS 阻止公共访问配置项,因此无法通过账号基线统一配置该功能,需按上述方式逐个成员账号单独配置。
Bucket
前往Bucket列表,单击目标Bucket名称。
在左侧导航栏,选择。
开启阻止公共访问,按照页面指引完成操作。
接入点
前往OSS管理控制台。
在左侧导航栏,单击接入点列表,然后单击目标接入点。
在接入点基础信息区域,开启阻止公共访问,按照页面指引完成操作。
对象FC接入点
前往OSS管理控制台。
在左侧导航栏,单击对象 FC 接入点列表,然后单击目标对象FC接入点。
在FC 接入点基础信息区域,开启阻止公共访问,按照页面指引完成操作。
命令行工具ossutil
可以使用命令行工具ossutil 2.0开启阻止公共访问。
OSS全局
put-public-access-block命令用于开启OSS全局阻止公共访问。
ossutil api put-public-access-block --public-access-block-configuration "{\"BlockPublicAccess\":\"true\"}"Bucket
put-bucket-public-access-block命令用于开启Bucket的阻止公共访问。
ossutil api put-bucket-public-access-block --bucket example-bucket --public-access-block-configuration "{\"BlockPublicAccess\":\"true\"}"接入点
put-access-point-public-access-block命令用于开启接入点的阻止公共访问。
ossutil api put-access-point-public-access-block --bucket example-bucket --access-point-name example-ap --public-access-block-configuration "{\"BlockPublicAccess\":\"true\"}"判断是否包含公共访问语义
需要结合Bucket Policy和ACL(包括Bucket ACL和Object ACL)判断OSS资源是否包含公共访问的语义。如果存在任意一种包含公共访问的语义,资源可能存在安全风险,建议开启阻止公共访问功能。
Bucket Policy
(推荐)调用API接口判断
可以调用GetBucketPolicyStatus接口判断当前Bucket Policy是否包含公共访问的语义。
如果
IsPublic返回字段取值为true,表示当前Bucket Policy包含公共访问的语义。如果
IsPublic返回字段取值为false,表示当前Bucket Policy不包含公共访问的语义或者没有设置Bucket Policy。
自行判断
Bucket Policy中每条Statement的判定规则:满足以下任一条件即视为非公共访问,否则为公共访问。
Effect为Deny
Principal指定固定值(不含通配符
*)Condition包含以下任一限制条件:
Condition字段
取值要求
acs:SourceVpcId
指定固定值(不含通配符
*)acs:SourceVpc
指定固定值(不含通配符
*)acs:AccessId
指定固定值(不含通配符
*)acs:SourceIp
IPv4掩码≥8,IPv6掩码≥32
说明Action和Resource不作为判断公共访问的条件。
ACL
Bucket ACL或者Object ACL设置为公共读或者公共读写,允许公共访问。
Bucket ACL和Object ACL同时设置为私有,不允许公共访问。
配额与限制
RAM用户设置阻止公共访问需要以下权限:
阻止公共访问维度
所需权限
OSS全局
oss:PutPublicAccessBlock、oss:GetPublicAccessBlock、oss:DeletePublicAccessBlockBucket
oss:PutBucketPublicAccessBlock、oss:GetBucketPublicAccessBlock、oss:DeleteBucketPublicAccessBlock接入点
oss:PutAccessPointPublicAccessBlock、oss:GetAccessPointPublicAccessBlock、oss:DeleteAccessPointPublicAccessBlock对象FC接入点
oss:PutAccessPointConfigForObjectProcess、oss:GetAccessPointConfigForObjectProcess、oss:DeleteAccessPointForObjectProcess如果在Bucket Policy中设置了允许任何人操作接入点的管控API,即使该接入点开启了阻止公共访问,用户仍然可以通过Bucket三级域名修改该接入点的阻止公共访问,原因是通过Bucket三级域名访问的请求不受接入点的配置影响。
对于跨区域或者同区域复制,无论源Bucket和目标Bucket是否开启阻止公共访问,均不影响复制前后的Object ACL。如果目标Bucket开启了阻止公共访问,则复制到目标Bucket中ACL为公共读或者公共读写的Object,仍不允许公共访问。
API说明
如果程序自定义要求较高,可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。
API | 说明 |
OSS全局开启阻止公共访问 | |
Bucket开启阻止公共访问 | |
接入点开启阻止公共访问 | |
对象FC接入点开启阻止公共访问 |
变更影响与迁移指引
将 Bucket ACL 从公共读(public-read)改为私有(private)并开启阻止公共访问后,已有的匿名访问权限会被忽略,依赖匿名 URL 访问 Object 的业务将中断,请求返回403 Forbidden:
AccessDenied
You have no right to access this object because of bucket acl.替代匿名访问的方案对比如下:
签名 URL:适用于临时授权场景,需在生成时指定有效期,有效期内持有签名 URL 的任何人均可访问。
Bucket Policy:适用于长期授权特定来源、IP 或 Referer 的场景,可精细控制允许访问的主体,无需为每次访问单独生成链接。
迁移建议:先在测试 Bucket 中验证签名 URL 或 Bucket Policy 可正常访问,再选择业务非高峰期变更 Bucket ACL 并开启阻止公共访问,确认业务无影响后,在生产环境执行相同操作。
常见问题
创建 Bucket Policy 时提示“已开启阻止公共访问”如何处理?
Bucket 开启阻止公共访问后,创建含公共访问语义(如 Principal 设为*)的 Bucket Policy 会被拒绝,返回 403 错误,错误消息为 Put public bucket policy is not allowed。
如需创建含公共访问语义的 Bucket Policy,先关闭阻止公共访问,关闭后可正常创建。
关闭阻止公共访问后会有安全风险吗?
关闭后,之前被忽略的 Bucket ACL 和 Bucket Policy 权限立即恢复生效。关闭前请确认:
Bucket ACL 设置为私有(private)
Object ACL 设置为私有(private)
Bucket Policy 中不含意外的公共访问授权
相关文档
阻止公共访问用于管控OSS全局、Bucket、接入点及对象FC接入点的权限。
如果需要细粒度地管控Bucket内的部分资源或单个Object的权限,请结合使用Bucket Policy和Object ACL。
在多账号场景下,如需强制统一开启阻止公共访问功能,请使用Control Policy进行集中管控。
监控告警配置
阻止公共访问状态变更属于管控类操作,不会记录在实时访问日志中,需要通过操作审计事件跟踪或 API 轮询两种方式监控状态变更并配置告警。
操作审计事件跟踪(推荐)
在操作审计控制台创建跟踪,事件类型选择管控事件,投递到日志服务 SLS。
在事件告警页面创建告警规则,事件名称设置为
PutBucketPublicAccessBlock和DeleteBucketPublicAccessBlock。阻止公共访问状态被修改时,将触发告警通知。
API 轮询
调用GetPublicAccessBlock接口获取 OSS 全局阻止公共访问配置状态,将结果上报至云监控自定义指标,并配置阈值报警规则。