注意

本文档适用于 Ceph 开发版本。

CVE-2021-20288: cephx 中未经授权的全局_id 重用

总结

Ceph未能确保重新连接/续订的客户端在回收其全局ID值时呈现现有的凭证。能够进行身份验证的攻击者可以声明另一个客户端正在使用的全局ID,并可能中断其他集群服务。

背景

在Ceph中,每个经过身份验证的客户端或守护进程都被分配了一个数字全局ID标识符。该值假定在整个集群中是唯一的。当客户端重新连接到监控器(例如,由于网络断开连接)或续订其凭证时,它们应该呈现其旧的凭证,以证明先前拥有其全局ID,以便可以回收,从而在客户端实例的整个生命周期中保持不变。

Ceph未能正确检查旧凭证是否有效,允许任意全局ID被回收,即使它正在系统中另一个活动客户端使用。

攻击者要求

任何潜在的攻击者必须:

  • 拥有集群的有效身份验证密钥

  • 知道或猜测另一个客户端的全局ID

  • 运行Ceph客户端代码的修改版本来回收另一个客户端的全局ID

  • 构造适当的客户端消息或请求以中断服务或利用Ceph守护进程关于全局ID唯一性的假设

影响

机密性影响

完整性影响

部分影响。攻击者可能利用关于全局ID唯一性的假设来中断其他客户端的访问或中断Ceph守护进程。

可用性影响

高。攻击者可能利用关于全局ID唯一性的假设来中断其他客户端的访问或中断Ceph守护进程。

访问复杂性

高。客户端必须使用修改后的客户端代码来利用其他Ceph守护进程行为中的特定假设。

身份验证

是。攻击者还必须是经过身份验证的,并且能够访问它希望模仿或中断的客户端所访问的相同服务。

获得访问权限

部分影响。攻击者可以部分模仿另一个客户端。

受影响的版本

所有先前的Ceph监控器版本未能确保全局ID回收尝试是经过身份验证的。

此外,从Luminous v12.2.0开始的用户空间守护进程和客户端在提交a2eb6ae3fb57(“mon/monclient:并行搜索多个监控器”)之后未能安全地回收其全局ID。

所有版本的Linux内核客户端都进行了正确的身份验证。

修复版本

  • Pacific v16.2.1(及更高版本)

  • Octopus v15.2.11(及更高版本)

  • Nautilus v14.2.20(及更高版本)

修复详情

  1. 修复后的监控器现在正确要求客户端在auth_allow_insecure_global_id_reclaimfalse. 最初,默认情况下,此选项设置为true,以便现有客户端可以在不中断的情况下继续运行,直到所有客户端都已升级。当此选项设置为false时,未修复的客户端在间歇性网络中断破坏其与监控器的连接后,将无法重新连接到集群,或者在其超时时(默认为72小时)无法续订其身份验证凭证。

    修复后的监控器如果AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED健康警报。auth_allow_insecure_global_id_reclaim启用,则会触发

    ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 1w
    

    虽然不推荐,但也可以通过以下方式禁用警报:

    ceph config set mon mon_warn_on_insecure_global_id_reclaim_allowed false
    
  2. 修复后的监控器可以在新客户端通过身份验证后立即断开连接(强制其重新连接和回收),以确定它们是否安全地回收全局ID。这允许集群和用户快速发现客户端是否会被要求安全回收全局ID所影响:大多数客户端将立即报告身份验证错误。此行为可以通过设置auth_expose_insecure_global_id_reclaimtofalse:

    ceph config set mon auth_expose_insecure_global_id_reclaim false
    
  3. 修复后的监控器将对任何未安全回收其全局ID的客户端或守护进程触发AUTH_INSECURE_GLOBAL_ID_RECLAIM健康警报。auth_allow_insecure_global_id_reclaim选项之前进行升级,以避免中断客户端访问。

    默认情况下(如果auth_expose_insecure_global_id_reclaim未禁用),客户端未能安全地回收全局ID将立即暴露并触发此健康警报。auth_expose_insecure_global_id_reclaim已禁用,则不会在客户端被迫重新连接到监控器(例如,由于网络中断)或客户端续订其身份验证凭证(默认为72小时)之前触发此警报。

  4. 身份验证凭证的默认生存时间(TTL)已从12小时增加到72小时。由于我们之前在回收客户端的全局ID时未能确保客户端的先前的凭证是有效的,因此客户端可以容忍比凭证TTL更长的网络中断,并且仍然可以回收其全局ID。一旦集群开始要求安全回收全局ID,断开连接时间超过TTL的客户端可能无法回收其全局ID,无法重新进行身份验证,并且直到重新启动之前无法继续与集群通信。将默认TTL增加到最小化此变更对用户的影响。

建议

  1. 用户应尽快升级到Ceph的修复版本。

  2. 用户应尽快升级任何未修复的客户端。默认情况下,可以通过检查ceph health detail输出轻松识别这些客户端的AUTH_INSECURE_GLOBAL_ID_RECLAIM警报。

  3. 如果所有客户端都无法立即升级,则可以通过以下方式暂时静音健康警报:

    ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM 1w  # 1 week
    ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 1w  # 1 week
    
  4. 在所有客户端都已更新并且AUTH_INSECURE_GLOBAL_ID_RECLAIM警报不再存在后,应将集群设置为防止不安全的全局ID回收:

    ceph config set mon auth_allow_insecure_global_id_reclaim false
    

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.