在本文中,我们将通过一个示例来介绍如何配置红帽企业 Linux(RHEL)8 加密策略以移除密码块链接(CBC),但首先,我们需要了解一些关于 CBC 的背景知识以及 RHEL 8 中的默认密码策略。
在操作层面上,我们大多数人都遇到过这样的情况:系统配置复杂,信息太多或太少,导致难以理解所有情况。
例如,是否有人对您说过这样的话:“您的服务器支持 CBC 密码,但这种密码已不推荐再使用,而且容易受到攻击”,然后询问您是否采取了防护措施来避免受到新漏洞的影响,以及能否在部分系统受到影响时尽快报告并进行修复?
您将使用什么工具?您要进行哪些检查?您是否正确配置了系统?您的服务器是否不存在已知漏洞?
幸运的是,这些问题可以通过 RHEL 8 中提供的技术来解决,从而提高运维效率,并增强对加密策略工具的信心和理解。
问题分析
让我们借助这个维基百科条目,退后一步分析一下当前的问题。
该条目指出,CBC 是使用块密码的多种模式之一,即在加密当前密文块之前,将其与前一个密文块进行异或运算。维基百科还称之为“最常用的运算模式”,以及“Niels Ferguson 和 Bruce Schneier 推荐的两种块密码模式之一”。
它还提到该模式于 1976 年发明,这可能给人一种它已经过时且不安全的印象。不过,年代久远并不一定意味着不安全。Diffie–Hellman 密钥交换也是在 1976 年提出的,但至今仍在广泛使用,而且并没有被认为不安全。
所有这些信息实际上并无助于了解当时的情况。这项调查很可能始于一个自动化漏洞扫描程序警报,该警报指出 OpenSSH 服务器愿意使用 CBC 密码模式,并援引 CVE-2008-5161 作为理由。也许还提到过这份文件或其他同样隐晦的文件。“因此,利用这一协议弱点对交互式会话进行有效攻击的可能性很小:攻击者预计要经历大约 11,356 次连接终止尝试,才有可能成功”这样的话可能会让人感到宽慰,但这是否意味着,这项已历经 10 年的安全问题在 RHEL 中没有得到解决?
值得庆幸的是,红帽正在积极主动地监控和缓解其产品中存在的漏洞。实际上,在上述关于 CVE-2008-5161 的 NIST 页面上,突出显示了红帽供应商声明,称该问题已在 RHEL 5 中得到修复。红帽还提供了一个解决办法,可从 sshd 配置中禁用 CBC 密码。
该文章还阐明,所采取的缓解措施是应用上游补丁,从而进一步降低了成功进行攻击的可能性。漏洞扫描程序并不知道此类信息;它会检查是否存在特定的软件包版本,将它们与已知受影响的版本进行匹配,并报告结果。这些工具并不完美,无法检测到此类缓解措施的存在。
如果对特定算法的安全性有任何疑虑,为什么不进一步将其完全禁用呢?这些更改应与兼容性问题进行权衡。
在与旧版 SSH 客户端和服务器的互操作性方面,这些 CBC 密码可能是唯一的通用语言,而如何在更安全的默认设置与兼容性之间取得平衡,这个责任落在了发行版构建者的肩上。
例如,Fedora 33 禁用了用于 SSH 的 CBC 密码,如该合并请求的上游所示。RHEL 8 是一年前发布的企业级发行版,鉴于存在缓解措施并考虑到兼容性原因,决定默认启用这些密码,如以下 bugzilla 所示:1818103 – RHCOS 中启用了 SSH 服务器 CBC 模式密码。
平衡的默认设置固然重要,但默认设置也是可以更改的。每个用户的情况都是独一无二的,他们可以根据自己的需要做出决定。为满足这一需求,RHEL 8 已改用一种新的集中式机制来禁用/启用加密算法的使用,即 crypto-policies。让我们以此为契机,了解如何使用 crypto-policies 来禁用 CBC 密码。
RHEL 8 加密策略相关功能和配置
查看 RHEL 8 上的默认策略,可以更好地理解相应情况:
sudo less /usr/share/crypto-policies/policies/DEFAULT.pol
# A reasonable default for today's standards. It should provide
# 112-bit security with the exception of SHA1 signatures needed for DNSSec
# and other still prevalent legacy use of SHA1 signatures.
在 RHEL 8 中,还可以设置其他策略,以满足与 crypto-policies 相关的其他安全要求:
FIPS.pol:该策略仅使用批准的 FIPS 算法。
FUTURE.pol:提供保守水平的安全防护,预计能够抵御未来短期内的任何攻击。
LEGACY.pol:提供可确保与传统系统最大程度兼容性的设置。
您甚至可以通过创建子策略来灵活修改这些策略,也可以从头开始创建自己的策略。我们之前在红帽博客上发表了 一篇文章,介绍了 update-crypto-policies 工具及其功能和使用说明。
这里还有一个与 RHEL 8 及该主题相关的重要文档:“使用系统范围的加密策略 - 红帽企业 Linux 8”。
如何配置 RHEL 8 加密策略以删除 CBC
回到我们最初的问题,审计员提供了额外的支持事实,即漏洞评估工具报告的问题:“漏洞名称:SSH CBC 模式密码已启用,描述:SSH 服务器上启用了 CBC 模式密码”。
需要区分一点,从网上的评论来看,许多人能够配置其系统,并在通过漏洞扫描后据称已修复问题。在实践中,他们将 sshd 进程配置为不使用 CBC 相关的密码,这会阻止 sshd 使用这些密码。甚至还有一些关于如何应用此类解决方法的说明。
这只是针对 sshd 进程,而不是整个服务器。该设置作用于进程级别,而不是系统级别。换言之,虽然对 SSH CBC 模式的检查会通过,但服务器上仍然会保留一些 CBC 密码。最好在系统级别进行更改,这正是 update-crypto-policies 工具的用武之地。
首先,我们可以查看 RHEL 8 服务器中当前使用的加密策略:
update-crypto-policies --show DEFAULT
由于我们已确定 RHEL 8 使用的是 DEFAULT 加密策略,我们可以尝试在 /usr/share/crypto-policies/policies/DEFAULT.pol
中查找与 CBC 相关的密码。
tls_cipher = ... AES-256-CBC ...AES-128-CBC cipher = ... AES-256-CBC CAMELLIA-256-CBC AES-128-CBC CAMELLIA-128-CBC
(为清楚起见,已删除不相关的密码。)
DEFAULT 策略中使用了六种与 CBC 相关的密码。
这样一来,事情就变得复杂了。在撰写本文时,尚没有策略文件提供关于额外加密策略设置 ssh_cipher 的示例。手册页面中提到了这一点:man crypto-policies (... ssh_cipher: Optional; list of allowed symmetric encryption algorithms (including the modes) for use with the SSH protocol.If absent, the value is derived from cipher...)。
ssh_cipher 是存在的,虽然在 DEFAULT 策略中没有明确显示,但如果我们想要有效地移除所有与 CBC 相关的密码,就需要在子策略中明确排除它。
我们可以创建一个子策略来修改正在使用的 DEFAULT 策略。为此,需要创建一个子策略文件
/etc/crypto-policies/policies/modules/DISABLE-CBC.pmod
注意:命名约定很重要;子策略名称必须全部大写,扩展名 .pmod 则必须小写。
该文件需要包含我们要在 DEFAULT 策略中进行的修改。
要从服务器删除 CBC 密码,修改 DEFAULT 配置文件,我们必须添加以下内容:
tls_cipher = -AES-256-CBC -AES-128-CBC cipher = -AES-128-CBC -AES-256-CBC -CAMELLIA-256-CBC -CAMELLIA-128-CBC ssh_cipher = -AES-128-CBC -AES-256-CBC
要从服务器上仅针对 sshd 删除 CBC 算法:
ssh_cipher = -AES-128-CBC -AES-256-CBC
注意:关于 ssh_cipher,由于没有示例,可以假定其值可以是:
ssh_cipher = -AES-128-CBC -AES-256-CBC -CAMELLIA-256-CBC -CAMELLIA-128-CBC
实际上,我们并不需要这些 -CAMELLIA 参数,因为它们似乎并没有被 sshd 实际播发或使用,这可以通过运行以下命令查看:man sshd_config | grep -i cbc
3des-cbc
aes128-cbc
aes192-cbc
aes256-cbc )
使用 ssh -vv 并查看“Their offer”,可以看到 RHEL 8.2 服务器也没有播发 3des-cbc:aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes128-gcm@openssh.com,aes128-ctr。
必须设置子策略,并在其配置中明确指定要移除 CBC 密码:
sudo update-crypto-policies --set DEFAULT:DISABLE-CBC
我们可以验证它是否已正确设置:
sudo update-crypto-policies --show
DEFAULT:DISABLE-CBC
然后,必须重新启动服务器,策略和子策略才能生效。
此时,服务器应该不会再使用任何 CBC 密码。一种轻松验证的方法是,通过从 RHEL 8 服务器运行此命令来实际检查 sshd
ssh -vv -oCiphers=aes128-cbc,aes256-cbc 127.0.0.1
它应当显示登录信息,并且用户应当能够使用有效的凭据进行连接。
如果 sshd 的 CBC 密码不存在,则应显示
Unable to negotiate with 127.0.0.1 port 22: no matching cipher found.
然后,sshd 进程就会显示该服务器提供的密码,例如: “Their offer: aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes128-gcm@openssh.com,aes128-ctr”
总结
在本博客中,我们逐步演示了如何配置 RHEL 8 服务器以符合给定的加密策略要求。在验证安全问题后,我们演示了如何从服务器中删除与 CBC 相关的密码。我们使用 update-crypto-policies 等工具,以适当的方式在服务器级别达到一些安全合规性要求,而不必在各个组件级别采取行动。
关于作者
Jean-Sébastien Tougne has more than 14 years of experience as an engineer in DTV, Oil and Gas, Computer Systems and Finance industries. He is currently a Red Hat consultant.
产品
工具
试用购买与出售
沟通
关于红帽
我们是世界领先的企业开源解决方案供应商,提供包括 Linux、云、容器和 Kubernetes。我们致力于提供经过安全强化的解决方案,从核心数据中心到网络边缘,让企业能够更轻松地跨平台和环境运营。