当用户希望OSS Bucket下的文件在首次上传后,不能被意外或恶意修改,可以为该Bucket设置禁止覆盖规则,根据文件路径、类型或操作者身份精确控制哪些文件不可被覆盖。
首次并发上传:当一个文件在首次上传时是并发的(即多个客户端同时上传该文件),即使它匹配了禁止覆盖规则,系统也不会阻止其中一个版本成功写入。这是为了确保高并发场景下的写入成功率。但在该文件成功创建后,任何后续的覆盖操作都将被规则正常拦截。
不拦截系统内部行为:禁止文件覆盖的功能仅针对客户端发起的PutObject、AppendObject等操作。对于由OSS系统自身发起的后台行为,如生命周期(Lifecycle)转换或跨区域复制(CRR)等,规则不会进行拦截,以保证这些核心功能的正常运行。
工作原理
当OSS收到文件覆盖请求时,系统会按照设置的保护规则进行评估:
规则匹配:系统按规则创建顺序检查请求文件路径是否同时满足规则中的前缀、后缀条件,以及操作者身份是否匹配授权用户设置。
执行决策:必须同时满足所有Filter条件(前缀、后缀)以及操作者身份才会触发禁止覆盖操作,返回FileAlreadyExists。
默认行为:如果所有保护规则都不匹配,则允许正常的文件覆盖操作。
为特定文件类型设置保护
保护生产环境中的配置文件和日志文件,防止被特定用户意外覆盖。
在Bucket 列表页面,单击目标Bucket名称。
在左侧导航栏,选择。
单击新增禁止覆盖写规则,配置以下参数:
规则ID:可手动填写或自动生成
文件名前缀:输入需要保护的目录路径,如
production/configs/文件名后缀:输入文件扩展名,如
.json授权用户:指定受限制的子账号、角色或其他账号
单击确定创建规则。
验证规则效果:
使用被限制的账号尝试上传同名文件到
production/configs/app.json确认返回FileAlreadyExists
其他用户或上传到不满足前后缀条件的文件路径则正常进行
设置全局保护策略
为关键业务数据建立全面保护,防止任何人员误操作。
在Bucket 列表页面,单击目标Bucket名称。
在左侧导航栏,选择。
单击新增禁止覆盖写规则,配置以下参数:
规则ID:可手动填写或自动生成
文件名前缀:
critical-data/文件名后缀:留空(保护该路径下所有文件)
授权用户:所有账号(*)
单击确定创建规则。
验证全局保护效果:
使用任意账号尝试覆盖
critical-data/database.sql确认返回FileAlreadyExists,表明全局保护生效
上传到
public-data/路径下的文件正常覆盖
匹配规则
规则数量:单个Bucket最多支持100条规则
字符长度:前缀和后缀最大长度均为1023个字符
前后缀匹配方式:仅支持精确字符串匹配,不支持正则表达式或通配符。输入的
logs/会被当作普通字符处理前缀匹配:
logs/匹配logs/app.log,不匹配dev-logs/app.log后缀匹配:
.txt匹配readme.txt,不匹配readme.TXT或readme.txt.bak授权用户匹配:支持通配符星号(*),可参考Bucket Policy常见示例中 Principal 的配置。
条件组合:必须同时满足规则中的所有Filter条件(前后缀和授权用户)才会触发禁止操作
规则ID:可选项,如不填写会自动生成UUID。如填写必须保证在Bucket内唯一
常见问题
设置授权用户为空后,连我这个Bucket所有者也无法覆盖文件了,怎么办?
这是预期行为。授权用户为空表示规则对所有用户生效,包括Bucket的创建者和主账号。如需恢复覆盖能力,可以:
在控制台删除该规则
修改规则的前缀或后缀条件,缩小保护范围
设置授权用户为特定用户,仅限制部分用户的覆盖操作
设置前缀为logs/*.txt想匹配日志目录下的所有txt文件,为什么不生效?
OSS的前后缀匹配不支持通配符。*会被当作普通字符处理,系统会精确匹配名为logs/*.txt的文件。正确做法是:
前缀设置为
logs/后缀设置为
.txt
这样可以匹配logs/目录下所有以.txt结尾的文件。
前缀和后缀都不填写会怎样?
当前缀和后缀都留空时,规则会对整个Bucket生效。这意味着:
如果授权用户也为空,则禁止所有用户对该Bucket内任何文件进行覆盖操作
如果授权用户指定了特定用户,则仅禁止这些用户对Bucket内文件的覆盖操作