禁止文件覆盖写

当用户希望OSS Bucket下的文件在首次上传后,不能被意外或恶意修改,可以为该Bucket设置禁止覆盖规则,根据文件路径、类型或操作者身份精确控制哪些文件不可被覆盖。

  • 首次并发上传:当一个文件在首次上传时是并发的(即多个客户端同时上传该文件),即使它匹配了禁止覆盖规则,系统也不会阻止其中一个版本成功写入。这是为了确保高并发场景下的写入成功率。但在该文件成功创建后,任何后续的覆盖操作都将被规则正常拦截。

  • 不拦截系统内部行为:禁止文件覆盖的功能仅针对客户端发起的PutObject、AppendObject等操作。对于由OSS系统自身发起的后台行为,如生命周期(Lifecycle)转换或跨区域复制(CRR)等,规则不会进行拦截,以保证这些核心功能的正常运行。

工作原理

OSS收到文件覆盖请求时,系统会按照设置的保护规则进行评估:

  1. 规则匹配:系统按规则创建顺序检查请求文件路径是否同时满足规则中的前缀、后缀条件,以及操作者身份是否匹配授权用户设置。

  2. 执行决策:必须同时满足所有Filter条件(前缀、后缀)以及操作者身份才会触发禁止覆盖操作,返回FileAlreadyExists。

  3. 默认行为:如果所有保护规则都不匹配,则允许正常的文件覆盖操作。

为特定文件类型设置保护

保护生产环境中的配置文件和日志文件,防止被特定用户意外覆盖。

  1. Bucket 列表页面,单击目标Bucket名称。

  2. 在左侧导航栏,选择数据管理 > 禁止文件覆盖写

  3. 单击新增禁止覆盖写规则,配置以下参数:

    • 规则ID:可手动填写或自动生成

    • 文件名前缀输入需要保护的目录路径,如 production/configs/

    • 文件名后缀:输入文件扩展名,如 .json

    • 授权用户:指定受限制的子账号、角色或其他账号

  4. 单击确定创建规则。

  5. 验证规则效果:

    • 使用被限制的账号尝试上传同名文件到 production/configs/app.json

    • 确认返回FileAlreadyExists

    • 其他用户或上传到不满足前后缀条件的文件路径则正常进行

设置全局保护策略

为关键业务数据建立全面保护,防止任何人员误操作。

  1. Bucket 列表页面,单击目标Bucket名称。

  2. 在左侧导航栏,选择数据管理 > 禁止文件覆盖写

  3. 单击新增禁止覆盖写规则,配置以下参数:

    • 规则ID:可手动填写或自动生成

    • 文件名前缀critical-data/

    • 文件名后缀:留空(保护该路径下所有文件)

    • 授权用户:所有账号(*)

  4. 单击确定创建规则。

  5. 验证全局保护效果:

    • 使用任意账号尝试覆盖 critical-data/database.sql

    • 确认返回FileAlreadyExists,表明全局保护生效

    • 上传到 public-data/ 路径下的文件正常覆盖

匹配规则

  • 规则数量:单个Bucket最多支持100条规则

  • 字符长度:前缀和后缀最大长度均为1023个字符

  • 前后缀匹配方式:仅支持精确字符串匹配,不支持正则表达式或通配符。输入的logs/会被当作普通字符处理

  • 前缀匹配logs/ 匹配 logs/app.log,不匹配 dev-logs/app.log

  • 后缀匹配.txt 匹配 readme.txt,不匹配 readme.TXTreadme.txt.bak

  • 授权用户匹配:支持通配符星号(*),可参考Bucket Policy常见示例中 Principal 的配置。

  • 条件组合:必须同时满足规则中的所有Filter条件(前后缀和授权用户)才会触发禁止操作

  • 规则ID:可选项,如不填写会自动生成UUID。如填写必须保证在Bucket内唯一

常见问题

设置授权用户为空后,连我这个Bucket所有者也无法覆盖文件了,怎么办?

这是预期行为。授权用户为空表示规则对所有用户生效,包括Bucket的创建者和主账号。如需恢复覆盖能力,可以:

  • 在控制台删除该规则

  • 修改规则的前缀或后缀条件,缩小保护范围

  • 设置授权用户为特定用户,仅限制部分用户的覆盖操作

设置前缀为logs/*.txt想匹配日志目录下的所有txt文件,为什么不生效?

OSS的前后缀匹配不支持通配符。*会被当作普通字符处理,系统会精确匹配名为logs/*.txt的文件。正确做法是:

  • 前缀设置为logs/

  • 后缀设置为.txt

这样可以匹配logs/目录下所有以.txt结尾的文件。

前缀和后缀都不填写会怎样?

当前缀和后缀都留空时,规则会对整个Bucket生效。这意味着:

  • 如果授权用户也为空,则禁止所有用户对该Bucket内任何文件进行覆盖操作

  • 如果授权用户指定了特定用户,则仅禁止这些用户对Bucket内文件的覆盖操作