显式版本删除现在要求 DeleteObjectVersion
自 Server 20260903 起(pgsty/silo#104,对应 Issue #58),SILO 按照删除请求实际执行的操作类型选择所需权限:
| 请求 | 所需权限 |
|---|---|
未携带 versionId |
s3:DeleteObject |
| 版本 UUID | s3:DeleteObjectVersion |
显式 versionId=null |
s3:DeleteObjectVersion |
DeleteObjects |
对每个 XML 条目独立应用映射 |
此前所有情况均要求 s3:DeleteObject,而 s3:DeleteObjectVersion 仅用于检查显式 Deny。这导致仅持有 DeleteObject 的主体可以永久移除指定的历史版本,而仅持有 DeleteObjectVersion 的最小权限清理主体却无法执行版本清理。
修复后,仅持有 DeleteObject 的主体仍可执行不带版本号的删除或创建删除标记(Delete Marker),但在尝试删除指定 UUID 或 null 版本时会收到 AccessDenied。仅持有 DeleteObjectVersion 的主体可以永久删除指定版本,但不能创建删除标记。显式 Deny 与 s3:versionid 策略条件保持原有求值优先级。批量删除(DeleteObjects)按每个条目自身的 VersionId 求值,外层 URL 查询参数不会污染其他条目的条件值。
复制兼容性
存储桶与站点复制的目标策略无需新增 s3:DeleteObjectVersion。已认证请求通过精确的内部复制标记与 s3:ReplicateDelete 获得复制删除信任,接收端继续沿用已部署的 s3:DeleteObject + s3:ReplicateDelete 策略契约;而针对 s3:DeleteObjectVersion 的显式 Deny 仍会阻止复制版本清理。
这种区分既避免了升级后的目标站点静默拒绝永久删除复制,也不会给仅持有 ReplicateDelete 的凭据赋予额外的普通删除能力。双站点回归测试验证了使用最小权限策略(不含 DeleteObjectVersion)的目标端用户:永久版本删除与删除标记均能正常收敛。
升级影响
- 请检查当前仅授予
s3:DeleteObject,但需要执行mc rm --version-id、mc rm --versions、Console“删除全部版本”或 SDK 指定versionId删除的用户、服务账号、OPA 及外部授权策略,为其补充s3:DeleteObjectVersion。 - 对于普通的指定版本删除,外部授权插件现在只会收到一次
s3:DeleteObjectVersion判定请求,不再像修复前那样先收到一次仅检查 Deny 的s3:DeleteObjectVersion调用、再收到一次s3:DeleteObject调用。 X-Minio-Force-Delete前缀强制删除仍由s3:DeleteObject控制。- 本次变更不涉及传输协议或磁盘存储格式迁移。
完整的操作权限矩阵参见对象删除。