订阅内容

在本文中,我们将通过一个示例来介绍如何配置红帽企业 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 中没有得到解决?

Security icon thumbnail

值得庆幸的是,红帽正在积极主动地监控和缓解其产品中存在的漏洞。实际上,在上述关于 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.

Read full bio
UI_Icon-Red_Hat-Close-A-Black-RGB

按频道浏览

automation icon

自动化

有关技术、团队和环境 IT 自动化的最新信息

AI icon

人工智能

平台更新使客户可以在任何地方运行人工智能工作负载

open hybrid cloud icon

开放混合云

了解我们如何利用混合云构建更灵活的未来

security icon

安全防护

有关我们如何跨环境和技术减少风险的最新信息

edge icon

边缘计算

简化边缘运维的平台更新

Infrastructure icon

基础架构

全球领先企业 Linux 平台的最新动态

application development icon

应用领域

我们针对最严峻的应用挑战的解决方案

Original series icon

原创节目

关于企业技术领域的创客和领导者们有趣的故事