Silo 对象锁定
概述
SILO 20261109 更新: SILO 20261109 在批量删除、多池版本、目录 null 版本、复制清除、生命周期整键删除规则以及批处理作业中统一执行 Object Lock 检查;请升级所有服务节点,使每个池和站点执行一致的锁定规则。此前,SILO 20261018 修复了保留期授权与受保护版本覆盖问题(SN-2026-015/016,Server 20260916 仍受影响):每次保留期更新均要求 s3:PutObjectRetention,削弱生效中的 GOVERNANCE 保留期还要求携带 x-amz-bypass-governance-retention: true 请求头及 s3:BypassGovernanceRetention 权限。单独升级客户端或 Console 不会修补 Server,升级也不会恢复此前已被覆盖的数据或保留期。受影响路径与缓解措施见安全公告。
MinIO 对象锁定(“对象保留”)通过强制执行一次写入、多次读取(WORM)不可变性,防止 已启用版本控制的对象 被删除。MinIO 同时支持 基于时长的对象保留 和 无限期 legal hold 保留。
历史上游 MinIO 的对象锁定曾获 Cohasset Associates 针对 SEC 17a-4(f)、FINRA 4511(c) 和 CFTC 1.31(c)-(d) 的第三方合规评估。该评估仅适用于受评的历史上游 MinIO 版本,尚未针对 PGSTY SILO 进行独立重新认证。
MinIO 版本控制会保留对象变更的完整历史。 但应用仍可显式删除特定对象版本。
对存储桶中的对象应用默认 30 天的 WORM 锁,可确保所有对象版本在最短保留期内受到保护。
删除操作 在 已启用版本控制的存储桶 中遵循常规行为,即 MinIO 会为对象创建 DeleteMarker。不过,对象中非 Delete Marker 的版本仍受保留规则约束,可防止任何针对特定版本的删除或覆盖尝试。
对于受 WORM 锁定保护的特定对象版本,MinIO 会阻止任何 删除 尝试。客户端最早只能在锁过期后删除该版本。
MinIO 对象锁定在功能和 API 层面与 AWS S3 兼容。 本页概述了 MinIO 中对象锁定/保留的实现概念。更多信息请参见 AWS S3 文档 How S3 Object Lock works。
按照 S3 的行为, 只能在创建存储桶时启用对象锁定。对于创建时未启用锁定的存储桶,之后无法再启用对象锁定。启用后,你可以在任意时刻配置对象保留规则。对象锁定依赖 版本控制,并会隐式启用该特性。
与版本控制的交互
受 WORM 锁定保护的对象在锁过期或被显式解除之前均不可变更。锁定以对象版本为粒度,每个版本都独立保持不可变。
如果应用对受锁定对象执行未指定版本的删除操作,该操作会生成一个 Delete Marker。 任何显式删除受 WORM 锁定对象的尝试都会报错失败。Delete Marker 不 受 WORM 锁定保护。 更多信息请参见 S3 文档 Managing delete markers and object lifecycles。
例如,考虑以下默认启用了 GOVERNANCE 模式 锁定的存储桶:
由于对象锁定设置,对 data.csv 的 特定版本 执行删除会失败:
对 data.csv 执行未指定版本的删除会成功,并为对象创建一个新的 DeleteMarker:
与生命周期管理的交互
对于受过期规则覆盖的对象,MinIO 对象过期 会遵循所有生效中的对象锁定和保留设置。
- 对于仅作用于 当前 对象版本的过期规则, MinIO 会为受锁定对象创建一个 Delete Marker。
- 对于作用于 非当前对象版本 的过期规则, MinIO 只能在保留期结束 之后,或保留已被显式解除时(例如 legal hold)对非当前版本执行过期。
例如,考虑以下默认启用了 GOVERNANCE 模式 且保留期为 45 天的存储桶:
为超过 7 天的 当前 对象创建过期规则时,会为该对象生成一个 Delete Marker:
不过,对于超过 7 天的 非当前 对象,过期规则只有在已配置的 WORM 锁过期 之后 才会生效。由于该存储桶设置了 45 天的 GOVERNANCE 保留,因此只有 data.csv 的 v1 版本已解锁,因而可被删除。
在 SILO 20261109 中,生命周期整键删除动作(ExpiredObjectAllVersions 与 DelMarkerExpiration,#297)以及批处理 expire 和 keyrotate 作业(#310)同样会保留受 Object Lock 保护的版本,而不会绕过生效中的保留期或 legal hold。
与批量删除和复制的交互
自 SILO 20261109 起,批量删除与复制执行以下 Object Lock 保护机制:
- 持变更锁串行核验物理版本清除(
DeleteObjects): S3DeleteObjects在执行物理版本移除时,会使用与保留期和 legal hold 更新相同的变更锁逐项串行核验,并合并所有存储池的保护状态(提交6ef3a52fc)。因此在启用 Object Lock 的存储桶中,大批量物理版本清除耗时更长;创建删除标记以及普通存储桶仍保持并发批量路径。 - 目录
null版本保护: 批量删除在移除目录对象的null版本前,会检查该目录对象的 Object Lock 保留期与 legal hold 状态(提交aa2d79daf)。 - 复制删除保留目标端锁保护: 存储桶复制与站点复制在执行复制删除时保留目标端的 legal hold 与保留期(提交
7e9ee6bef)。源端绕过GOVERNANCE保留期执行的物理清除不会赋予目标端绕过权限;只要目标端副本仍受有效保护,目标端就会拒绝清除并由源端重试。
教程
创建启用对象锁定的存储桶
按照 S3 的行为,必须在创建存储桶时启用对象锁定。 你可以使用 MinIO mc CLI 或 S3 兼容 SDK 创建启用了对象锁定的存储桶。
使用带有 --with-lock 选项的 mc mb 命令创建启用了对象锁定的存储桶:
配置存储桶默认对象保留
你可以使用 MinIO mc CLI 或 S3 兼容 SDK 配置对象锁定规则(“对象保留”)。
MinIO 同时支持设置存储桶默认保留规则和按对象设置保留规则。 以下示例演示的是存储桶默认保留。对于按对象设置保留,请参见所选 SDK 中相应 PUT 操作的文档。
使用带有 --recursive 和 --default 选项的 mc retention set 命令,为存储桶设置默认保留模式:
- 将
MODE替换为 COMPLIANCE 或 GOVERNANCE。 - 将
DURATION替换为对象锁定持续生效的时长。 - 将
ALIAS替换为已配置 MinIO 部署的alias。 - 将
BUCKET替换为要设置默认保留规则的存储桶名称。
启用 Legal Hold 保留
你可以使用 MinIO mc CLI 或 S3 兼容 SDK,为对象启用或禁用无限期 legal hold 保留。
你可以对已经处于 COMPLIANCE 或 GOVERNANCE 锁定下的对象设置 legal hold。 即使保留锁过期,对象在 legal hold 生效期间仍会保持 WORM 锁定。 你或其他拥有必要权限的用户必须显式解除 legal hold,才能移除 WORM 锁。
使用 mc legalhold set 命令切换对象的 legal hold 状态。
对象保留模式
MinIO 实现了以下 S3 对象锁定模式:
| 模式 | 说明 |
|---|---|
| GOVERNANCE 模式 | 阻止非特权用户修改或变更对象及其锁定设置。在存储桶或对象上拥有 s3:BypassGovernanceRetention 权限的用户携带绕过请求头时,可以修改对象或其锁定设置。配置的保留时长到期后,SILO 会自动解除该锁。 |
| COMPLIANCE 模式 | 阻止任何修改或变更对象及其锁定设置的操作。在保留期届满前,包括 root 用户在内的任何用户都无法修改对象或缩短保留期。配置的保留时长到期后,SILO 会自动解除该锁。 |
GOVERNANCE 模式
处于 GOVERNANCE 锁定下的对象可防止非特权用户执行写操作。
GOVERNANCE 锁定对象提供受管控的不可变性。拥有 s3:BypassGovernanceRetention 操作权限的用户可以修改被锁定对象、调整保留时长,或完全解除该锁。绕过 GOVERNANCE 保留还要求在请求中设置 x-amz-bypass-governance-retention:true header。
MinIO 的 GOVERNANCE 锁在功能上与 S3 GOVERNANCE 模式 完全一致。
COMPLIANCE 模式
处于 COMPLIANCE 锁定下的对象可防止 所有 用户执行写操作,包括 MinIO root 用户。
COMPLIANCE 锁定对象提供完全不可变性。 在配置的保留时长结束之前,无法更改或移除该锁。
MinIO 的 COMPLIANCE 锁在功能上与 S3 COMPLIANCE 模式 完全一致。
Legal Hold
处于 legal hold 状态下的对象可防止 所有 用户执行写操作,包括 MinIO root 用户。
legal hold 为无限期,并对锁定对象强制执行完全不可变性。 只有拥有 s3:PutObjectLegalHold 权限的特权用户才能设置或解除 legal hold。
legal hold 在对象级别生效。 如果你为一组对象启用 legal hold,例如某个存储桶中的现有内容,则该存储桶后续新创建的对象不会受到影响。
legal hold 与 GOVERNANCE 模式 和 COMPLIANCE 模式 保留设置是互补关系。 同时受 legal hold 和 GOVERNANCE/COMPLIANCE 保留规则保护的对象,会持续保持 WORM 锁定,直到 legal hold 被解除 且 规则到期。
对于 GOVERNANCE 锁定对象,即使用户拥有绕过保留的必要权限,legal hold 仍会阻止其修改该对象。