内容提要
文章记录了将Ceph集群从19.2.3升级到20.2.5以修复CVE-2025-30156的过程:旧版CephX使用固定IV的AES-128-CBC存在认证绕过风险,需改用aes256k并轮换密钥。作者先将虚拟机内核升级到7.2以支持aes256k,再用cephadm升级Ceph并自动替换部分密钥,随后手动轮换client.admin及Rook相关密钥,最后禁用旧aes密钥,确认无安全警告后完成迁移。
延伸解读
内核版本是升级的前置门槛
文章指出,CephFS 通过 Linux 内核挂载时,旧内核不支持 aes256k,指定该密钥会报 secret length 错误。作者因此先将虚拟机内核升级到 trixie-backports 的 7.2 版本,才继续升级 Ceph。这提醒读者:若集群有内核挂载的 CephFS 客户端,需先确认内核支持情况,否则密钥轮换后挂载会失败。
自动轮换之外仍需手动处理密钥
用 cephadm 升级到 20.2.5 后,服务用到的密钥会自动替换为 aes256k,但 client.admin 和 Rook 相关密钥仍需手动轮换。作者先备份 admin 密钥,再执行 rotate,并更新各机器上的 keyring;Rook 的 CSI 等密钥则需在对应 namespace 的 Secret 中替换。这说明升级并非全自动,需逐项核对密钥类型。
收尾阶段要显式禁用旧算法
所有密钥轮换完成后,作者通过配置禁用不安全的 aes 密钥,并执行 wipe-rotating-service-keys,最终将允许的加密套件限制为 aes256k。判断迁移完成的标志是 ceph health 不再出现 insecure key 警告。这一收尾步骤很关键,否则旧密钥仍可能被使用,CVE 风险并未真正消除。
Q&A
CVE-2025-30156 具体是什么问题,为什么必须升级 Ceph?
该漏洞源于 CephX 认证使用固定 IV 的 AES-128-CBC 算法,存在认证绕过风险。必须升级 Ceph 并轮换所有密钥,改用更安全的 aes256k 算法。
升级 Ceph 前为什么要先升级 Linux 内核?
因为很多 CephFS 是通过 Linux 内核挂载的,而 Linux 内核直到 7.0 才支持 aes256k。旧内核指定 aes256k 密钥会报 secret length 错误,无法挂载。所以需要先将虚拟机内核升级到 7.2(来自 trixie-backports)。
用 cephadm 升级 Ceph 到 20.2.5 的命令是什么?升级后哪些密钥需要手动轮换?
升级命令为:ceph orch upgrade start --image quay.io/ceph/ceph:v20.2.5。升级后 cephadm 会自动替换部分密钥为 aes256k,但 client.admin 以及 Rook 相关的密钥(如 client.csi-cephfs-node、client.csi-cephfs-provisioner、client.csi-rbd-node、client.csi-rbd-provisioner、client.healthchecker)需要手动轮换。
如何手动轮换 client.admin 密钥?
参考官方文档,先设置允许的加密算法:ceph mon set auth_allowed_ciphers aes,aes256k 和 ceph mon set auth_preferred_cipher aes256k;然后创建备份密钥:ceph auth get-or-create client.admin-backup mon "allow *" | tee ./client.admin-backup.keyring;用备份密钥验证:ceph -n client.admin-backup -k ./client.admin-backup.keyring auth ls;最后轮换:ceph auth rotate --key-type=aes256k client.admin | tee ./client.admin.keyring。之后修改 /etc/ceph/ceph.client.admin.keyring 并分发,或用 ceph orch client-keyring set client.admin "label:_admin" 更新。
Rook 相关的密钥如何轮换?
以 client.csi-cephfs-node 为例,先执行 ceph auth rotate --key-type=aes256k client.csi-cephfs-node 生成新密钥,然后将新密钥替换 Rook 命名空间中对应 Secret(如 rook-csi-cephfs-node)里的 adminKey。其他密钥类似操作。作者将 Rook 升级到 v1.21.2 后手动替换。
如何确认所有密钥都已轮换并禁用旧算法?
轮换后,通过密钥长度可判断是否为 aes256k。然后执行以下命令禁用旧 aes 密钥:ceph config set mon 'mon auth allow insecure key' false;ceph mon set auth_service_cipher aes256k;ceph auth wipe-rotating-service-keys;ceph mon set auth_allowed_ciphers aes256k。最后运行 ceph health,若无 insecure key 警告即完成迁移。