介绍
在这个实验中,你将获得配置和安全 SSH 连接的实践经验,这是管理远程 Linux 系统的基本技能。你将首先学习如何使用 SSH 访问远程系统,理解客户端 - 服务器架构和基本连接命令。这包括验证 SSH 客户端安装、连接到远程主机、处理主机身份验证提示以及登录和注销远程系统。
在此基础上,你将深入学习更高级的主题,例如生成和使用 SSH 密钥对进行无密码身份验证,使用 ssh-agent 有效地管理这些密钥,以及解决常见的 SSH 连接问题。最后,你将学习如何自定义 SSH 客户端配置以提高效率,并通过禁用 root 登录和密码身份验证来增强你的 OpenSSH 服务器安全性,确保安全可靠的远程访问。
使用 SSH 访问远程系统
在本步骤中,你将学习如何使用 SSH (Secure Shell) 访问远程系统。SSH 是一种加密网络协议,用于在不安全的网络上安全地操作网络服务。它通过客户端 - 服务器架构在不安全的网络上提供安全通道,连接 SSH 客户端和 SSH 服务器。
注意: 在本实验环境中,出于安全目的,可能已配置了一些安全功能,例如 root 登录限制。这是正常的,并展示了最佳实践。
首先,你将使用 SSH 连接到本地系统。这演示了即使连接到同一台机器时,SSH 客户端 - 服务器架构。你将使用 ssh 命令连接到 localhost。
ssh 的基本语法是:
ssh [用户名]@[主机名或 IP 地址]
如果你没有指定用户名,SSH 将尝试使用你当前的本地用户名登录。在本例中,你的本地用户名是 labex。
让我们尝试使用你的当前用户名连接到 localhost:
ssh localhost
首次连接时,SSH 将要求你确认主机的真实性。这是为了防止中间人攻击的安全措施。输入 yes 并按下 Enter。
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ED25519 密钥指纹是 SHA256:h5k1mmPFylpxUCsKx+Mf8rN4wOrk9TmyRfzTvGWRm7A.
此密钥没有其他名称
你确定要继续连接吗 (yes/no/[指纹])? yes
警告: 永久添加到已知主机列表 'localhost' (ED25519)。
labex@localhost 的密码:
系统将提示你输入 labex 用户的密码。输入 labex 并按下 Enter。
labex@localhost 的密码:
上次登录: 2025 年 6 月 9 日 上午 1:34:39 来自 47.251.66.143
[labex@host ~]$
你现在已通过 SSH 登录到 localhost。请注意,你的提示可能显示为 [labex@localhost ~]$,这表示你已通过 SSH 连接。
要注销 SSH 会话,请使用 exit 命令:
exit
注销
连接到 localhost 已关闭。
[labex@host ~]$
现在,让我们尝试以 root 用户身份连接到 localhost。请注意,在本环境中,出于安全原因,root 登录可能默认被禁用。
ssh root@localhost
系统将提示你输入 root 密码。但是,如果 root 登录被禁用,你可能会遇到“拒绝访问”消息:
root@localhost 的密码:
拒绝访问,请重试。
root@localhost 的密码:
拒绝访问,请重试。
root@localhost 的密码:
如果 root 登录被禁用,这是预期的行为,并展示了安全最佳实践。你可以按 Ctrl+C 取消连接尝试。
SSH 还可以用于在远程系统上执行单个命令,而无需打开交互式 shell。这对于快速检查或自动化非常有用。
让我们以 labex 用户身份在 localhost 上运行 hostname 命令:
ssh labex@localhost hostname
系统将提示你输入 labex 用户的密码。输入 labex 并按下 Enter。
labex@localhost 的密码:
6846375f1c0e35fea6cb03e6
[labex@host ~]$
hostname 命令已通过 SSH 执行,其输出显示在你的本地终端上。你没有进入交互式 shell。
最后,让我们探索 SSH 如何管理已知主机。当你连接到新的 SSH 服务器时,其公钥指纹将添加到你的 ~/.ssh/known_hosts 文件中。此文件有助于你的 SSH 客户端在未来的连接中验证服务器的身份。
你可以查看你的 ~/.ssh/known_hosts 文件的内容:
cat ~/.ssh/known_hosts
localhost ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHvl7dcZkvMNOr3cjKjlR2/JgFbGpURThT/bHnLZN6gG
localhost ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCynhy3601o9ZSGZoY0KB/QSonk5ykod2Tb7sCAqVn4ZgTCwd96BhPjJLPNQ6ldNASo1e7EzfT4BUjG5T0ZDRhgaI65qmDwITWipTWUfmYT5XoScyf6NDhcRxYiJwztFEkOvLcPhelS6UXj5Z7HdmYH4Nc5wiF00Wah3Jc0/2CfQsFZCXTn/7Kp8KKbBbPqPzr2R3WIULEacOxx9HKVv+2TvYg/OHZz40hTsr1c68DD7h5PMBNe21YB3HLRRk2LQEC7v7BFD+DCek9GNR66JBjbLDljtwWCaPCY0UntBjjvJ3W2LhX5RDZQHV/iaUSj2tEXnvPt9KSqGfBS91D12dBXyOmWVnTpvvI17BdDkEeefas2Uz4d7Bv/PDxZR6IKkaIGQ/ZnRhSEhBNvfqlBGqkOhRr6jQJK+rQMnsZCT6OEgW7osWzkw5Bs1wY/RNToeQqrRMclqffO9plFI688N2iT86+nxrvBVZg4yMMm2J1lleaBvinXCB8jE6lrtwoAdgk=
localhost ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKYWY8Ty6TrbQS/0fUljBWuUpkyPCS/5P6ZwxhSYsqjRBIprMANI/JQotZqHYq2w3b2X/n8O+J3/WuIB6XMl1f4=
这些条目确认你的客户端已记录了 localhost 的多个公钥 (ED25519、RSA 和 ECDSA)。SSH 服务器可能支持多种密钥类型以确保兼容性。如果这些服务器密钥中的任何一个意外更改,SSH 将会警告你,这是一个至关重要的安全功能。
生成和使用 SSH 密钥对进行无密码身份验证
在本步骤中,你将学习如何生成 SSH 密钥对并将其用于无密码身份验证。基于 SSH 密钥的身份验证是比密码身份验证更安全和更便捷的替代方案。你无需每次连接时都输入密码,只需使用一对加密密钥:私钥(保存在你的本地机器上)和公钥(放置在远程服务器上)。
首先,你需要生成一个 SSH 密钥对。你将使用 ssh-keygen 命令为此目的。默认情况下,ssh-keygen 会生成一个 RSA 密钥对,并将私钥保存到 ~/.ssh/id_rsa,并将公钥保存到 ~/.ssh/id_rsa.pub。
执行 ssh-keygen 命令:
ssh-keygen
系统将提示你输入一些选项:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/labex/.ssh/id_rsa):
按 Enter 键接受默认文件路径 (/home/labex/.ssh/id_rsa)。
Enter passphrase (empty for no passphrase):
在本实验中,按两次 Enter 键将密码留空。虽然在实际场景中建议使用密码(添加额外的安全层),但为了简单起见,并直接演示无密码身份验证,我们在此跳过此步骤。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/labex/.ssh/id_rsa
Your public key has been saved in /home/labex/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:QoV7pNBFu1kafGP3VJhpZuIdr1zc+qamJ1C2YAadgNY labex@6846375f1c0e35fea6cb03e6
The key's randomart image is:
+---[RSA 3072]----+
| . *=o . +.|
| . =oE.o . O. |
| o.++.=..*.+.|
| .o .O+o+o. =|
| ..So + o.+ |
| . . . + |
| . . |
| . o o|
| .=.o |
+----[SHA256]-----+
现在,验证密钥文件是否已创建在 ~/.ssh/ 目录中:
ls -l ~/.ssh/
total 16
-rw------- 1 labex labex 2622 Jun 9 01:37 id_rsa
-rw-r--r-- 1 labex labex 584 Jun 9 01:37 id_rsa.pub
-rw------- 1 labex labex 825 Jun 9 01:35 known_hosts
-rw-r--r-- 1 labex labex 91 Jun 9 01:35 known_hosts.old
你应该看到 id_rsa(你的私钥)和 id_rsa.pub(你的公钥)。请注意权限:id_rsa 具有 rw-------(仅限所有者读取/写入),这对于安全性至关重要。你可能还会看到 known_hosts.old,它是以前 known_hosts 文件的备份。
接下来,你需要复制你的公钥以启用无密码身份验证。ssh-copy-id 命令为此目的而设计。它将你的公钥追加到 ~/.ssh/authorized_keys 文件中,允许你无需密码即可登录。
执行 ssh-copy-id 命令,指定用户名和主机名:
ssh-copy-id labex@localhost
系统将提示你输入 labex 用户的密码。输入 labex 并按下 Enter。
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/labex/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
labex@localhost's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'labex@localhost'"
and check to make sure that only the key(s) you wanted were added.
命令输出确认添加了一个密钥。现在,尝试以 labex 用户身份登录到 localhost,无需提供密码:
ssh labex@localhost
如果一切配置正确,你应该能够通过 SSH 登录,而无需输入密码。
Last login: Mon Jun 9 01:37:39 2025 from 47.251.66.143
[labex@host ~]$
你已成功使用密钥对配置了无密码 SSH 身份验证!
要退出远程会话,请键入 exit:
exit
exit
Connection to localhost closed.
[labex@host ~]$
使用 ssh-agent 管理 SSH 密钥
在本实验步骤中,你将学习如何使用 ssh-agent 管理你的 SSH 密钥。ssh-agent 是一款在后台运行的程序,它将你的私钥保存在内存中。当你的私钥受密码保护时,这尤其有用。你无需每次使用密钥时都输入密码,只需在将密钥添加到 ssh-agent 时输入一次密码,然后代理程序会在你的会话期间为你处理身份验证。
虽然你在之前的步骤中生成了一个没有密码的密钥,但现在我们将创建一个带密码的新密钥,以演示 ssh-agent 的实用性。
首先,生成一个带密码的新 SSH 密钥对。我们将这个密钥命名为 id_rsa_passphrase,以便将其与默认的 id_rsa 密钥区分开来。
ssh-keygen -f ~/.ssh/id_rsa_passphrase
系统将提示你输入密码。在本实验中,使用 mypassphrase 作为密码。
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): mypassphrase
Enter same passphrase again: mypassphrase
Your identification has been saved in /home/labex/.ssh/id_rsa_passphrase
Your public key has been saved in /home/labex/.ssh/id_rsa_passphrase.pub
The key fingerprint is:
SHA256:BuSxVlJb1lsiUFi2I5DAvyL01fJ5d480LT86dgtcHEg labex@6846375f1c0e35fea6cb03e6
The key's randomart image is:
+---[RSA 3072]----+
| ...=o+=*. E |
| .o.*.=..+ o |
| .=.o o. = . |
| . .+... .. . .|
| . . . +S. + |
| . o ..o . o * .|
| . . . . = * |
| oooo|
| ..+.o|
+----[SHA256]-----+
注意: 如果不小心在输入密码时按下了 Enter 键,则密钥将不会被设置密码。在这种情况下,你可以删除文件并再次运行命令,确保在提示时输入 mypassphrase。
现在,让我们将这个新公钥复制到 localhost,以便你能够使用它进行身份验证。
ssh-copy-id -i ~/.ssh/id_rsa_passphrase.pub labex@localhost
由于你已经使用默认密钥设置了无密码身份验证,因此命令可能不会提示输入密码,并将使用你现有的身份验证:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/labex/.ssh/id_rsa_passphrase.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'labex@localhost'"
and check to make sure that only the key(s) you wanted were added.
现在,尝试使用此新密钥连接到 localhost。你需要使用 -i 选项指定私钥文件。
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
如果你为密钥设置了密码,系统将提示你输入密码。但是,如果你不小心创建了没有密码的密钥(如示例输出所示),你将直接登录:
Last login: Mon Jun 9 01:39:25 2025 from 47.251.66.143
[labex@host ~]$
你已登录。现在,退出会话:
exit
exit
Connection to localhost closed.
[labex@host ~]$
注意: 即使你的密钥没有密码,你仍然可以使用 ssh-agent 演示来理解它的工作原理,即使在这种情况下它不会提示输入密码。
首先,在当前 shell 会话中启动 ssh-agent。eval 命令用于正确设置 ssh-agent 输出的环境变量。
eval "$(ssh-agent)"
Agent pid 1024
输出将显示 ssh-agent 的进程 ID (PID)。
接下来,将你的私钥 (id_rsa_passphrase) 添加到 ssh-agent。
ssh-add ~/.ssh/id_rsa_passphrase
如果你的密钥有密码,系统将提示你输入密码。如果没有,密钥将被直接添加:
Identity added: /home/labex/.ssh/id_rsa_passphrase (labex@6846375f1c0e35fea6cb03e6)
现在密钥已添加到 ssh-agent,再次尝试使用相同的密钥连接到 localhost。
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
你应该能够连接,而无需提示输入密码(无论你的密钥是否有密码,因为它现在由代理程序管理):
Last login: Mon Jun 9 01:39:49 2025 from 127.0.0.1
[labex@host ~]$
你已成功使用 ssh-agent 管理你的 SSH 密钥。
重要提示: ssh-agent 环境变量仅在启动它的 shell 会话中可用。如果在 SSH 会话中,你需要退出到本地 shell 才能使用 ssh-add 命令。
首先退出 SSH 会话:
exit
exit
Connection to localhost closed.
[labex@host ~]$
现在,要查看当前加载到你的 ssh-agent 中的密钥,可以使用 ssh-add -l:
ssh-add -l
如果代理程序正在运行并且已加载密钥,你将看到类似的输出:
3072 SHA256:BuSxVlJb1lsiUFi2I5DAvyL01fJ5d480LT86dgtcHEg /home/labex/.ssh/id_rsa_passphrase (RSA)
但是,如果你看到类似“无法连接到你的身份验证代理”的错误消息,则表示当前会话中未设置代理环境变量。
要从 ssh-agent 中删除所有身份,请使用 ssh-add -D:
ssh-add -D
如果代理程序可访问,你将看到:
All identities removed.
但是,如果你看到“无法连接到你的身份验证代理”的错误消息,则表示当前会话中没有代理环境。
现在,如果你再次尝试连接,并且你的密钥有密码,系统将提示你输入密码,因为密钥已从代理程序中删除:
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
如果你的密钥有密码,你将看到:
Enter passphrase for key '/home/labex/.ssh/id_rsa_passphrase':
如果你的密钥没有密码,你仍然可以进行直接连接。如果提示输入密码,请按 Ctrl+C 取消连接尝试。
最后,要停止 ssh-agent 进程,可以使用 ssh-agent -k:
ssh-agent -k
如果未设置 SSH_AGENT_PID 环境变量,你可能会看到:
SSH_AGENT_PID not set, cannot kill agent
如果代理程序是在不同的 shell 会话中启动的,或者环境变量未正确导出,则这是正常的。
解决 SSH 连接问题
在本实验步骤中,你将学习如何排查常见的 SSH 连接问题。当 SSH 连接失败时,很难准确地找出问题所在。ssh 命令提供详细的输出选项,可以通过显示有关连接过程的详细信息来帮助诊断问题。
ssh 命令提供三个详细级别:-v、-vv 和 -vvv。每个额外的 v 会增加显示的调试信息量。
让我们从尝试连接 localhost 上不存在的端口开始,以演示连接失败并查看调试输出。
首先,尝试使用 -v (详细) 连接到端口 2222(该端口应该未运行):
ssh -v -p 2222 labex@localhost
你将看到类似于此的输出,指示连接被拒绝:
OpenSSH_8.7p1, OpenSSL 3.0.1 14 Dec 2021
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/01-training.conf
debug1: /etc/ssh/ssh_config.d/01-training.conf line 1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config.d/50-redhat.conf
debug1: /etc/ssh/ssh_config.d/50-redhat.conf line 3: Applying options for *
debug1: Connecting to localhost [127.0.0.1] port 2222.
ssh: connect to host localhost port 2222: Connection refused
现在,让我们尝试使用 -vv (更详细):
ssh -vv -p 2222 labex@localhost
输出将更详细,提供更多调试信息:
OpenSSH_8.7p1, OpenSSL 3.0.1 14 Dec 2021
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/01-training.conf
debug1: /etc/ssh/ssh_config.d/01-training.conf line 1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config.d/50-redhat.conf
debug1: /etc/ssh/ssh_config.d/50-redhat.conf line 3: Applying options for *
debug2: resolving "localhost" port 2222
debug2: ssh_connect_direct: entering
debug1: Connecting to localhost [127.0.0.1] port 2222.
debug1: connect to address 127.0.0.1 port 2222: Connection refused
ssh: connect to host localhost port 2222: Connection refused
最后,尝试使用 -vvv (最详细):
ssh -vvv -p 2222 labex@localhost
此级别提供最大量的调试信息,对于复杂的问题可能过于冗长,但对于复杂问题非常有用。
OpenSSH_8.7p1, OpenSSL 3.0.1 14 Dec 2021
debug3: ssh_connect_internal: entering
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/01-training.conf
debug1: /etc/ssh/ssh_config.d/01-training.conf line 1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config.d/50-redhat.conf
debug1: /etc/ssh/ssh_config.d/50-redhat.conf line 3: Applying options for *
debug2: resolving "localhost" port 2222
debug2: ssh_connect_direct: entering
debug1: Connecting to localhost [127.0.0.1] port 2222.
debug1: connect to address 127.0.0.1 port 2222: Connection refused
ssh: connect to host localhost port 2222: Connection refused
在这种情况下,错误“连接被拒绝”清楚地表明端口 2222 上没有运行 SSH 服务器。
现在,让我们模拟一个常见问题:主机密钥已更改。在第一步中,你连接到 localhost,并且其公钥已添加到你的 ~/.ssh/known_hosts 文件中。如果 SSH 服务器密钥发生更改(例如,由于服务器重建或恶意攻击),你的 SSH 客户端将检测到此不匹配并拒绝连接。
为了模拟这种情况,我们将故意修改 localhost 的 known_hosts 条目使其无效。
首先,使用 nano 打开 ~/.ssh/known_hosts 文件:
nano ~/.ssh/known_hosts
你将看到包含不同密钥类型的多行:
...
选择其中一行进行修改。在本例中,让我们修改 ED25519 密钥(第一行)。修改长密钥字符串中的几个字符(例如,将最后一个字符从 G 更改为 A)。请注意不要删除整行或文件中的其他部分。
例如,更改:
...ZN6gG
为:
...ZN6gA
通过按 Ctrl+X,然后按 Y 确认保存,并按 Enter 确认文件名来保存文件。
现在,再次尝试连接到 localhost:
ssh labex@localhost
你将收到有关主机密钥已更改的警告:
...
这是一个关键的安全警告。如果你在实际场景中遇到这种情况,你应该调查主机密钥更改的原因。如果这是合法的更改(例如,服务器重新安装),你需要从 known_hosts 中删除旧条目。
要解决此问题,你可以手动编辑 ~/.ssh/known_hosts 并删除有问题的行,或者使用 ssh-keygen -R 删除 localhost 的条目。
让我们使用 ssh-keygen -R 删除不正确的条目:
ssh-keygen -R localhost
...
现在,再次尝试连接到 localhost。系统将提示你确认主机的真实性,就像你第一次连接时一样。
ssh labex@localhost
...
你现在已成功使用基于密钥的身份验证再次连接。
退出会话:
exit
...
自定义 SSH 客户端配置
在本实验步骤中,你将学习如何使用 ~/.ssh/config 文件自定义你的 SSH 客户端配置。此文件允许你为不同的远程主机定义别名和特定的连接参数,简化你的 SSH 命令并使其更一致。
~/.ssh/config 文件是管理你的 SSH 连接的强大工具。你可以指定各种选项,例如用户名、要使用的私钥文件、端口号,甚至更高级的设置,例如代理命令。
首先,让我们创建或打开 ~/.ssh/config 文件。如果它不存在,nano 将会创建它。
nano ~/.ssh/config
将以下配置添加到文件中。此配置为连接到 localhost 作为 labex 用户的连接定义了一个别名 localhost_labex,以及一个作为 root 用户连接的别名 localhost_root。它还明确指定了 labex 用户的 IdentityFile,以便使用在之前的步骤中生成的 id_rsa 密钥。
Host localhost_labex
HostName localhost
User labex
IdentityFile ~/.ssh/id_rsa
Host localhost_root
HostName localhost
User root
通过按 Ctrl+X,然后按 Y 确认保存,并按 Enter 确认文件名来保存文件。
现在,让我们尝试使用这些新的别名连接到 localhost。
使用 localhost_labex 别名连接作为 labex:
ssh localhost_labex
由于你配置了 IdentityFile ~/.ssh/id_rsa,并且 id_rsa 没有密码,你应该能够在不提示密码的情况下登录。
Last login: Mon Jun 9 01:54:16 2025 from 47.251.66.143
[labex@host ~]$
退出会话:
exit
exit
Connection to localhost closed.
[labex@host ~]$
现在,使用 localhost_root 别名连接作为 root:
ssh localhost_root
系统将提示你输入 root 用户的密码。但是,由于此环境中禁用了 root 登录,你将收到“权限被拒绝”的消息:
root@localhost's password:
Permission denied, please try again.
root@localhost's password:
按 Ctrl+C 取消连接尝试:
^C
这演示了 SSH 配置别名有效,但由于禁用 root 登录的安全策略,连接失败。
如你所见,使用 ~/.ssh/config 文件通过预先配置常见的连接参数简化了你的 SSH 命令。
让我们添加另一个条目来演示指定不同端口。虽然 localhost 使用默认的 SSH 端口 (22),但此示例演示了如果端口不同,你将如何配置它。
再次打开 ~/.ssh/config 文件:
nano ~/.ssh/config
添加以下条目。这将创建一个别名 localhost_port_example,该别名明确将端口设置为 2222。(注意:localhost 实际上并没有监听端口 2222,因此此连接将失败,但这演示了如何配置。)
Host localhost_labex
HostName localhost
User labex
IdentityFile ~/.ssh/id_rsa
Host localhost_root
HostName localhost
User root
Host localhost_port_example
HostName localhost
Port 2222
User labex
保存文件。
现在,尝试使用 localhost_port_example 别名连接:
ssh localhost_port_example
此连接将失败,因为 localhost 并未监听端口 2222,但这演示了如何在你的 SSH 配置中指定自定义端口。
ssh: connect to host localhost port 2222: Cannot assign requested address
你可以在此链接找到一些常见错误的解释:
https://red.ht/support_rhel_ssh
你可以查看当前的 SSH 配置以查看所有定义的主机:
cat ~/.ssh/config
...
最后,让我们清理 ~/.ssh/config 文件,方法是删除 localhost_port_example 条目。
打开 ~/.ssh/config 文件:
nano ~/.ssh/config
删除 Host localhost_port_example 块。文件应如下所示:
Host localhost_labex
HostName localhost
User labex
IdentityFile ~/.ssh/id_rsa
Host localhost_root
HostName localhost
User root
保存文件。
理解 OpenSSH 服务器安全配置
在本步骤中,你将通过检查当前的配置来学习 OpenSSH 服务器安全最佳实践。你将了解 root 登录限制和密码认证设置如何保护你的服务器免受未经授权的访问。
注意: 在此实验环境中,你将检查当前的 SSH 安全配置并理解不同的安全设置。本步骤侧重于理解这些安全措施并学习 SSH 服务器配置的最佳实践。
理解 Root 登录安全
通常不建议通过 SSH 允许直接 root 登录,因为 root 账户拥有完整的管理权限。如果攻击者获得了 root 账户的访问权限,他们将完全控制你的系统。更安全的方式是登录为普通用户,然后使用 sudo 来执行管理任务。
让我们检查当前的 root 登录配置并测试其有效性。
首先,以 labex 用户通过 SSH 登录。
ssh labex@localhost
如果你的 SSH 密钥设置与之前的步骤一致,你应该无需密码即可登录。
Last login: Mon Jun 9 01:57:27 2025 from 47.251.66.143
[labex@host ~]$
现在,让我们检查 SSH 服务器配置文件以了解当前的安全设置:
sudo cat /etc/ssh/sshd_config | grep -E "^PermitRootLogin|^#PermitRootLogin"
此命令将显示当前的 PermitRootLogin 设置。你应该会看到类似以下内容:
PermitRootLogin no
此设置意味着通过 SSH 的直接 root 登录已被禁用,这是一个安全最佳实践。
让我们测试 root 登录是否真的被阻止了。首先,退出当前的 SSH 会话:
exit
exit
Connection to localhost closed.
[labex@host ~]$
现在,尝试登录到 localhost 的 root 用户:
ssh root@localhost
你应该会看到“Permission denied”消息,表明直接 root 登录不允许(这可能已在你的环境中配置好)。
root@localhost's password:
Permission denied, please try again.
root@localhost's password:
Permission denied, please try again.
root@localhost's password:
这证实了在此环境中 root 登录已被禁用,这是期望的安全配置。“Permission denied”消息表明安全措施正在有效工作。
理解密码认证安全
禁用密码认证会强制用户依赖更安全的方法,例如 SSH 密钥认证。这大大降低了服务器遭受暴力破解攻击的风险。
让我们检查当前的密码认证设置并理解其工作原理。
以 labex 用户通过 SSH 登录(使用你的 SSH 密钥):
ssh labex@localhost
Last login: Mon Jun 9 01:57:32 2025 from 127.0.0.1
[labex@host ~]$
首先,让我们检查当前的 PasswordAuthentication 设置:
sudo cat /etc/ssh/sshd_config | grep PasswordAuthentication
PasswordAuthentication yes
## PasswordAuthentication. Depending on your PAM configuration,
## PAM authentication, then enable this but set PasswordAuthentication
如你所见,当前配置为 PasswordAuthentication yes,这意味着密码认证已启用。虽然这允许用户使用密码进行身份验证,但它也带来了安全风险,因为它使服务器容易受到暴力密码攻击。
输出显示:
PasswordAuthentication yes- 这是启用密码认证的活动设置- 注释行提供了关于 PAM 配置的额外上下文
此配置意味着用户可以使用密码和 SSH 密钥进行身份验证。为了增强安全性,建议禁用密码认证,仅依赖基于 SSH 密钥的认证。
退出当前的 SSH 会话:
exit
exit
Connection to localhost closed.
[labex@host ~]$
现在,让我们验证在禁用密码认证的情况下 SSH 密钥认证是否正常工作:
ssh labex@localhost
这应该会成功,无需密码提示,而是使用你的 SSH 密钥:
Last login: Mon Jun 9 02:00:22 2025 from 127.0.0.1
[labex@host ~]$
这展示了几个重要的安全概念:
- 密码认证已启用 (
PasswordAuthentication yes) - 用户可以使用密码和 SSH 密钥登录 - SSH 密钥认证正常工作 - 提供了更安全的认证方法
- 服务器允许两种认证方法 - 虽然方便,但这可能带来暴力破解攻击的安全风险
- Root 登录已禁用 - 管理访问需要正确的用户权限提升
安全建议: 对于生产环境,请考虑将 PasswordAuthentication 设置为 no,以强制用户仅使用 SSH 密钥认证来增强安全性。
退出会话:
exit
exit
Connection to localhost closed.
[labex@host ~]$
你已成功检查并理解了 OpenSSH 服务器的安全配置。服务器当前已禁用 root 登录(这遵循了安全最佳实践),并启用了密码认证(这提供了灵活性,但在生产环境中可能需要额外的安全考虑)。你还验证了 SSH 密钥认证作为一种更安全的认证方法可以正常工作。
总结
在本实验中,参与者学习了如何使用 SSH 访问系统,从验证 openssh-clients 的安装开始,并通过 SSH 连接到 localhost。他们练习了使用密码进行身份验证,并理解了初始主机身份验证检查。
该实验进一步指导用户生成和使用 SSH 密钥对进行无密码身份验证,使用 ssh-agent 管理这些密钥,并解决常见的 SSH 连接问题。最后,参与者学习了如何自定义 SSH 客户端配置,并通过禁用 root 登录和密码身份验证来增强 OpenSSH 服务器的安全性,从而加深他们对安全远程访问实践的理解。



