Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第 12 章 OpenSSH

SSH (Secure Shell)是一种协议,它使用客户端-服务器架构促进两个系统之间的安全通信,并允许用户远程登录服务器主机系统。与其他远程通信协议(如 FTPTelnet )不同,SSH 对登录会话进行加密,使得入侵者很难收集未加密的密码。

ssh 程序旨在替换用于登录远程主机(如 telnetrsh )的旧、不太安全的终端应用。名为 scp 的相关程序 取代了设计用于在主机之间复制文件的旧程序,如 rcp。由于这些较旧的应用程序不会加密客户端和服务器之间传输的密码,因此尽可能避免这些密码。使用安全方法登录远程系统可降低客户端系统和远程主机的风险。

Red Hat Enterprise Linux 包括常规 OpenSSH 软件包 openssh,以及 OpenSSH 服务器、open ssh-server 和客户端、open ssh-clients、软件包。请注意,OpenSSH 软件包需要 OpenSSL package openssl-libs,它会安装几个重要的加密库,使 OpenSSH 提供加密通信。

12.1. SSH 协议

12.1.1. 为什么使用 SSH?

潜在入侵者拥有各种工具可供他们使用,使他们能够中断、拦截和重新路由网络流量,以努力访问系统。总体而言,这些威胁可分类如下:

拦截两个系统间通信

攻击者可以位于通信方之间的网络上,复制他们之间传递的任何信息。他可以截获和保存信息,或者更改信息并将其发送给预期收件人。

此攻击通常使用数据包嗅探器来执行,这是一种比较常见的网络实用程序,可捕获通过网络流的每个数据包,并分析其内容。

模拟特定主机

攻击者的系统被配置为作为传输的预期接收者。如果此策略正常工作,用户系统仍不知道它正在与错误的主机通信。

此攻击可以通过称为 DNS 投毒或所谓的 IP 欺骗进行。在第一种情形中,入侵者使用破解的 DNS 服务器将客户端系统指向恶意重复的主机。在第二种情况下,入侵者会发送似乎来自可信主机的虚假网络数据包。

这两种技术都会截获潜在的敏感信息,如果因为恶意原因而进行拦截,结果可能会令人沮丧。如果 SSH 用于远程 shell 登录和文件复制,这些安全威胁可能会大大降低。这是因为 SSH 客户端和服务器使用数字签名来验证其身份。另外,所有客户端和服务器系统之间的沟通都是加密的。尝试欺骗通信两侧的身份无效,因为每个数据包都使用仅由本地和远程系统识别的密钥进行加密。

12.1.2. 主要功能

SSH 协议提供以下保护:

没有人可以组成预期服务器
在初始连接后,客户端可以验证它是否连接到之前连接到的同一服务器。
没有人可以捕获验证信息
客户端使用强大的 128 位加密将其身份验证信息传输到服务器。
没有人可以拦截通信
会话期间发送和接收的所有数据都使用 128 位加密进行传输,因此被拦截的传输极难解密和读取。

另外,它还提供以下选项:

它为通过网络使用图形应用程序提供了安全方法
使用名为 X11 转发的技术 ,客户端可以从服务器转发X11( X Window 系统 )应用程序。
它提供了一种保护其他不安全协议的方法
SSH 协议加密它发送和接收的所有内容。使用称为端口转发的技术,SSH 服务器可以成为保护其他不安全协议(如 POP )并提升整体系统和数据安全性的渠道。
它可以用来创建安全频道
OpenSSH 服务器和客户端可以配置为创建一个类似于虚拟专用网络的隧道,以用于服务器和客户端计算机之间的流量。
它支持 Kerberos 身份验证
可以配置 OpenSSH 服务器和客户端,以使用 Kerberos 网络身份验证协议的 GSSAPI (通用安全服务应用程序接口)实施进行身份验证。

12.1.3. 协议版本

目前存在两种 SSH 变体:版本 1 和更新版本 2。红帽企业 Linux 7 下的 OpenSSH 套件使用 SSH 版本 2,其增强的密钥交换算法不会受到版本 1 中已知漏洞的影响。在 Red Hat Enterprise Linux 7 中,OpenSSH 套件不支持版本 1 连接。

12.1.4. SSH 连接的事件序列

以下一系列事件有助于保护两个主机之间的 SSH 通信的完整性。

  1. 制作加密握手,以便客户端能够验证它是否与正确的服务器通信。
  2. 客户端和远程主机之间的连接传输层使用对称密码进行加密。
  3. 客户端向服务器验证自身。
  4. 客户端通过加密连接与远程主机交互。

12.1.4.1. 传输层

传输层的主要作用是促进两台主机之间在身份验证时以及后续通信期间的通信安全。传输层通过处理数据的加密和解密,以及在数据包发送和接收时提供完整性保护来实现此目的。传输层还提供压缩,加快信息的传输速度。

SSH 客户端联系服务器后,交换关键信息,以便两个系统能够正确构建传输层。在此交换中会执行以下步骤:

  • 交换密钥
  • 确定公钥加密算法
  • 对称加密算法确定
  • 确定消息验证算法
  • 确定哈希算法

在密钥交换期间,服务器利用唯一主机密钥向客户端识别自身。如果之前客户端从未与此特定服务器通信,则服务器的主机密钥对客户端未知且不会连接。OpenSSH 通过接受服务器的主机密钥来解决这个问题。这是在用户收到通知并且已接受并验证新主机密钥之后完成的。在后续连接中,会根据客户端中保存的版本检查服务器的主机密钥,从而确保客户端确实与预期服务器通信。如果以后主机密钥不再匹配,用户必须删除客户端的保存版本,然后才能进行连接。

警告

在初始联系期间,攻击者有可能伪装为 SSH 服务器,因为本地系统不知道预期服务器和攻击者设置的假服务器之间的区别。为帮助防止这种情况,请在第一次连接或出现主机密钥不匹配之前联系服务器管理员来验证新 SSH 服务器的完整性。

SSH 设计为使用几乎任何类型的公钥算法或编码格式。在初始密钥交换创建了用于交换的哈希值和共享 secret 值后,两个系统会立即开始计算新的密钥和算法,以保护身份验证和将来通过连接发送的数据。

使用给定密钥和算法传输一定数量的数据(具体取决于 SSH 实施)后,再进行另一个密钥交换,生成另一组哈希值和新共享 secret 值。即使攻击者能够确定哈希值和共享 secret 值,此信息仅在有限时间内有用。

12.1.4.2. Authentication

传输层构建了一个安全隧道以在两个系统之间传递信息后,服务器会告知客户端支持的不同身份验证方法,例如使用私钥编码签名或输入密码。然后,客户端尝试使用以下任一支持的方法对服务器进行身份验证。

SSH 服务器和客户端可以配置为允许不同类型的身份验证,从而互相提供最佳的控制量。服务器可以根据其安全模型决定它支持的加密方法,客户端也可以选择从可用选项尝试的身份验证方法顺序。

12.1.4.3. Channels

在 SSH 传输层成功验证后,可以通过称为多路复用的技术打开多个通道[1].这些通道各自处理不同终端会话和转发 X11 会话的通信。

客户端和服务器都可以创建新频道。然后,在连接的每个末尾为每个频道分配一个不同的数字。当客户端尝试打开新频道时,客户端会随请求一起发送频道号。此信息由服务器存储,用于直接与该通道通信。这样,不同类型的会话不会相互影响,因此当给定会话结束时,其通道可以在不中断主 SSH 连接的情况下关闭。

频道还支持 flow-control,允许它们以有序的方式发送和接收数据。这样,在客户端收到打开频道的消息前,不会通过通道发送数据。

客户端和服务器根据客户端请求的服务类型以及用户连接到网络的方式自动协商每个频道的特征。这为处理不同类型的远程连接提供了极大的灵活性,无需更改协议的基本基础架构。



[1] 多路连接由通过共享、常见介质发送的多个信号组成。使用 SSH 时,不同的频道通过常见的安全连接发送。