跳转到主要内容

SILO 20261112:安全加固、服务账号策略继承与多存储池修复

SILO Server 20261112 发布说明:SN-2026-020 至 SN-2026-025 安全修复、严格策略 JSON 校验、Object Lock null 版本与副本保护、压缩加密对象区间读取修复,以及 Console 2.7.2、mcli 20261112 与 silo-pkg 3.16.1。

SILO Server 20261112 已正式发布。 标签为 RELEASE.2026-11-12T00-00-00Z,软件包版本为 20261112000000.0.0,源码提交为 44e848fedf8c。本版本汇总了 Server 20261109 之后的 SN-2026-020 至 SN-2026-025 安全修复、严格策略 JSON 解析、Object Lock null 版本与复制保护及多存储池修复,基于 Go 1.27.4 构建,并配套内嵌 Console 2.7.2、mcli 20261112 与 silo-pkg 3.16.1。

GitHub Release · 完整变更日志 · 安全公告台账 · 升级指南 · 下载安装

组件版本

组件 正式版本 固定源码
SILO Server RELEASE.2026-11-12T00-00-00Z,包版本 20261112000000.0.0 44e848fedf8cec3d8c0da4b1aa8422390a2b7a8b
内嵌/独立 Console v2.7.2 0e7953ff59c4a1eb77c7d203b265e6783ff18d01
MC 模块/镜像内置 mcli 20261112 a37a9f054fba828a0bbbceb4e9ff247ccf09c28d
共享包 silo-pkg v3.16.1 433f7eefa714a30b72ca70c4dffcd5faca25804f
可选外部 KES 20261026 e9b4f1acebc11d61b42f876da8df48f548750cc9
Go/上游 S3 SDK Go 1.27.4/固定上游 minio-go/v7 v7.4.2-0.20261025165926-320af050c445

完整 Go 模块版本见组件版本矩阵。单独升级独立版 Console、mcli 或 silo-pkg 不会替换旧版 Server 二进制中的内嵌组件。KES 保持独立、可选的外部密钥服务与独立发版节奏。正式支持维护中的 PGSTY 组件栈;对上游 MinIO/MC 保持尽最大努力兼容。

S3、复制与 Object Lock 安全收口

  • 单池 DeleteObjects 路径隔离(SN-2026-020): 单存储池 DeleteObjects 在下发磁盘前拦截未通过对象名合法性检查(如含 .. 路径段)的条目并返回 XMinioInvalidObjectName,防止跨桶删除、.minio.sys 元数据写入及 COMPLIANCE 对象锁绕过(a18293d0c)。
  • 双活复制标签与读取代理(SN-2026-022,#337): DeleteObjectTagging 在转发复制代理前先完成认证;GetObjectTagging、PutObjectTagging、DeleteObjectTagging 与代理 GET/HEAD 均读取并校验远端存量标签(14ecb222e、67a90dfef、293ab78b4、c39605d4f),对不可读目标失败关闭并容忍复制延迟导致的缺失副本;本地与复制代理 GET/HEAD 仅在调用方具备未被显式拒绝的对应标签或保留期/法务保留读取权限时才返回 x-amz-tagging-count、X-Amz-Tagging 及规范大小写 X-Amz-Object-Lock-* 响应头(ea37a7e8b)。
  • SigV4 与流式尾标认证(SN-2026-023,#338): 已认证的 STREAMING-UNSIGNED-PAYLOAD-TRAILER 分块上传强制校验 15 分钟签名时间窗与 checkUnsignedHeaders 请求头覆盖,同时保留桶策略授权的匿名上传(14ecb222e、296c9710b);拒绝 SigV4 凭据作用域日期与请求时间戳不符、负数 X-Amz-Decoded-Content-Length 及截断或超过 64 KiB 的流式尾标。
  • 存量标签与指定版本鉴权(SN-2026-024,#293,#342): 在 GetObjectAttributes、CopyObject、UploadPartCopy、SelectObjectContent 以及纯内存无写入副作用的 ZIP 归档成员读取/列举(s3:ListBucket + s3:GetObject)上强制校验 s3:ExistingObjectTag/<key>;带标签条件 GET/HEAD 未达读仲裁时保留 5xx 存储错误;CopyObject COPY 标签指令按实际复制标签评估目的端请求标签条件;带 versionId 的读取与标签操作优先执行版本动作的显式 Deny,无显式版本拒绝时保留历史基础动作兼容授权。
  • 副本与 null 版本 Object Lock(#336): 副本写入与复制在修改锁内合并目标端锁与标签状态,提交前核验暂存副本哈希、SSE-C 状态与压缩前 ActualSize,阻止对端时间戳清除或缩短未到期 COMPLIANCE 合规保留期,要求 X-Minio-Replication-* 请求头纳入基于请求头的 SigV4 签名,在 x-minio-force-delete 无法读取桶锁元数据时失败关闭(cf486df66),并在暂停版本控制或前缀排除的存储桶中跨单池与多池部署保护受锁 null 版本免遭普通覆写、删除标记或无版本 DELETE 破坏。

IAM、服务账号与严格策略校验

  • 服务账号三态内联策略语义(SN-2026-021、SN-2026-025,#331,#339,#345): UpdateServiceAccount 在 newPolicy 省略或为 null 时保留既有内联会话策略(含 20261111 前历史全拒绝空 embedded-policy 账号),仅在收到显式空策略文档({} 或 {"Statement":[]})时清除内联限制并恢复父账号继承,并为缺少 Version 的非空内联策略自动补齐 2012-10-17。IAM 导入完整保留服务账号与用户组的禁用状态并准确报告组导入错误(1d714834c)。
  • 严格策略 JSON 解码: IAM 命名策略、服务账号会话策略、STS Policy 参数、IAM 导入/复制与存储桶策略统一通过 silo-pkg v3.16.1 拒绝未知 JSON 字段、尾部多余 token、非对象输入、空 Principal: {} 及未实现的 NotPrincipal(34ba7cc1f),导入前先完整校验策略归档,同时保持存量落盘 IAM 策略读取与桶策略复制显式 null 删除墓碑兼容。
  • 站点复制并发锁快照与凭据清理: IAM 自愈、存储桶与元数据自愈、状态采集及复制钩子均先获取站点拓扑快照并释放集群状态锁后再执行存储读写与对端 RPC(见设计说明),导出与复制凭据自动剥离派生策略声明。

存储池、压缩加密区间读取、生命周期与批处理

  • 跨池复制与迁移池权威副本(#343): 历史版本自身复制(向同名 key 发起 PUT ?versionId=...)可在多存储池集群中为明文、SSE-S3、SSE-KMS、SSE-C 及多块 S2 压缩对象(保留 Parts[0].Index 寻址索引)生成可读新版本;原地副本元数据更新在退役或再平衡池上保留权威正文(见设计说明)。
  • 压缩加密对象 Range 读取: 同时启用压缩与服务端加密(SSE-S3、SSE-KMS、SSE-C)的对象在执行带索引字节区间读取时,即使目标压缩分块起点位于首个 64 KiB 加密帧内部(decryptSkip > 0),也能准确推进 DARE 解密流而无需重写存量对象,同时在底层密文篡改损坏时继续严格验签失败关闭(939cb2600)。
  • 生命周期/恢复版本仲裁与元数据缓存(#332,#344): 统一规范化 2024-04-28 前部分自愈遗留的旧 xl.meta 头部(见设计说明),并从 revisionKey 比对中清除随时间变化的 xlFlagUsesDataDir 标志位,避免拆散跨盘仲裁;BucketMetadataSys.GetConfig 防止旧缓存覆盖较新的存储桶配置。
  • 存储池退役(#334): 停止无实质物理进展的空转扫描、及时返回取消错误、重新扫描此前被精确同名父对象遮蔽的子键,并在核验源端清理时容忍纠删集读仲裁范围内的离线磁盘。
  • SSE-KMS 加密上下文与批处理密钥轮换: S3 写入接口(PutObject、CopyObject、CreateMultipartUpload、表单 POST)对空值、畸形 Base64/UTF-8/JSON、尾随 token 或非字符串/非 null 成员值的 X-Amz-Server-Side-Encryption-Context 请求头统一返回 400 InvalidArgument(不再返回 500 InternalError)。Batch keyrotate 在执行、重试与清单重载全链路保留已配置的 KMS 上下文(见设计说明),将历史 XLV1 对象流式重写为带明文 MD5 密封 ETag 且保留标签/过期时间的 XLV2 对象,并在 SSE-S3 转 SSE-KMS 时保留内部分片与分层头。

Console、客户端与依赖

内嵌与独立版 Console 2.7.2 完整包含 2.7.1 的服务账号三态内联策略编辑器、弹窗内错误提示、严格策略 JSON 校验及 --host 0.0.0.0/CONSOLE_SECURE_TLS_HOST 下 HTTP→HTTPS 重定向主机名保留修复(unrolled/secure v1.18.0),并同步 2.7.2 发布元数据与优化后的前端静态资源。mcli 20261112 对齐各访问密钥编辑命令的显式空策略({})重置行为(#78)并启用客户端严格策略 JSON 校验。silo-pkg 3.16.1 基于 Go 1.27.4 提供 ParseConfigStrict/ParseBucketPolicyConfig 严格解析与基础依赖更新,Server 同时保留 go-systemd v22.6.0 以维持 NetBSD 交叉编译兼容(72a6047bf)。发布门禁现统一校验 silo-pkg、内嵌 Console v2.7.2、mcli 标签与源码提交、main 分支 DCO 签署以及 Helm Chart 7.0.5 的 appVersion/image.tag 一致性(c83dbe0ea)。

升级与回滚

  1. 重启前确认 .minio.sys 读仲裁健康,并保留 20261109 升级前提。 重启前核实各纠删集具备健康读仲裁。若从 20261026 及更早版本直接跨版本升级,须同时遵循 20261109 升级清单(排空或取消未完成 Batch 作业;单池各纠删集未共享相同主机集合时——如 18 台及以上自动布局主机——须全量停机切换;混合版本期间暂停 POST ?restore)。
  2. 多存储池集群跨版本滚动重启期间排空或暂停并发 S3 写入。 在全部节点运行 20261112 前,新旧节点混跑可能交错多池写锁顺序或在未升级对端跳过挂起/前缀排除桶的 null 版本对象锁检查。
  3. 多站点滚动升级窗口内冻结未升级 20261109 站点的服务账号编辑。 在 20261109 及更早站点上切换状态或无 --policy 修改属性仍会剥离内联会话策略并同步至对端。待全部站点升至 20261112 后,按经人工复核的目标策略核查 mcli admin user svcacct info 显示 Policy: implied 的账号,切勿盲目执行 site-replication resync。
  4. 上线前排查自动化脚本中的策略与加密上下文 JSON 格式。 提交拼写错误策略键(如误写 Conditions)、尾随 JSON、空 Principal: {}、NotPrincipal 或非字符串 KMS 加密上下文值的自动化调用现在会收到 400,不再静默丢弃字段或返回 500。
  5. 重启后逐节点验证 S3 数据路径并显式指定 Helm 镜像标签。 对每个重启节点执行有界超时的签名 S3 写入与回读校验;以 --reuse-values 升级 Helm Chart 7.0.5 时,显式传入 --set image.tag=RELEASE.2026-11-12T00-00-00Z。

代价与限制

S3 DeleteObjects 中所有显式指定 VersionId 的版本删除(包括未启用 Object Lock 的普通存储桶)以及可能替换受锁 null 版本的无版本删除,现在统一走单对象顺序执行路径,大批量显式版本清理耗时相应增加;普通删除标记写入与不涉及受锁 null 版本的无版本批量删除继续走并发批量路径。

存储超时仍不证明底层磁盘写入未提交,本版本不新增分布式 fencing,也不会自动恢复历史已删除数据或已被剥离的内联策略。已知限制仍包括 ListMultipartUploads 前缀与分页(#79)、多站点删除标记清除(#217)、站点复制重放建桶(PR #241),以及上游 SDK 在分片完成重试时可能丢失条件请求头(mcli put --if-not-exists;见分片完成重试分析)。

交付与验证

发布提交 44e848fedf8c 已通过 Go CI、VulnCheck、DCO、Test Release Pipeline、标签发布构建、软件包签名定稿与多架构容器镜像发布,并完成八节点双池集群对压缩加密区间读取、复制代理响应头鉴权、服务账号三态策略更新与升级路径的实机复验。

GitHub Release 提供 36 个 Server 制品(Linux/macOS tar.gz 与 Windows ZIP 归档、经 GPG 签名的 x86_64 与 aarch64 RPM、DEB 与 APK 软件包、SHA-256 校验和、SPDX SBOM、Sigstore 签名包及构建溯源证明),配套独立发布的 44 个 Console 2.7.2 制品、19 个 mcli 20261112 制品、19 个 KES 20261026 制品及仅源码发布的 silo-pkg 3.16.1 模块。多架构容器镜像(linux/amd64 与 linux/arm64)已发布至 Docker Hub:

  • docker.io/pgsty/silo:RELEASE.2026-11-12T00-00-00Z(latest):sha256:c20d112390b9a9ce8c11b8af95ad35bcaa62f4759663c09c936cd8d2b511f329
  • docker.io/pgsty/silo:RELEASE.2026-11-12T00-00-00Z-distroless(distroless):sha256:a72e17773bdeb151999f9bf9d3bd842fb03850a577b730ab8c63343bb1f468fd

感谢 @botdeniska 提供带标签条件读取错误保留与存储池退役同名父子键重扫修复(#294、#335)及推动 SN-2026-020 排查的批量删除对象锁报告,感谢 @seumasdunlop 报告 Helm Chart 默认服务端镜像标签过期问题(#296)。各组件与社区贡献者详见社区贡献者记录。

源码变更日志 · 相对 20261109 的完整对比

表格阅读