第十五章:OpenSSH杂项

本章涵盖了你可能应该知道的SSH主体的杂集,但这些主题不值得单独讨论。我们将讨论OpenSSH中的主机密钥轮换,连接到只支持过时密码和转义字符的主机。

第十五章:OpenSSH杂项主机密钥轮换服务器密钥轮换客户端密钥轮换连接到过时的 SSH 服务器SSH 加密连接示例转义字符结束你的会话调整端口转发后记

主机密钥轮换

在主机接受来自公共互联网的连接一两年后,你应该考虑轮换主机密钥。随着计算能力的提高,算法不仅变得更容易破解,而且潜在的入侵者有更多的时间暴力破解你的私钥。不过,如果你要求用户每年左右验证新的主机密钥,他们会很恼火。你可以使用现有的主机密钥将新的主机密钥安全地传输到客户端。如果现有的主机密钥已被泄露,这没有用,但它可以让你在丢弃旧密钥之前主动将即将到来的主机密钥分发给客户端。

一旦你有了更多服务器,OpenSSH证书比偶尔的密钥轮换更有用。证书完全消除了 known_hosts 和更新客户端的需要。

在服务器和客户端上配置SSH密钥轮换。

服务器密钥轮换

首先创建下一组密钥。创建你打算支持的每种密钥。当然,它们需要不同的文件名。我将新密钥命名为创建年份的前缀。

这给了我们四个新的密钥。限制使用 sshd_config 中的 HostKey 关键字添加这些密钥。在现有主机密钥之后添加这些新密钥:

你的服务器现在已准备好将这些主机密钥分发给客户端。

一旦你确定所有客户端都有新主机密钥的副本,并且你已经放弃等待哪个从不更新所有内容的用户,你就可以禁用旧主机的密钥。

客户端密钥轮换

告诉 ssh(1) 使用 ssh_config 文件中的 UpdateHostKeys 选项查找其他密钥。默认值为 no ,告诉 ssh 忽略新的主机密钥。将其设置为 yes 会自动使用此主机的任何新密钥更新 known_hostsask 设置意味着询问用户是否应该接受新密钥。这镜像了 StrictHostKeyChecking 关键字。

当您连接到设置了 UpdateHostKeys 选项的主机时,您的初始连接看起来会有点不同。

验证主机的公钥指纹,如果正确则接受。但随后你会收到另一组警告。

你的客户端已获取此主机的RSA和ED25519密钥的公钥。你只能集体接受或拒绝这些额外的公钥。这是一种非常罕见的攻击者,它会在破坏其他密钥的同时保持主主机密钥不变,但你真的应该验证所有密钥。

当服务器添加新的主机密钥时,客户端会显示指纹,并给你一个验证它们的机会:

主机密钥更新与连接多路复用(ControlPersist)关键字不兼容。启用 ControlPersist 将禁用主机密钥更新。

虽然PuTTY可以获取它不用于连接的算法的公钥(转到左上角菜单,选择 Special Command -> Cache New Host Key Type),但它不能接受同一类型的多个密钥。当您删除旧的主机密钥时,您的PuTTY用户必须重新验证主机密钥。

连接到过时的 SSH 服务器

在过去的几年里,OpenSSH已经弃用了一大堆协议和加密算法。明显不安全的SSH版本1已经从源代码中删除。但是,在1990's年代行之有效的加密算法已经不再适合今天的互联网。OpenSSH仍然支持这些类型的加密,但默认情况下未启用。你必须使用特殊的命令行选项才能使用它们。

为什么要禁用这些算法?意识。你应该知道SSH连接何时使用弱加密。如果你从未意识到服务器或嵌入式设备只支持糟糕的加密算法,你就永远不会升级或更换它。

当OpenSSH由于加密功能较弱而无法连接到SSH服务器时,它会"告诉"你需要手动连接的所有信息。不过,你必须了解SSH的加密特性。

SSH 加密

SSH协议在四个不同的角色中使用密码学。每个角色都需要不同的算法。OpenSSH使用关键字在ssh_config或命令行中设置每个参数。

密钥交换方法(Key Exchange Method——KEX)用于生成每个连接的一次性对称密钥。关键字 KeyAlgorithms 设置密钥交换方法。

使用 Ciphers 关键字设置通用加密算法。

消息认证码(Message Authentication Codes——MAC)检测流量中的更改。MACs 关键字设置它们。

HostKeyAlgorithems 允许你设置主机密钥的算法。

最后,一些公钥算法被淘汰了。PubkeyAcceptedKeyTypes 关键字允许你启用过时的密钥类型。

连接示例

我的家庭娱乐网络通过一个廉价的嵌入式路由器连接到互联网。它在某种程度上提供SSH。

路由器不提供当前OpenSSH默认接受的主机密钥类型。HostKeyAlgorithms 关键字允许你重新启用支持但不再启用的主机密钥算法。ssh-dss算法(也称为DSA)非常弱,在现代SSH中被抛弃了,但由于这是我的家庭网络,我在这里信任它。使用 HostKeyAlgorithms 关键字将其添加回 ssh 支持的选项中。

又一个错误?当连接到只支持过时加密的SSH服务器时,你可能需要在命令行上设置一些关键字。确定哪些是必要的设置是一个迭代过程。

这个错误有点模糊。与主机密钥算法错误不同,这里没有明显的关键字可供选择。如果你不熟悉Diffie-Hellman密钥交换,最好的方法是使用互联网搜索引擎查看是否有人以前犯过同样的错误。如果你是世界上第一个遇到这个问题的人,请在详细模式下运行 ssh ,收集输出,并联系供应商。

这个特殊的错误被证明是一个密钥交换问题,这个供应商对此很熟悉。我必须重新激活一个过时的密钥交换算法。

我现在可以连接了。

总有一天,OpenSSH会完全弃用这些算法。在此之前升级你的设备。不过,作为临时修复,你可以在 ssh_config 中设置这些选项。

不过,既然我已经写了这一节,我就可以升级我的路由器了。

转义字符

当你通过SSH连接到服务器时,你的击键都会传递到服务器。不过,使用转义字符(escape characters),你可以与本地运行的SSH进程进行通信。转义字符暂时并短暂地暂停你的SSH会话。你可以使用转义字符中断挂起的SSH会话,添加端口转发,向网络设备发送老式的串行式中断等等。

默认转义符式波浪号(~)。很少有Unix命令使用波浪号,但你可以点击两次发送一次。点击 ~~ 表示”是的,我真的想发送一个波浪号“。如果你需要更改转义符,请使用 ssh-e 参数和引号中的所需转义符。

ENTER 键、转义符和第二个字符发出指令。断开连接是 ~. ,编辑端口转发是 ~C ,以此类推。

结束你的会话

转义字符最简单的用法是终止SSH会话。如果远程服务器挂起,请输入波浪号句点:

你现在回到本地了。

(好像FreeBSD14.1无效)

调整端口转发

转义字符可以让你在时间上倒退,调整你用来连接到主机的命令。虽然你不能摆弄密钥算法等,但你可以调整端口转发。输入 ~C 进入命令行,然后输入所需的端口转发。

假设我正在进行SSH会话,并且我想添加一个从桌面上的 9999 端口转发到服务器的动态端口。如果我用这个打开SSH会话,我会在命令行中添加标记 -D 9999 。我首先键入 ~C ,然后得到一个 ssh> 提示符。

这是内部 ssh(1) 命令提示符。在此处添加您的命令行更改。

回到我的客户端,我会看到 ssh(1) 的端口9999是打开的。动态转发是实时的。

要取消端口转发,请返回SSH命令行。使用 -K 标志和用于创建端口转发的命令。在这里,我禁用了刚刚创建的动态转发。

动态前进消失了。

转义符还有其他功能,但它们中的大多数在今天都没有用。不过,如果你很好奇,~? 显示所有可用转义字符的列表。

你可以用SSH做更多的事情。如果你能做到这一切,那么你比几乎所有人都更有能力使用SSH。祝贺 你!

后记

七年前,我对系统管理员使用基于密码的SSH管理关键的(critical)、面向公众的系统发了脾气。

这不是什么新鲜事。数百万比我级别更高的系统管理员发出了这样的咆哮。我决定编写《SSH Mastery》的第一版,明确的目的是杀死密码。我不确定它是否有帮助,但很多高级系统管理员都来找我,感谢我写这本书,特别是因为用它拍打(slapping)别人被认为是“职业行为(professional behavior)”。我希望第二版通过涵盖证书等功能,将帮助这些系统管理员进一步保护他们的服务器。

Unix用户应该已经知道OpenSSH是世界上最重要的安全软件之一。如果你不这样做:OpenSSH是世界上最重要的安全软件之一。几乎每个技术供应商都在其产品中包含OpenSSH。这些价值数十亿美元的公司不为OpenSSH付费。一些OpenSSH开发人员从事特定的日常工作,因为他们的雇主给他们时间在OpenSSH上工作,谷歌、微软和脸书等公司也捐款支持该项目。在很大程度上,OpenSSH是由一群热爱好软件的人创建的。

运行一个大型软件项目并不便宜。OpenSSH是OpenBSD项目的一部分。他们和其他IT组织一样需要服务器、带宽和电力,但必须不断筹集资金。如果你觉得OpenSSH有用,可以考虑发送OpenBSD基金会(http://www.openbsdfoundation.org/)几美元,这样他们就可以继续走了。

Windows用户,PuTTY彻底改变了使用微软系统的SSH。PuTTY开发商非常感激地接受捐款。他们没有服务器基础设施,但他们同样感激捐款。他们以令人耳目一新的诚实宣布,他们将把小额捐款用于励志啤酒和咖喱(curry),而大额捐款可以帮助购买任何必要的硬件或工具。志愿者程序员可能比意外感谢啤酒更有动力,但我还没有看到那会是什么。请参阅PuTTY常见问题解答以获取他们的PayPal地址。

如果你为那些通过将OpenSSH或PuTTY与他们的产品一起运输来赚钱的大公司工作,一定要考虑 勒索(blackmailing extorting)说服(persuading)你的雇主向编写软件的人扔几块钱。或者至少在你的支出账户上给一些开发者买几品脱。我们都会受益。

如果你读了这么多之后还在使用密码呢?我有一大群系统管理员排队要给你一本书。