SILO 20261018 发布说明
Server 20261018 已正式发布,提供 amd64 与 arm64 版本化归档、原生软件包及 Docker Hub 标准/distroless 镜像。本版本接替 Server 20260916(20261015 保留为已撤回的历史草稿记录)。
| 身份 | 值 |
|---|---|
| 发行标签 | RELEASE.2026-10-18T00-00-00Z |
| 软件包版本 | 20261018000000.0.0 |
| 发行源码 | 0cd388c666f8211f552604ae73448a066e9c25ce |
| 上一正式版源码 | 2a4d51406b7ed87af5fe6fe0f801f3290f96eb3c(Server 20260916) |
| 完整变更对比 | 20260916 → 20261018 |
版本化归档、原生软件包及固定标签的容器拉取命令见下载页。
Object Lock 与 IAM 安全修复
SN-2026-015 / SN-2026-016 — Object Lock 保留期授权与原位覆写防护。 #234 与 #235 修复了保留期修改鉴权与原位覆写漏洞:
- 每次
PutObjectRetention请求在读取目标对象前,都会携带请求中的 Object Lock 条件键校验s3:PutObjectRetention。缩短、清空未到期的GOVERNANCE保留期或切换其模式时,调用方必须同时提供x-amz-bypass-governance-retention: true请求头并具备s3:BypassGovernanceRetention权限(不能替代基础s3:PutObjectRetention权限)。清空保留期时剩余天数按0计算;未到期的COMPLIANCE保留期不允许缩短或更改模式。 - 调用方显式指定写入
versionId时必须具备可信复制身份(s3:ReplicateObject)。目录对象的null版本和已持久化的分片上传目标会在对象写锁内重新校验锁状态;锁状态读取失败时按 fail-closed 拒绝写入,既有 Legal Hold 继续生效。请同步升级集群中所有写入节点及接收 S3 请求的复制站点。详见安全公告与修复设计。
SN-2026-017 — 管理凭据自助授权边界。 #242 使凭据自查询与清理严格遵守显式 Deny、会话策略收窄(sessionPolicy)及外部授权插件判定。在内置授权下,受限会话凭据无法创建或更新权限超出自身范围的服务账号,非 root 管理员也无法修改 root 派生的凭据;无限制空策略继承与损坏的非 root 密钥清理保持支持。后续提交 995439260 将批量自查询别名归一到父身份,并保留无附加策略普通用户的自查询能力,无需新增 Admin action 或迁移 IAM 存储。详见安全笔记与授权契约。
按范围撤销 STS 令牌
0cd388c66 让 RevokeTokens 同时枚举持久化 STS 身份记录与节点内存缓存,即使某个节点此前漏掉了令牌签发通知,也能完整撤销目标令牌。即便批次中个别令牌写入墓碑失败,已提交的删除记录仍会广播给同集群节点与站点复制对端;离线站点在恢复后通过既有 IAM 删除自愈补齐。基于对象存储和 etcd 的缓存刷新也会在通知或 watch 遗漏后自动剔除已撤销令牌。
撤销范围仍为请求指定的父身份及可选令牌类型(覆盖请求集群在操作截点前的快照,不影响新签发的令牌、无关用户或父身份策略)。持久枚举仅增加管理端撤销命令的开销,不为日常请求鉴权增加网络查询。详见 STS 撤销设计与成本。
重平衡与池下线一致性
60c7179dd(含 #248)与 1748f62c7 防止 rebalance 或池下线(decommission)搬迁旧副本时覆盖其他存储池中的最新副本。搬迁流程会在共享对象锁内复核源版本(包含分片完成与分层对象元数据),保留 null 与 UUID 删除标记,并仅清理已确认搬迁完成的版本,不再粗暴删除整个源前缀。若期间发生并发写入、删除或目标池变化,清理会安全中止并留待重试。
退役旧存储池前,请按多池对象一致性设计核验对象版本、标签和删除标记状态(跨站点删除标记的独立边界仍由 #217 跟踪)。
普通对象列表恢复
#239(含原 #221 工作,关闭 #218)修复了在符合恢复条件的元数据分歧下,ListObjects / ListObjectsV2 成功返回却遗漏可读对象 key 的问题。多池合并层会在对象读锁内复核存在分歧的同名条目组:返回当前可读元数据、略过已确认不存在的对象,或在无法确认时返回 503 SlowDownRead 等明确错误。分页生产者出错会终止整次扫描;客户端应消费所有分页并将任一分页错误视为不完整列表。
常规无分歧条目继续走原有的无锁快速路径。锁内复核仅针对符合条件的最新对象组,不降低读仲裁要求,也不新增持久化元数据;请求取消可随时中断锁重试等待,遇到恢复锁冲突时仅执行一次有界短等待。后续提交 3dd53eb81 与 2080b3d03 确保当同名碰撞对象被确认为不存在时,同名目录或公共前缀(CommonPrefixes)仍被完整保留。实测延迟与锁开销见列表恢复锁成本记录。
分片上传列举与清理
回退默认磁盘扫描,恢复 Legacy 内存列举。 #243 在 10 月 17 日引入的默认磁盘扫描已由 4733e1423 撤回。公开 ListMultipartUploads 在空 prefix 时查询节点本地内存缓存,在非空 prefix 时按精确对象 key 查找;进程重启或请求落到其他节点可能遗漏未完成上传(跨池持久化列举仍在 #79 中跟踪)。
与 20260916 相比,环境变量 MINIO_API_MULTIPART_LISTING=strict 已停用:设置该变量会在启动时输出警告并被忽略(旧共享配置键 api multipart_listing 同样被容忍忽略)。但 20260916 引入的上传创建身份元数据、UploadID 路径校验、取消目标匹配检查以及成功取消后的缓存/对端清理通知均得以保留。只读管理诊断接口 multipart-preflight 仍要求 admin:StorageInfo 权限并返回 mode=legacy,其扫描条目数、超时与并发上限仅作用于显式管理诊断。详见分片列举设计、回退原因与容量基准及配置参考。
后台过期分片清理(默认 24 小时过期、每 6 小时巡检一次)包含两项修复:
- #236:优先解析原生上传目录名中的时间戳,再回退尝试 Base64 兼容路径,消除无谓的磁盘元数据读取。
0f9199e0c:删除过期上传子目录后,立即清理变空的父目录,不再因删除子目录刷新了父目录mtime而多等一轮 24 小时过期周期(非空父目录与活跃上传不受影响)。
错误分类、元数据复用与其他修复
| 改动 | 用户可见效果 |
|---|---|
| #232:提交暂存元数据丢失分类 | 当 PUT 或分片合并在最终提交阶段找不到暂存元数据时,返回可重试的 503 SlowDownWrite,不再误报为 IncompleteBody 或 NoSuchKey;存储 RPC 与 healing 同步保留该错误分类。 |
| #233:元数据与扫描消息结构体复用 | 解码旧格式 xl.meta 时清空未携带的 EcM / Signature 残留值,并在构建扫描响应时清理互斥的 update/final 字段(见结构体复用修复设计)。 |
| #225、#229、#238:校验和错误文案 | 对齐 AWS S3 的 Content-MD5 大小写与算法名错误文案;PUT / UploadPart 已知算法不匹配时指明具体算法名,未知算法保留通用提示。 |
| #238:内嵌 Console 错误解包 | 保留被多层包装的底层 S3 错误码;当 Object Lock 阻止暂停桶版本控制时,准确向前端返回 InvalidBucketState。 |
| #220:Lambda 目标集合判空 | 修正写反的 TargetIDSet.IsEmpty 布尔返回值。 |
| 纠删码文档修正 | 按单个纠删集合(Erasure Set)和对象实际布局说明校验块与容错盘数(见存储类参考)。 |
配套组件与依赖
| 组件 | 选定版本 |
|---|---|
| 内嵌 Console | v2.4.2(v0.0.0-20261017112417-ef2dd2c41d21) |
| MC 模块/镜像内置 mcli | 20261018(v0.0.0-20261017101407-fa3b8bf72458) |
| Server 共享包 | github.com/pgsty/silo-pkg/v3 v3.14.3 |
| 上游 S3 SDK | github.com/minio/minio-go/v7 v7.4.1 |
| Go 工具链 | 1.27.2 |
| 可选外部密钥服务 | PGSTY KES 20261018(独立服务,源码 2f7e741db905) |
独立发布的 Console v2.4.2 与 mcli 20261018 依赖 silo-pkg v3.14.2;Server 主模块升级至 v3.14.3(优化管理 action 分类性能,授权语义不变),并显式 require 上述 Console 与 MC 版本。
minio-go v7.4.1 包含上传失败时的取消清理、UTC 保留期时间戳及 STS 时长透传。核心依赖更新包括 go-jose v4.1.6、ldap v3.4.15、compress v1.20.3、msgp v1.6.5、etcd v3.7.2 与 golang.org/x/*。注意:升级后的 go-jose v4.1.6 会拒绝超过 4096 位的 OIDC/JWK RSA 密钥,使用超长 RSA 密钥的部署在升级前须先核验 OIDC discovery、JWKS 与登录链路(详见依赖安全说明)。
发行流水线固定使用 GoReleaser v2.18.3、nFPM v2.48.0、golangci-lint v2.15.0 与 govulncheck v1.9.0,并将 Object Lock 竞态回归设为发版前置门禁。make rebrand-guard 改用 git grep 扫描源码并显式报告读取错误,不再依赖外部 ripgrep(7007c164a)。注意仓库内置的 Helm Chart 默认镜像标签仍为 20260916,通过 Helm 部署本版本时请显式覆盖为 RELEASE.2026-10-18T00-00-00Z。
升级与回滚要点
- 备份状态与固定制品:记录当前运行版本并固定目标二进制或镜像 digest;按迁移指南与 IAM 恢复流程完整备份 IAM 存储、配置与加密材料(常规在线 IAM 导出不包含撤销墓碑历史)。
- 全集群同步切换:协调升级所有 Server 节点与接收写入的复制站点,切勿在同一 IAM 后端混跑新旧二进制或执行跨版本滚动降级。
- 核对 Object Lock 与服务账号权限:使用业务实际凭据验证保留期修改、Legal Hold、服务账号创建/更新、自助操作显式
Deny以及 root 凭据管理。此前因策略格式受损而无法使用的到期密钥,应由授权父身份重新签发。 - 移除
strict分片列举依赖:若此前在 20260916 上启用了MINIO_API_MULTIPART_LISTING=strict,升级前请确保客户端自行维护待完成或待取消的bucket/key/UploadID,不要依赖公开列表进行全量发现或空间回收判断。 - 检查列表、重试与 OIDC/TLS 链路:验证普通与分页
LIST、PUT/分片完成对503 SlowDownWrite的重试、OIDC/JWKS 密钥长度及经过 TLS 检查设备的出站连接(参见 Go 1.27 TLS 与 OIDC 指南)。 - 回滚风险:降级回 20260916 会重新暴露本版修复的 Object Lock 与管理凭据授权缺陷,且升级本身不会自动恢复升级前已被覆写的对象版本或丢失的标签。
制品核验与验收记录
签名标签 RELEASE.2026-10-18T00-00-00Z 及全部 36 个发行制品均对应源码 0cd388c666f8211f552604ae73448a066e9c25ce,并通过了 Go CI、VulnCheck、Release 构建与软件包定稿工作流。
- 静态制品核验:核验全部下载摘要、6 个平台归档版本戳、6 个系统软件包(RPM/DEB/APK)载荷、34 份构建来源证明(attestation)、2 份 Sigstore 校验清单签名、2 份 RPM 签名与 12 份 SBOM。
- 本机功能与故障验收:在原生 Darwin 与 Linux 环境下完成 S3/IAM/STS/Object Lock、LDAP/OIDC、20260916 原地升级、桶复制与站点复制、含内嵌 Console 的三站点恢复、三站点及四进程共享集群 STS 撤销,以及 4 组真实多池迁移(2/3 池 × rebalance/decommission)。在 8 进程 2 池拓扑下,滚动重启负载完成 2,896 次全量扫描,故障恢复负载完成 1,270 次全量扫描,零漏项、零重复、零读取损坏;另有 3 组 Linux 软件包生命周期与 8 种容器运行变体全部通过(注:Windows 与 Darwin amd64 为静态核验,容器 amd64 运行于跨架构模拟环境)。
- Docker Hub 公开摘要:
- 标准镜像(及发布时的
latest):sha256:2636fc4155d9a7e41ff58cdb65ddd13ba9304e67184e13c25bc5cb34016269d7 - Distroless 镜像:
sha256:472f59c7be537571f0f9a2ee6b8fe033a220939d521255bd4bf5339e53db7218
- 标准镜像(及发布时的
感谢 szopi00 报告 Object Lock 问题;mr javad seydi(@mrjavadseydi)贡献原始 LIST 与分片工作;Julien Laurenceau(@julienlau)修复提交元数据分类与结构体复用问题;clown15 修复上传目录清理;cbornet 与 yupoet 改进校验和错误文案;AleksaMCode 修复 Lambda 目标集合判空;以及 Denis Babchuk(@botdeniska)贡献 #248 迁移防覆盖修复与 silo-pkg 性能优化。