60、深入理解与配置 SSH:安全远程访问的全面指南

深入理解与配置 SSH:安全远程访问的全面指南

1. SSH 基础认知

在过去,Telnet 是 Linux 和 Unix 系统中常用的远程文本模式登录协议。然而,Telnet 严重缺乏安全特性。近年来,SSH 逐渐流行起来,成为了首选的远程登录工具。SSH 不仅能实现远程登录,还能处理类似 FTP 的文件传输任务。

Linux 系统支持多种远程登录方式,如 Telnet、VNC 和 X 等。但这些方法大多存在一个严重问题:数据以未加密的形式在网络中传输。这意味着任何能够监控网络流量的人都可以轻易获取敏感数据,包括密码(VNC 等部分协议仅对密码进行加密,其他数据仍未加密)。

SSH 的出现正是为了解决这一安全隐患。它采用强大的加密技术对网络连接的各个部分进行加密,包括密码交换和后续的数据传输,从而大大提高了远程访问的安全性。此外,SSH 还提供文件传输功能,并支持对其他网络协议进行隧道传输,让非加密协议也能借助 SSH 的加密优势。

不过,SSH 也有其缺点。加密和解密过程会消耗 CPU 时间,导致 SSH 连接速度比直接连接慢,可能会影响系统的整体性能。尤其是在对大量数据传输的协议进行隧道传输时,性能下降可能会更明显。但总体而言,安全性的提升还是值得这点速度损失的。

目前,Linux 系统中有多种 SSH 服务器可供选择,其中最受欢迎的是 OpenSSH 服务器(www.openssh.org)。它是 SSH 协议的首批开源实现之一,并且大多数 Linux 发行版都预装了该服务器。OpenSSH 可以通过 xinetd 超级守护进程或启动脚本启动,大多数发行版会在 SSH 软件包中提供合适的启动脚本。如果对 SSH 配置进行了更改,可能需要通过启动脚本传递 reload 或 restart 选项,如 /etc/init.d/sshd reload 。无论以何种方式启动,OpenSSH 服务器的二进制文件名为 sshd。

2. SSH 选项设置

通常情况下,SSH 在首次安装后就能正常工作,可能不需要对其配置进行修改。但如果确实需要修改,大部分操作可以通过主 SSH 配置文件 /etc/ssh/sshd_config 完成。此外,还可以编辑一些其他文件来限制对 SSH 服务器的访问,或改变 SSH 管理登录过程的方式。

/etc/ssh/sshd_config 文件主要由选项行组成,格式如下:

option value

需要注意的是,不要将 sshd_config 文件与 ssh_config 文件混淆。前者用于控制 OpenSSH 服务器,后者用于控制 SSH 客户端程序 ssh 。除了配置行, sshd_config 文件中还包含以井号(#)开头的注释。大多数示例配置文件中包含大量被注释掉的 SSH 选项,这些行指定了默认值,因此在不改变值的情况下删除行首的井号不会产生任何影响。

大多数选项的默认值适用于大多数系统,但以下几个选项可能需要检查并根据需要进行更改:
| 选项 | 说明 | 建议设置 |
| ---- | ---- | ---- |
| Protocol | 指定 OpenSSH 支持的协议级别,可选值为 1 和 2,也可以用逗号分隔同时支持两个协议 | 由于 OpenSSH 协议级别 1 已不再安全,建议设置为 2,但这会限制服务器与旧客户端的通信能力 |
| PermitRootLogin | 默认值为 yes,允许 root 用户直接登录 | 为增强安全性,建议设置为 no,这样想要使用超级用户权限进行远程工作的用户需要先以普通用户身份登录 |
| X11Forwarding | 指定是否启用 OpenSSH 的 X 隧道功能 | 如果希望远程用户通过 SSH 运行 GUI 程序,需要将此选项设置为 yes,但这可能会略微降低客户端 X 显示的安全性,因此默认值为 no |

如需了解更多选项信息,可查阅 sshd_config 的手册页。修改 SSH 配置后,记得使用服务器的启动脚本重启 SSH。

3. SSH 密钥管理

SSH 的安全性部分依赖于加密密钥。每个服务器系统和每个用户都有一个唯一的密钥用于身份识别。实际上,SSH 使用的安全系统涉及两个密钥:公钥和私钥。这两个密钥在数学上相互关联,使用特定公钥加密的数据只能用匹配的私钥解密。

在建立 SSH 连接时,双方会交换公钥。之后,双方使用对方的公钥对数据进行加密,确保只有预期的接收方能够解密数据。此外,SSH 客户端通常会保存与之通信过的服务器的公钥,以便检测公钥的变化。公钥的变化可能是被篡改的迹象,如果客户端检测到这种变化,会向用户发出警告。

大多数 OpenSSH 服务器启动脚本会检查是否存在存储的公钥和私钥,如果不存在则会生成它们。总共需要四到六个密钥,分别是 SSH 支持的两到三种加密工具的公钥和私钥。这些密钥通常存储在 /etc/ssh 目录下,私钥文件名为 ssh_host_rsa_key ssh_host_dsa_key (取决于使用的加密算法),公钥文件名相同,但会添加 .pub 扩展名。有些系统还会添加 ssh_host_rsa1_key 及其关联的公钥。

如果系统中没有这些密钥,且 SSH 服务器无法启动,可以尝试使用以下 ssh-keygen 命令生成密钥:

# ssh-keygen -q -t rsa1 -f /etc/ssh/ssh_host_key -C '' -N ''
# ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C '' -N ''
# ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C '' -N ''

每个命令都会生成一个私钥(由 -f 参数指定名称)和一个公钥(名称相同但添加 .pub 扩展名)。需要注意的是,如果 SSH 密钥文件已经存在,不要运行这些命令,否则会导致已连接到 SSH 服务器的客户端抱怨密钥更改,并可能拒绝建立连接。

私钥需要妥善保护,如果入侵者获取了私钥,就可以冒充系统。通常,私钥文件的权限应为 0600(-rw-------),并由 root 用户拥有。而公钥文件(带有 .pub 扩展名)应该对所有用户可读。

在配置客户端系统时,可以考虑创建一个全局的主机密钥缓存。 ssh 程序会为每个用户记录主机密钥(存储在 ~/.ssh/known_hosts 文件中),在设置客户端时,可以将这些密钥复制到全局的 ssh_known_hosts 文件(通常存储在 /etc /etc/ssh 目录下)。这样可以确保公钥列表与填充全局文件的源一样准确,还可以消除用户首次连接到包含在全局文件中的主机时的确认消息。

创建全局 ssh_known_hosts 文件的一种简单方法是从已连接到目标服务器的用户账户中复制该文件,示例如下:

$ sudo cp /home/Rich/.ssh/known_hosts  /etc/ssh/ssh_known_hosts
[sudo] password for Christine:
$

过去,可以在文本编辑器中查看 SSH 的 known_hosts 文件,因为它是文本模式文件。但现在 OpenSSH v4.0 及更高版本支持对该文件的数据进行哈希处理。启用此功能后,信息会被哈希并存储。这样做的好处是,即使攻击者窃取了 known_hosts 文件,也无法确定你所连接的计算机的身份。但缺点是,你自己也无法直接知道该文件描述的是哪些服务器。

4. 控制 SSH 访问

可以通过多种方式限制对 SSH 服务器的访问:
- 密码认证 :这是最基本的方法,与 Telnet 类似,使用用户名和密码进行认证。 ssh 客户端程序会自动发送用户名或作为命令行的一部分发送,因此在使用 ssh 登录时不会看到用户名提示,示例如下:

$ ssh Christine@192.168.56.101
Christine@192.168.56.101's password:
Last login: Wed Nov 12 10:20:36 2015
$

ssh 命令的语法要求用户名放在 @ 符号之前, @ 符号之后是远程主机的 IP 地址或名称。建立连接后,需要输入用户名的密码才能访问远程系统。
- TCP Wrappers :如果通过超级服务器运行 SSH 或服务器编译时支持 TCP Wrappers,可以使用 /etc/hosts.allow /etc/hosts.deny 文件按 IP 地址限制访问。需要注意的是,如果通过系统启动脚本启动 SSH,只有服务器编译时支持该功能,此方法才有效,而且并非所有发行版的标准 SSH 软件包都支持。
- 防火墙 :与所有服务器一样,可以使用防火墙限制对 SSH 服务器的访问。SSH 使用 TCP 端口 22,虽然这不是 SSH 的特性,但对保护 SSH 服务器很有用。
- /etc/nologin 文件 :如果该文件存在,SSH 会遵守其规则。该文件的存在意味着只有 root 用户可以登录,当非 root 用户尝试本地登录时,文件内容会作为错误消息显示,但 OpenSSH 不会这样做。

5. 通过 SSH 复制文件

除了远程登录,SSH 还提供了一个文件复制命令 scp ,其工作方式与本地复制文件的 cp 命令类似。但在使用 scp 时,必须在目标文件名之前指定目标计算机,还可以选择指定用户名。例如,要将 masterpiece.c 文件复制到 leonardo.example.com 上的 lisa 账户,可以使用以下命令:

$ scp masterpiece.c lisa@leonardo.example.com:
$

命令末尾的冒号(:)非常重要,如果省略, scp 会像 cp 命令一样工作,最终会在原系统上创建一个名为 lisa@leonardo.example.com 的文件。

如果要重命名文件,可以在冒号后面指定新名称。同样,也可以用这种方式将文件放置在特定目录中,示例如下:

$ scp masterpiece.c lisa@leonardo.example.com:~/art/mona.c
$

此示例将 masterpiece.c 文件复制到目标计算机的 ~/art 目录,并将其重命名为 mona.c 。如果指定的目录不存在,会出现错误,文件不会被传输。如果指定的目录没有尾随斜杠或文件名,并且目录名拼写错误, scp 会复制文件并将其重命名为拼写错误的目录名(在这方面, scp cp 命令的行为相同)。

6. 配置无密码登录

如果经常使用 SSH 或在自动化工具中使用 SSH,每次连接都需要输入密码会很麻烦。可以通过配置 SSH 客户端的密钥,并将客户端的公钥提供给服务器计算机来实现无密码登录。这样,SSH 客户端计算机可以自动识别自己,可能无需输入密码。

需要注意的是,配置无密码登录虽然方便,但会增加安全风险。如果不信任的人获得了 SSH 客户端系统上你的账户访问权限,他们可以在无需密码的情况下以你的身份登录到 SSH 服务器系统。因此,只有在客户端得到很好保护的情况下才建议创建无密码登录,尤其是配置对 root 账户的无密码访问时要格外谨慎。

配置 SSH 无密码登录的步骤如下:
1. 以要进行远程访问的用户身份登录到 SSH 客户端系统。
2. 输入以下命令生成版本 2 的 SSH 密钥:

$ ssh-keygen -q -t rsa -f ~/.ssh/id_rsa -C '' -N ''
$

也可以通过输入 ssh-keygen -q -t dsa -f ~/.ssh/id_dsa -C '' -N '' 生成版本 1 的密钥,该命令会生成 id_dsa id_dsa.pub 文件。但由于 SSH 版本 1 不如版本 2 安全,不建议使用此方法,不过这些密钥文件在某些认证目标中会被提及。
3. 步骤 2 会生成两个文件: id_rsa id_rsa.pub 。将 id_rsa.pub 文件以任何方便的方式传输到 SSH 服务器计算机,如使用 USB 闪存驱动器、 scp 命令等。将文件复制为临时名称,如 temp.rsa
4. 登录到 SSH 服务器系统,如果使用 SSH 登录,需要输入密码。
5. 将刚刚传输的文件内容添加到 ~/.ssh/authorized_keys 文件的末尾(该文件有时也称为 ~/.ssh/authorized_keys2 ,需要检查哪个文件存在,如果都不存在,可能需要进行实验)。如果将原始文件存储为 ~temp.rsa ,可以使用以下命令完成此操作:

$ cat ~/temp.rsa >> ~/.ssh/authorized_keys
  1. 在某些系统上,可能需要修改 ~/.ssh/authorized_keys 文件及其所在目录的权限。 authorized_keys 文件可能需要 0600 权限,并且需要删除除账户所有者之外的其他用户对主目录和 ~/.ssh 目录的写入权限。

完成以上步骤后,从客户端再次通过 SSH 登录到服务器时,应该不会再提示输入密码,两台计算机将自动处理认证过程。如果无法实现无密码登录,可能是 ~/.ssh/authorized_keys 文件需要其他名称,也可以检查该文件是否包含与客户端上原始公钥文件内容匹配的行。对于一些旧客户端,可能需要通过添加 -2 选项指定使用 SSH 协议版本 2:

$ ssh -2 server
7. 使用 ssh-agent

另一种 SSH 认证选项是使用 ssh-agent 程序。该程序在建立连接时需要输入密码,因此比配置无密码登录更安全。同时, ssh-agent 会记住密码,在本地会话中只需输入一次密码。使用 ssh-agent 的步骤如下:
1. 按照“配置无密码登录”中的步骤操作,但有一个更改:在步骤 2 的 ssh-keygen 命令中省略 -N '' 选项。此时会要求输入一个密码短语,该密码短语将成为通过 ssh-agent 管理的所有 SSH 登录的密钥。
2. 在 SSH 客户端系统上,输入 ssh-agent /bin/bash 命令。这将启动 ssh-agent ,并启动一个 bash 会话,后续的 SSH 登录将使用此 bash 会话。
3. 在新的 shell 中,输入 ssh-add ~/.ssh/id_rsa 命令,将 RSA 密钥添加到 ssh-agent 管理的密钥集中。此时会要求输入 SSH 密码短语。

从这一步开始,每当使用 SSH 连接到已提供公钥的远程系统时,无需再输入密码。但每次注销后,需要重复步骤 2 和 3,并且只有步骤 2 中启动的 shell 或从该 shell 启动的其他 shell 才能享受此便利。

如果经常使用此功能,可以将 ssh-agent 插入到正常的登录过程中。例如,可以编辑 /etc/passwd 文件,将 ssh-agent /bin/bash 设置为登录 shell。对于 GUI 登录,可以重命名正常的 GUI 登录脚本(如将 ~/.xsession 重命名为 ~/.xsession-nossh ),并创建一个新的 GUI 登录脚本,以重命名后的脚本作为参数调用 ssh-agent 。这样可以将 ssh-agent 插入到用户进程树的根节点,使任何 SSH 调用都使用 ssh-agent

8. 使用 SSH 登录脚本

通常情况下,SSH 文本模式登录会话会运行用户配置的 shell,并执行该 shell 定义的登录脚本。OpenSSH 服务器还支持自己的登录脚本 sshrc (通常存储在 /etc /etc/ssh 目录下)。OpenSSH 服务器使用 /bin/sh 运行此脚本,而 /bin/sh 通常是 bash 的符号链接,因此可以将其视为普通的 bash 脚本。

9. 设置 SSH 端口隧道

SSH 能够将其加密功能扩展到其他协议,但这需要额外的配置,这种配置方式称为隧道传输。SSH 隧道的基本原理是:服务器计算机运行两个服务器程序,一个是被隧道传输的协议的服务器(如 Internet 邮件访问协议 IMAP),另一个是 SSH 服务器;客户端计算机也运行两个客户端程序,一个是被隧道传输的协议的客户端,另一个是 SSH 客户端。SSH 客户端还会监听被隧道传输的协议的连接,实际上它既是客户端又是服务器。当 SSH 客户端接收到被隧道传输的协议的客户端的连接时,该协议的连接将使用 SSH 进行加密,通过隧道传输到 SSH 服务器,然后再定向到目标服务器。这样,即使目标协议本身不支持加密,数据也能以加密形式在网络中传输。

要设置 SSH 端口隧道,需要进行以下配置:
- 服务器端配置 :默认情况下,服务器的配置允许隧道传输,但为确保无误,需要检查服务器上的 /etc/ssh/sshd_config 文件中是否存在以下选项:

AllowTcpForwarding no

如果存在该行,将 no 改为 yes 。如果该行不存在或已经设置为 yes ,则无需更改 SSH 服务器配置。
- 客户端配置 :需要使用普通的 ssh 客户端程序建立与服务器计算机的特殊 SSH 连接,并传递几个参数。示例如下:

$ sudo ssh -N -f -L 142:mail.luna.edu:143 benf@mail.luna.edu
$

其中, -N -f 选项分别告诉 ssh 不执行远程命令,并在询问密码后在后台执行,这两个选项是创建隧道所必需的。 -L 选项指定要监听的本地端口、要连接的远程计算机以及远程计算机上要连接的端口。此示例中,本地端口 142 监听连接,并连接到 mail.luna.edu 的端口 143。最后一个参数(此示例中为 benf@mail.luna.edu )是隧道连接的远程用户名和计算机,需要注意的是,该计算机不一定与 -L 选项指定的目标系统相同。

通过以上对 SSH 的全面介绍和详细配置步骤,你可以更好地利用 SSH 的安全特性,实现安全、便捷的远程访问和文件传输。在实际使用中,根据具体需求和安全要求进行合理配置,以充分发挥 SSH 的优势。

深入理解与配置 SSH:安全远程访问的全面指南

10. SSH 配置总结与最佳实践

为了更好地使用 SSH 并确保系统安全,下面总结了一些 SSH 配置的最佳实践:
- 协议选择 :优先使用 SSH 协议版本 2,因为版本 1 存在安全风险。在 /etc/ssh/sshd_config 文件中设置 Protocol 2
- 限制 Root 登录 :将 PermitRootLogin 设置为 no ,避免直接以 root 用户进行远程登录,提高系统安全性。
- 密钥管理 :妥善保护私钥,设置合适的权限(0600),并由 root 用户拥有。定期更新密钥,防止密钥泄露。
- 访问控制 :结合密码认证、TCP Wrappers 和防火墙等多种方式限制对 SSH 服务器的访问,只允许信任的 IP 地址和用户进行连接。
- 无密码登录 :仅在客户端得到良好保护的情况下配置无密码登录,避免安全风险。
- 性能考虑 :虽然 SSH 的加密会消耗一定的 CPU 资源,但安全性更为重要。在对大量数据传输的协议进行隧道传输时,要注意性能下降的问题。

11. SSH 常见问题及解决方法

在使用 SSH 过程中,可能会遇到一些常见问题,以下是一些问题及解决方法:
| 问题 | 现象 | 解决方法 |
| ---- | ---- | ---- |
| 无法连接到 SSH 服务器 | 输入 ssh 命令后无响应或提示连接失败 | 检查服务器是否正在运行( ps -ef | grep sshd ),防火墙是否允许 SSH 连接(TCP 端口 22),以及 SSH 配置文件是否正确 |
| 密码认证失败 | 输入正确的用户名和密码后仍无法登录 | 检查密码是否正确,是否存在大小写问题。还可以检查 /etc/ssh/sshd_config 文件中 PasswordAuthentication 选项是否设置为 yes |
| 密钥认证失败 | 配置了无密码登录但仍然需要输入密码 | 检查客户端公钥是否正确添加到服务器的 ~/.ssh/authorized_keys 文件中,文件权限是否正确(0600) |
| SSH 连接缓慢 | 连接建立时间长,数据传输速度慢 | 检查网络状况,是否存在网络拥塞。也可以尝试调整 SSH 配置文件中的一些参数,如 Compression 选项设置为 yes 以启用数据压缩 |

12. SSH 在不同场景下的应用

SSH 在各种场景下都有广泛的应用,以下是一些常见的应用场景:
- 远程系统管理 :系统管理员可以通过 SSH 远程登录到服务器,进行系统配置、软件安装、故障排除等操作,无需亲临服务器现场。
- 文件传输 :使用 scp sftp 命令可以方便地在本地和远程系统之间传输文件,确保文件传输的安全性。
- 安全隧道 :通过 SSH 隧道可以将非加密的协议(如 HTTP、SMTP 等)封装在 SSH 加密通道中传输,保护数据的隐私和完整性。
- 自动化脚本执行 :在自动化工具中使用 SSH 可以实现远程服务器的自动化部署、监控和维护,提高工作效率。

13. SSH 与其他安全技术的结合

为了进一步提高系统的安全性,可以将 SSH 与其他安全技术结合使用:
- 与防火墙结合 :使用防火墙限制 SSH 服务器的访问,只允许特定的 IP 地址和端口进行连接。例如,在 Linux 系统中可以使用 iptables firewalld 配置防火墙规则。

# 使用 iptables 允许特定 IP 地址访问 SSH 端口 22
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
  • 与入侵检测系统(IDS)结合 :IDS 可以实时监测 SSH 连接的异常行为,如暴力破解密码、异常的登录尝试等,并及时发出警报。
  • 与多因素认证(MFA)结合 :除了使用密码或密钥认证外,还可以结合使用短信验证码、指纹识别等多因素认证方式,进一步提高 SSH 登录的安全性。
14. SSH 未来发展趋势

随着网络安全形势的不断变化和技术的不断发展,SSH 也在不断演进和完善。以下是一些 SSH 未来可能的发展趋势:
- 更强的加密算法 :为了应对日益增长的安全威胁,SSH 可能会采用更强的加密算法,提高数据的安全性。
- 集成更多安全功能 :未来的 SSH 可能会集成更多的安全功能,如实时入侵检测、行为分析等,为用户提供更全面的安全保护。
- 更好的用户体验 :在保证安全的前提下,SSH 可能会更加注重用户体验,提供更简洁、易用的配置界面和命令行工具。
- 与云计算和容器技术的融合 :随着云计算和容器技术的广泛应用,SSH 可能会与这些技术更好地融合,为云环境和容器化应用提供更安全、便捷的远程访问方式。

15. 总结

SSH 作为一种安全的远程访问工具,在 Linux 和 Unix 系统中得到了广泛的应用。通过深入理解 SSH 的基本原理、配置方法和安全特性,并结合最佳实践和其他安全技术,可以实现安全、便捷的远程访问和文件传输。同时,关注 SSH 的未来发展趋势,不断学习和掌握新的技术和方法,将有助于提高我们的网络安全防护能力。

在实际使用中,要根据具体的需求和安全要求进行合理的配置和管理,定期对 SSH 服务器进行安全审计和更新,以确保系统的安全性和稳定性。希望本文能够帮助你更好地理解和使用 SSH,为你的工作和学习带来便利。

graph LR
    A[SSH 应用场景] --> B(远程系统管理)
    A --> C(文件传输)
    A --> D(安全隧道)
    A --> E(自动化脚本执行)
    B --> F(系统配置)
    B --> G(软件安装)
    B --> H(故障排除)
    C --> I(scp 命令)
    C --> J(sftp 命令)
    D --> K(封装非加密协议)
    E --> L(远程部署)
    E --> M(监控维护)

通过以上内容,我们对 SSH 的各个方面进行了全面的介绍,包括基础认知、配置方法、安全管理、常见问题解决以及未来发展趋势等。希望这些信息能够帮助你更好地掌握 SSH 技术,为你的工作和学习提供有力的支持。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值