4.2. SSH:安全的网络操作

随着在联网环境中安装的计算机越来越多,常常需要从远程位置访问主机。通常,这意味着用户要发送登录名和口令字符串进行鉴定。只要以明文形式传送这些字符串,攻击者就可能会截获并恶意使用这些字符串获取对该用户帐户的访问权,而授权用户根本毫无察觉。一旦得逞,攻击者不仅可以控制所有用户文件,还可能利用此非法帐户获取管理员或 root 访问权,或侵入其它系统。过去常用 telnet 建立远程连接,但该程序没有采用加密形式或其它安全机制防止窃听。还存在其它未加保护的通讯信道,例如传统的 FTP 协议和某些远程复制程序。

SSH 套件通过对鉴定字符串(通常由登录名和口令构成)及主机间交换的所有其它数据进行加密,能够提供必要的保护。使用 SSH,虽然第三方仍可以记录数据流,但内容是经过加密的,除非了解加密钥,否则无法将其还原为明文。这样,SSH 在不安全的网络(如因特网)上实现了安全通讯。SUSE Linux 附带的 SSH 程序是 OpenSSH。

4.2.1. OpenSSH 软件包

SUSE Linux 会在默认情况下安装 OpenSSH 包。安装之后即可由程序 ssh、scp 和 sftp 来替代 telnet、rlogin、rsh、rcp 和 ftp。在默认配置中,只能使用 OpenSSH 实用程序访问 SUSE Linux 系统,而且只能在防火墙允许访问的情况下访问。

4.2.2. ssh 程序

使用 ssh 程序可以登录到远程系统并以交互方式工作。该程序取代了 telnet 和 rlogin。slogin 程序只是指向 ssh 的符号链接。例如,使用命令 ssh sun 登录到主机 sun。该主机会随后提示输入 sun 上的口令。

通过鉴定后,既可以使用远程命令行操作,也可以使用 YaST 之类的交互式应用程序操作。如果本地用户名不同于远程用户名,则可以使用不同的登录名通过 ssh -l augustine sunssh augustine@sun 登录。

此外,ssh 还提供了在远程系统上运行命令的功能(也就是 rsh 提供的功能)。下例在主机 sun 上运行命令 uptime 并创建了一个名为 tmp 的目录。程序输出显示在主机 earth 的本地终端上。

ssh otherplanet "uptime; mkdir tmp" 
tux@otherplanet's password:
1:21pm  up  2:17,  9 users,  load average: 0.15, 0.04, 0.02

在此需要加引号,以便用一个命令同时发送两条指令。只有加引号才能在 sun 上执行第二个命令。

4.2.3. scp - 安全复制

使用 scp 可以将文件复制到远程计算机。该程序取代了 rcp,是一个既安全又有加密功能的程序。例如,scp MyLetter.tex sun:将文件 MyLetter.tex 从主机 earth 复制到主机 sun。如果 earth 上的用户名不同于 sun 上的用户名,请使用 username@host 格式指定后者的用户名。此命令没有 -l 选项。

输入正确的口令后,scp 开始传送数据,同时显示一行不断增多的星号来模拟进度条。此外,该程序还能显示到达进度条右端的估计时间。通过提供选项 -q 可以取消显示所有输出。

scp 还提供了对整个目录的递归复制功能。命令 scp-r src/ sun:backup/ 可以将目录 src 的全部内容(包含所有子目录)都复制到主机 sun 上的 backup 目录中。这个子目录若不存在,就会自动创建该子目录。

选项 -p 指示 scp 不更改文件的时间戳。-C 将对传送数据进行压缩。这会最大限度地减少要传送的数据量,但同时增加了处理器的负担。

4.2.4. sftp - 安全的文件传送

sftp 程序可以取代 scp 来执行安全的文件传送。在 sftp 会话期间,您可以使用许多来自 ftp 的命令。sftp 程序可能要优于 scp,特别是在传送文件名未知的数据时。

4.2.5. SSH 守护程序 (sshd) - 服务器端

要使用 SSH 客户机 ssh 和 scp,必须在后台运行服务程序(即 SSH 守护程序),用于监听 TCP/IP port 22 上的连接。首次启动该守护程序时将生成三个密钥对。各密钥对均由私钥和公钥组成。因此,此过程被称为基于公钥的过程。要保证通过 SSH 安全地通讯,必须限制只有系统管理员才能访问私钥文件。文件权限是在默认安装中相应设置的。只有在本地 SSH 守护程序才需要私钥,切勿将私钥提供给其它任何人。公钥组件(可通过扩展名 .pub 识别)将被发送到请求连接的客户机。所有用户都可以读取公钥组件。

连接请求是 SSH 客户机发出的。正在等待的 SSH 守护程序将与请求连接的 SSH 客户机交换标识数据以比较协议和软件版本,防止通过错误的端口连接。由于请求是由最初的 SSH 守护程序的子进程回复的,所以可以同时建立多个 SSH 连接。

对于 SSH 服务器和 SSH 客户机间的通信,OpenSSH 支持使用版本 1 和版本 2 的 SSH 协议。新安装的 SUSE Linux 系统默认采用版本 2。要在更新后继续使用版本 1,请按照 /usr/share/doc/packages/openssh/README.SuSE 中的说明操作。本文档还介绍了如何只通过几个步骤就将 SSH 1 环境转换为有效的 SSH 2 环境。

使用 SSH 版本 1 时,服务器将发送其公共主机密钥和服务器密钥,SSH 守护程序每小时就重新生成一次服务器密钥。这两个密钥都允许 SSH 客户机对自由选择的会话密钥加密(会话密钥会被发送到 SSH 服务器)。SSH 客户机还会通知服务器使用哪种加密方法(加密法)。

版本 2 的 SSH 协议不需要服务器密钥。但服务器端和客户端都要使用符合 Diffie-Helman 的算法来交换它们的密钥。

一定要使用私用主机密钥和服务器密钥对会话密钥解密,从公钥根本无法得出这些密钥。只有建立联系的 SSH 守护程序才能使用其私钥对会话密钥解密(请参见 man /usr/share/doc/packages/openssh/RFC.nroff)。打开 SSH 客户机的冗长调试选项 -v 可以密切监视初始阶段的连接。

默认情况下使用的是版本 2 的 SSH 协议。用 -1 开关可以覆盖此默认设置,转而使用该协议的版本 1。在与远程主机首次建立联系之后,客户机会将所有公共主机密钥储存在 ~/.ssh/known_hosts 中。这会防止各种中间人攻击,即外部 SSH 服务器试图使用伪造名称和伪造 IP 地址侵入系统。如果 ~/.ssh/known_hosts 未包含某个主机密钥,或是因未能提供正确的私钥致使服务器无法对会话密钥解密,这两种情况下都可以检测到此类攻击。

建议将储存在 /etc/ssh/ 中的私钥和公钥备份到安全的外部位置。这样就可以检测到密钥修改,并可以在重装后再次使用旧密钥。用户也就无需了解那些含糊不清的警告了。如果经过校验(尽管有警告)得知这确实是正确的 SSH 服务器,则必须从 ~/.ssh/known_hosts 中去除有关此系统的现有项。

4.2.6. SSH 鉴定机制

现在开始执行实际的鉴定,最简单的鉴定形式就是上文提到的输入口令。SSH 的目的是提供安全且方便使用的软件。由于 SSH 是用来取代 rsh 和 rlogin 的,所以 SSH 必须也能提供一种适合日常使用的鉴定方法。SSH 是通过另一个密钥对(由用户生成)来实现该功能的。为此,SSH 软件包提供了一个帮助程序:ssh-keygen。输入 ssh-keygen -t rsassh-keygen -t dsa 后就会生成密钥对,同时系统会提示您输入储存密钥所用的基本文件名。

确认默认设置并回应针对通行密码的请求。即使软件建议输入空的通行密码,仍建议您为此处说明的过程输入一个 10 到 30 个字符的通行密码。请不要使用简短的单词或短语。再次输入通行密码进行确认。随后,您将看到私钥和公钥的储存位置,在本例中为文件 id_rsaid_rsa.pub

使用 ssh-keygen -p -t rsassh-keygen -p -t dsa 更改旧的通行密码。将公钥组件(本例中为 id_rsa.pub)复制到远程计算机并保存到 ~/.ssh/authorized_keys 中。下次建立连接时,系统将要求您使用通行密码对自身进行鉴定。如果系统没有要求鉴定,请校验这些文件的位置和内容。

从长期看,此过程比每次提供口令要麻烦。所以,SSH 软件包提供了另一种工具 ssh-agent,该工具可以在 X 会话期间保留私钥。整个 X 会话作为 ssh-agent 的子进程启动。为此,最简单的方法是将 .xsession 文件开始位置的变量 usessh 设置为 yes 并通过显示管理器(如 KDM 或 XDM)登录。也可以输入 ssh-agent startx

现在您就可以像平常那样使用 ssh 或 scp 了。如果按上文所述分发了公钥,系统就不再提示您输入口令。终止 X 会话或用口令保护应用程序(如 xlock)锁定该会话时一定要小心。

文件 /usr/share/doc/packages/openssh/README.SuSE 还介绍了由于引入版本 2 的 SSH 协议而产生的所有相关更改。

4.2.7. X、鉴定和转发机制

除上述有关安全方面的改进之外,SSH 还简化了远程 X 应用程序的用法。如果运行带选项 -Xssh,远程计算机上会自动设置 DISPLAY 变量,而且所有 X 输出都将通过现有 SSH 连接导出到远程计算机上。同时,如果未经授权,其它人将无法截获通过此方法远程启动并在本地查看的 X 应用程序。

通过添加选项 -A,可以将 ssh-agent 鉴定机制转移到下一台计算机上。这样,您就可以在不同计算机上工作而无需输入口令,但前提是:已将公钥分发给目标主机并在其上正确保存。

上述两种机制在默认设置中均处于取消激活状态,但可以随时在全系统范围的配置文件 /etc/ssh/sshd_config 或用户的 ~/.ssh/config 中永久激活这两种机制。

ssh 还可用于重定向 TCP/IP 连接。在下例中,SSH 分别用于重定向 SMTP 和 POP3 端口:

ssh -L 25:sun:25 earth

使用此命令,可以通过加密信道将定向到 earth 端口 25(SMTP) 的任何连接重定向到 sun 上的 SMTP 端口。如果用户所用的 SMTP 服务器不具备 SMTP-AUTH 或 POP-before-SMTP 功能,此命令特别有用。从与网络相连的任意位置都可以将电子邮件传送到“家庭”邮件服务器进行递送。同样,使用以下命令,可以将 earth 上的所有 POP3 请求(端口110)转发给 sun 的 POP3 端口:

ssh -L 110:sun:110 earth

必须以 root 身份执行这两个命令,因为连接指向有特权的本地端口。普通用户通过现有 SSH 连接发送和检索电子邮件。为此,必须将 SMTP 和 POP3 主机设置为 localhost。有关其它信息,请参见上述每个程序的手册页以及 /usr/share/doc/packages/openssh 下的文件。