23 SSH:安全网络操作 #
在网络环境中,常常需要从远程位置访问主机。如果用户以纯文本形式发送用于身份验证的登录和口令字符串,攻击者可能会截获这些信息,并滥用它们来获取对该用户帐户的访问权限。这样,攻击者便可以打开该用户的所有文件,并可以利用非法帐户获取管理员或 root
访问权限,或侵入其他系统。过去常用 telnet
、rsh
或 rlogin
建立远程连接,但这种方式不能采用加密形式或其他安全机制防止窃听。另外还存在其他几种不受保护的通讯通道,例如传统的 FTP 协议和某些远程复制程序(如 rcp
)。
SSH 套件通过对身份验证字符串(通常由登录名和口令构成)及主机间交换的所有其他数据进行加密,能够提供必要的保护。使用 SSH,虽然第三方仍可以记录数据流,但内容是经过加密的,除非了解加密钥,否则无法将其还原为明文。这样,SSH 在不安全的网络(如因特网)上实现了安全通讯。SUSE Linux Enterprise Server 附带的 SSH 实现是 OpenSSH。
默认情况下,SUSE Linux Enterprise Server 会安装可提供 ssh
、scp
和 sftp
命令的 OpenSSH 软件包。在默认配置中,要远程访问 SUSE Linux Enterprise Server 系统,只能使用 OpenSSH 实用程序来进行,并且仅当 sshd
正在运行且防火墙允许这种访问时才可以。
SUSE Linux Enterprise Server 上的 SSH 会使用加密硬件加速(如果可用)。因此,与不使用加密硬件相比,通过 SSH 连接传输大量数据的速度要快得多。另一个优势是,CPU 的负载也会大幅减少。
23.1 ssh
— 安全外壳 #
使用 ssh
可以登录到远程系统并以交互方式工作。要以用户 tux
的身份登录到主机 sun
,请输入以下命令之一:
tux >
ssh tux@suntux >
ssh -l tux sun
如果两台计算机上的用户名相同,您可以省略用户名。使用 ssh sun
便已足够。远程主机会提示输入远程用户的口令。成功进行身份验证后,您便可以通过远程命令行执行操作,或使用交互式应用程序(例如文本模式的 YaST)。
此外,ssh
可让您使用 ssh
HOST COMMAND 在远程系统上运行非交互式命令。需要正确地将 COMMAND 括在引号中。可以像在本地外壳中一样串联多个命令。
tux >
ssh root@sun "dmesg -T | tail -n 25"tux >
ssh root@sun "cat /etc/issue && uptime"
23.1.1 在远程主机上启动 X 应用程序 #
SSH 还简化了远程 X 应用程序的使用。如果您结合 -X
选项运行 ssh
,远程计算机上会自动设置 DISPLAY
变量,而且所有 X 输出都将通过现有 SSH 连接导出到本地计算机。此外,未获授权的个人无法拦截远程启动的 X 应用程序。
23.1.2 代理转发 #
添加 -A
选项可将 ssh-agent 身份验证机制转移到下一台计算机。这样,您就可以在不同计算机上工作而无需输入口令,但前提是:已将公钥分发给目标主机并在其上正确保存。有关详细信息,请参考 第 23.5.2 节 “复制 SSH 密钥”。
默认设置中会停用此机制,但您可以在系统范围的配置文件 /etc/ssh/sshd_config
中设置 AllowAgentForwarding yes
随时将其永久激活。
23.2 scp
— 安全复制 #
scp
可将文件复制到远程计算机或从中复制文件。如果 jupiter 上的用户名不同于 sun 上的用户名,请使用 USER_NAME@host
格式指定后者的用户名。如果应将文件复制到其他目录而不是远程用户的主目录,请以 sun:DIRECTORY 形式指定该目录。下列示例显示了如何将文件从本地计算机复制到远程计算机,以及反向复制。
tux >
scp ~/MyLetter.tex tux@sun:/tmp 1tux >
scp tux@sun:/tmp/MyLetter.tex ~ 2
-l
选项
在 ssh
命令中,可以使用 -l
选项指定远程用户(替代 USER_NAME@host
格式)。在 scp
中,-l
选项用于限制 scp
所使用的带宽。
输入正确的口令后,scp
将启动数据传输。它会显示复制的每个文件的进度条和剩余时间。使用 -q
选项可以隐藏所有输出。
scp 还提供了对整个目录的递归复制功能。
命令
tux >
scp -r src/ sun:backup/
会将目录 src
的全部内容(包括所有子目录)复制到主机 sun 上的 ~/backup
目录中。如果此子目录不存在,系统会自动创建该子目录。
-p
选项告知 scp
不要更改文件的时戳。-C
将对传送数据进行压缩。这可以最大限度地减少要传输的数据量,但同时会增加两台计算机的处理器的负担。
23.3 sftp
— 安全文件传输 #
23.3.1 使用 sftp
#
如果您要将多个文件复制到其他位置或从中复制多个文件,使用 sftp
会很方便,它能够替代 scp
。它会打开一个外壳,其中包含一组与普通 FTP 外壳类似的命令。在 sftp 提示符处键入 help
可获取可用命令的列表。sftp
手册页中提供了更多细节。
tux >
sftp sun
Enter passphrase for key '/home/tux/.ssh/id_rsa':
Connected to sun.
sftp> help
Available commands:
bye Quit sftp
cd path Change remote directory to 'path'
[...]
23.3.2 设置文件上载权限 #
与使用普通的 FTP 服务器一样,用户不仅可以下载,而且可以使用 put
命令将文件上载到运行 SFTP 服务器的远程计算机。默认情况下,向远程主机上载文件时将使用与本地计算机上相同的权限。有两个选项可以自动更改这些权限:
- 设置 umask
umask 充当本地主机上原始文件的权限的过滤器。它还可以撤回权限:
表 23.1︰ #原始权限
umask
上载的权限
0666
0002
0664
0600
0002
0600
0775
0025
0750
要在 SFTP 服务器上应用 umask,请编辑文件
/etc/ssh/sshd_configuration
。搜索以Subsystem sftp
开头的行,并添加包含所需设置的-u
参数,例如:Subsystem sftp /usr/lib/ssh/sftp-server -u 0002
- 显式设置权限
显式设置权限会为通过 SFTP 上载的所有文件设置相同的权限。使用
-u
指定三位数模式,例如600
、644
或755
。如果同时指定-m
和-u
,将忽略-u
。要在 SFTP 服务器上为上载的文件应用显式权限,请编辑文件
/etc/ssh/sshd_configuration
。搜索以Subsystem sftp
开头的行,并添加包含所需设置的-m
参数,例如:Subsystem sftp /usr/lib/ssh/sftp-server -m 600
23.4 SSH 守护程序 (sshd
) #
要使用 SSH 客户端程序 ssh
和 scp
,必须在后台运行一台服务器(SSH 守护程序)来监听 TCP/IP 端口 22
上的连接。首次启动该守护程序时将生成三个密钥对。每个密钥对由私用密钥和公共密钥组成。因此,此过程称为基于公共密钥。要保证通过 SSH 安全地通讯,必须限制只有系统管理员才能访问私钥文件。文件权限是在默认安装中相应设置的。只有在本地 SSH 守护程序才需要私钥,切勿将私钥提供给其他任何人。公钥组件(可通过扩展名 .pub
识别)将被发送到请求连接的客户端。所有用户都可以读取公钥组件。
连接请求是 SSH 客户端发出的。等待中的 SSH 守护程序将与请求方 SSH 客户端交换标识数据来比较协议和软件版本,以防止连接通过错误的端口。由于请求是由最初的 SSH 守护程序的子进程回复的,所以可以同时建立多个 SSH 连接。
对于 SSH 服务器和 SSH 客户端间的通讯,OpenSSH 支持使用版本 1 和版本 2 的 SSH 协议。默认情况下使用的是版本 2 的 SSH 协议。使用 -1
选项可以覆盖此默认设置,改为使用该协议的版本 1。
使用 SSH 版本 1 时,服务器将发送其公共主机密钥和服务器密钥,SSH 守护程序每小时就重新生成一次服务器密钥。这两个密钥都允许 SSH 客户端对自由选择的会话密钥加密(会话密钥会被发送到 SSH 服务器)。SSH 客户端还会通知服务器使用哪种加密方法(加密法)。版本 2 的 SSH 协议不需要服务器密钥。服务器端和客户端都使用基于 Diffie-Hellman 的算法来交换它们的密钥。
一定要使用私用主机密钥和服务器密钥对会话密钥解密,从公钥根本无法得出这些密钥。只有被联系的 SSH 守护程序能够使用其私用密钥解密会话密钥。使用 SSH 客户端的 -v
选项启用详细调试可以密切监测此初始连接阶段。
要监测 sshd
的日志项,请使用以下命令:
tux >
sudo
journalctl -u sshd
23.4.1 维护 SSH 密钥 #
建议将储存在 /etc/ssh/
中的私钥和公钥备份到安全的外部位置。这样就可以检测密钥修改事件,或者在安装新系统后再次使用旧密钥。
如果在已经装有 Linux 系统的计算机上安装 SUSE Linux Enterprise Server,安装例程会自动从现有安装导入最近访问的 SSH 主机密钥。
首次与远程主机建立安全连接时,客户端会在 ~/.ssh/known_hosts
中储存所有公共主机密钥。这会防止各种中间人攻击 — 外部 SSH 服务器试图使用伪造名称和伪造 IP 地址侵入系统。如果 ~/.ssh/known_hosts
未包含某个主机密钥,或是因未能提供正确的私用密钥致使服务器无法解密会话密钥时,就可以检测到此类攻击。
如果主机的公共密钥已更改(连接到此类服务器之前需要校验此情况),可以使用 ssh-keygen -r HOSTNAME
去除造成问题的密钥。
23.4.2 轮换主机密钥 #
从版本 6.8 开始,OpenSSH 随附了一个支持主机密钥轮换的协议扩展。如果您仍在使用弱密钥(例如 1024 位 RSA 密钥),更换密钥会有帮助。强烈建议更换此类密钥,改用 2048 位 DSA 密钥甚至更强的密钥。然后,客户端会使用“最佳的”主机密钥。
在服务器上安装新的主机密钥后,重启动 sshd。
如果用户使用 ssh
发起连接,此协议扩展可向客户端告知服务器上的所有新主机密钥。然后,客户端上的软件会更新 ~/.ssh/known_hosts
,因而用户无需手动接受以前已知且可信的主机的新密钥。除了在此会话期间用于对主机进行身份验证的密钥以外,本地 known_hosts
文件还将包含远程主机的所有主机密钥。
在服务器管理员知道所有客户端已提取新密钥后,他们便可以去除旧密钥。该协议扩展还可确保从客户端的配置中去除已过时的密钥。密钥在发起 ssh
会话时去除。
有关更多信息,请参见:
http://blog.djm.net.au/2015/02/key-rotation-in-openssh-68.html
http://heise.de/-2540907(„Endlich neue Schlüssel für SSH-Server“,仅提供德语版)
23.5 SSH 身份验证机制 #
最简单的身份验证方式是通过输入用户的口令来完成,就如同用户在本地登录一样。但记住远程计算机上多个用户的口令比较没有效率,而且这些口令将来有可能会更改。另一方面,在授予 root
访问权限时,管理员需要能够在不更改 root
口令的情况下快速撤消此类权限。
为了在不要求输入远程用户口令的情况下实现登录,SSH 将使用另一个密钥对,该密钥对需由用户生成。该密钥对由一个公共密钥(id_rsa.pub
或 id_dsa.pub
)和一个私用密钥(id_rsa
或 id_dsa
)组成。
要在不指定远程用户口令的情况下登录,“SSH 用户”的公共密钥必须位于 ~/.ssh/authorized_keys
中。此方法还能确保远程用户获得完全控制权:添加密钥需要远程用户的口令,去除密钥会撤消远程登录权限。
为实现最大安全性,此类密钥应受通行口令的保护,每当您使用 ssh
、scp
或 sftp
时,都需要输入此通行口令。与简单身份验证相反,此通行短语独立于远程用户,因此始终保持不变。
除了上述基于密钥的身份验证以外,SSH 还提供基于主机的身份验证。借助基于主机的身份验证,可信主机上的用户可以使用相同的用户名登录到启用了此功能的另一台主机。SUSE Linux Enterprise Server 设置为使用基于密钥的身份验证,有关在 SUSE Linux Enterprise Server 上设置基于主机的身份验证的内容不在本手册的范畴内。
如果要使用基于主机的身份验证,/usr/lib/ssh/ssh-keysign
中应该设置 setuid 位,但这不是 SUSE Linux Enterprise Server 中的默认设置。在这种情况下,请手动设置文件权限。应使用 /etc/permissions.local
来实现此目的,确保在对
openssh进行安全更新后,能够保留 setuid 位。
23.5.1 生成 SSH 密钥 #
要使用默认参数(RSA,2048 位)生成密钥,请输入
ssh-keygen
命令。按 Enter 接受密钥的默认储存位置
~/.ssh/id_rsa
(强烈建议),或输入其他位置。输入包含 10 到 30 个字符的通行口令。有关创建安全口令的规则在此同样适用。强烈建议不要省略指定通行口令的步骤。
应务必确保除您自己以外的任何人都不能访问私用密钥(始终将其权限设置为 0600
)。私用密钥绝对不能落入其他人手中。
要更改现有密钥对的口令,请使用 ssh-keygen -p
命令。
23.5.2 复制 SSH 密钥 #
要将 SSH 公共密钥复制到远程计算机上用户的 ~/.ssh/authorized_keys
,请使用 ssh-copy-id
命令。要复制 ~/.ssh/id_rsa.pub
下储存的您的个人密钥,可以使用简写格式。要复制 DSA 密钥或其他用户的密钥,需要指定路径:
tux >
~/.ssh/id_rsa.pub
ssh-copy-id -i tux@suntux >
~/.ssh/id_dsa.pub
ssh-copy-id -i ~/.ssh/id_dsa.pub tux@suntux >
~notme/.ssh/id_rsa.pub
ssh-copy-id -i ~notme/.ssh/id_rsa.pub tux@sun
要成功复制密钥,需要输入远程用户的口令。要去除现有密钥,请手动编辑 ~/.ssh/authorized_keys
。
23.5.3 使用 ssh-agent
#
执行大量的安全外壳操作时,为每个此类操作键入 SSH 通行口令会很麻烦。因此,SSH 软件包提供了另一个工具 ssh-agent
,用于在 X 会话或终端会话期间保留私用密钥。所有其他窗口或程序以 ssh-agent
客户端的形式启动。启动代理时,会设置一组环境变量,ssh
、scp
或 sftp
将使用这些变量来查找用于自动登录的代理。有关细节,请参见 ssh-agent
手册页。
ssh-agent
启动后,您需要使用 ssh-add
添加自己的密钥。它会提示您输入通行口令。提供一次口令后,您便可在运行中的会话内部使用安全外壳命令,而无需再次进行身份验证。
23.5.3.1 在 X 会话中使用 ssh-agent
#
在 SUSE Linux Enterprise Server 上,ssh-agent
会由 GNOME 显示管理器自动启动。要在 X 会话开始时同时调用 ssh-add
向代理添加您的密钥,请执行以下操作:
以所需用户的身份登录,并检查文件
~/.xinitrc
是否存在。如果不存在,请使用现有模板,或从
/etc/skel
复制该文件:if [ -f ~/.xinitrc.template ]; then mv ~/.xinitrc.template ~/.xinitrc; \ else cp /etc/skel/.xinitrc.template ~/.xinitrc; fi
如果您复制了该模板,请搜索以下几行并将其取消注释。如果
~/.xinitrc
已存在,请添加以下几行(不带注释符号)。# if test -S "$SSH_AUTH_SOCK" -a -x "$SSH_ASKPASS"; then # ssh-add < /dev/null # fi
启动新的 X 会话时,系统会提示您输入 SSH 通行口令。
23.5.3.2 在终端会话中使用 ssh-agent
#
在终端会话中,您需要手动启动 ssh-agent
,然后调用 ssh-add
。可通过两种方式启动代理。下面的第一个示例在现有外壳之上启动新的 Bash 外壳。第二个示例在现有外壳中启动代理,并按需修改环境。
tux >
ssh-agent -s /bin/bash
eval $(ssh-agent)
代理启动后,运行 ssh-add
以向代理提供您的密钥。
23.6 端口转发 #
ssh
还可用于重定向 TCP/IP 连接。此功能也称为 SSH 隧道
,它通过加密的通道将定向到特定端口的 TCP 连接重定向到另一台计算机。
使用以下命令可将定向到 jupiter 端口 25 (SMTP) 的所有连接重定向到 sun 上的 SMTP 端口。如果用户所用的 SMTP 服务器不具备 SMTP-AUTH 或 POP-before-SMTP 功能,此命令特别有用。从与网络相连的任意位置都可以将电子邮件传送到“家庭”邮件服务器进行递送。
root #
ssh -L 25:sun:25 jupiter
同样,使用以下命令可将 jupiter 上的所有 POP3 请求(端口 110)转发到 sun 的 POP3 端口:
root #
ssh -L 110:sun:110 jupiter
必须以 root
身份执行这两个命令,因为连接指向有特权的本地端口。普通用户通过现有 SSH 连接发送和检索电子邮件。为此,必须将 SMTP 和 POP3 主机设置为 localhost
。上述每个程序的手册页以及 /usr/share/doc/packages/openssh
下的 OpenSSH 软件包文档中提供了更多信息。
23.7 在安装的系统上添加和去除公共密钥 #
在某些环境中,通过 SSH 登录会比较方便或者有此必要。在此情况下,用户需要提供 SSH 公共密钥。要添加或去除 SSH 密钥,请执行以下操作:
打开 YaST。
在
下,打开 模块。选择您要更改的用户并按
。切换到
选项卡。添加或去除您的公共密钥。如果您添加了 SSH 公共密钥,请检查文件扩展名
.pub
。单击
进行确认。
SSH 公共密钥保存在 ~/.ssh/authorized_keys
中。
23.8 更多信息 #
- https://www.openssh.com
OpenSSH 主页
- https://en.wikibooks.org/wiki/OpenSSH
OpenSSH Wikibook
man sshd
OpenSSH 守护程序的手册页
man ssh_config
OpenSSH SSH 客户端配置文件的手册页
man scp
,man sftp
,man slogin
,man ssh
,man ssh-add
,man ssh-agent
,man ssh-copy-id
,man ssh-keyconvert
,man ssh-keygen
,man ssh-keyscan
用于安全复制文件(
scp
、sftp
)、用于登录(slogin
、ssh
)和用于管理密钥的多个二进制文件的手册页。-
/usr/share/doc/packages/openssh/README.SUSE
,/usr/share/doc/packages/openssh/README.FIPS
特定于 SUSE 软件包的文档;上游相关默认设置的更改、有关 FIPS 模式的说明,等等。