在 Linux 中配置 SSH 公钥身份验证

CompTIABeginner
立即练习

介绍

在本实验中,你将学习如何配置和使用 SSH 公钥身份验证来安全地连接到远程 Linux 服务器。这种方法通过使用加密密钥对取代传统的基于密码的登录,从而增强了安全性和便利性。你将创建一个私钥(保存在本地机器上并严格保密)和一个公钥(放置在服务器上以授权你的访问)。

整个过程分为三个主要步骤。首先,你将使用 ssh-keygen 命令为演示用户生成一个新的 RSA 密钥对,并通过设置密码短语(passphrase)来增加额外的安全层。接着,你将使用 ssh-copy-id 工具将公钥安全地复制到远程服务器的已授权密钥文件中。最后,你将通过 SSH 登录服务器来测试配置,此时系统将使用你的密钥对而不是密码进行身份验证。

这是一个引导式实验,提供分步指令来帮助你学习和练习。请仔细遵循说明完成每个步骤并获得实践经验。历史数据表明,这是一个初学者级别的实验,完成率为 97%。它获得了学习者 100% 的好评率。

创建演示用户并生成 RSA 密钥对

在这一步中,你将首先创建一个专门用于演示 SSH 公钥身份验证的用户账户,然后生成一个 RSA 加密密钥对。这种方法可以确保我们有一个干净的演示环境,而不会影响现有的用户配置。

创建演示用户

首先,让我们创建一个名为 sshuser 的新用户,用于我们的 SSH 演示:

sudo adduser sshuser

系统会提示你设置密码并提供用户信息。在本实验中,请使用 password123 作为密码。你可以按回车键跳过可选字段(全名、房间号等)。

Adding user `sshuser' ...
Adding new group `sshuser' (1001) ...
Adding new user `sshuser' (1001) with group `sshuser' ...
Creating home directory `/home/sshuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for sshuser
Enter the new value, or press ENTER for the default
 Full Name []:
 Room Number []:
 Work Phone []:
 Home Phone []:
 Other []:
Is the information correct? [Y/n] Y

生成 RSA 密钥对

现在,让我们切换到 sshuser 账户来生成密钥对。这可以确保密钥创建在正确用户的家目录中:

sudo su - sshuser

你现在以 sshuser 身份进行操作。使用 ssh-keygen 命令生成 RSA 密钥对。-t 参数指定要创建的密钥类型,在本例中为 rsa

ssh-keygen -t rsa

运行命令后,系统会提示你选择保存密钥的位置。默认位置是 ~/.ssh/id_rsa,位于用户家目录下名为 .ssh 的隐藏目录中。按 回车键 接受此默认位置。

Generating public/private rsa key pair.
Enter file in which to save the key (/home/sshuser/.ssh/id_rsa):

接下来,系统会要求你输入密码短语。密码短语为你的私钥增加了额外的安全保护。在本实验中,我们使用 sshkey-password 作为密码短语。你需要输入两次。

注意:当你输入密码短语时,屏幕上不会显示任何字符。这是标准的安全性设计。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sshuser/.ssh/id_rsa
Your public key has been saved in /home/sshuser/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:<FINGERPRINT_STRING> sshuser@ubuntu
The key's randomart image is:
+---[RSA 3072]----+
|      .. . .o..  |
|     .  . . o..  |
|      .  . = . . |
|       .  B o .  |
|        S= * .   |
|        o*B o .  |
|       .oO=B . . |
|      .o+*+oE. . |
|      .o*o=o.o.  |
+----[SHA256]-----+

密钥生成后,你可以验证文件是否已正确创建。使用 ls -l 命令列出 ~/.ssh 目录的内容:

ls -l ~/.ssh

你应该会看到类似以下内容的输出,显示了你的新密钥文件:

total 8
-rw------- 1 sshuser sshuser 2610 Jun 30 10:30 id_rsa
-rw-r--r-- 1 sshuser sshuser  575 Jun 30 10:30 id_rsa.pub

请注意文件权限。私钥 id_rsa 仅对所有者具有读/写权限,而公钥 id_rsa.pub 可以被其他人读取。保护好你的私钥且永不共享是至关重要的。

使用 ssh-copy-id 将公钥复制到服务器

在这一步中,你将把上一步生成的公钥复制到 SSH 服务器。此操作会授权该密钥,允许你使用相应的私钥而不是密码进行登录。ssh-copy-id 工具是一个脚本,它通过将你的密钥安装到服务器上的正确位置来简化此过程。

在本实验中,我们将在单台机器上模拟客户端 - 服务器交互。sshuser 账户将同时充当客户端和 SSH 连接的目标账户。

确保你仍以 sshuser 账户身份操作。如果你已返回到 labex 用户,请切换回去:

sudo su - sshuser

现在你已准备好复制公钥。ssh-copy-id 命令将远程用户和主机作为参数。我们将使用 sshuser@localhost 来指定本地机器(充当服务器)上的用户 sshuser

执行命令:

ssh-copy-id sshuser@localhost

由于这是第一次通过 SSH 连接到 localhost,系统会要求你验证主机的真实性。输入 yes 继续:

The authenticity of host 'localhost (::1)' can't be established.
ED25519 key fingerprint is SHA256:<FINGERPRINT_STRING>.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

该工具随后会扫描你的 id_rsa.pub 密钥,并提示你输入 sshuser 账户的密码。输入你在创建用户时设置的密码 password123

/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
sshuser@localhost's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'sshuser@localhost'"
and check to make sure that only the key(s) you wanted were added.

输出确认已成功添加一个密钥。ssh-copy-id 命令会自动在服务器上创建 ~/.ssh 目录(如果不存在),并将你的公钥追加到 ~/.ssh/authorized_keys 文件中。

为了确认这一点,你可以查看 authorized_keys 文件的内容。它应该包含与你的 id_rsa.pub 文件完全相同的密钥。

cat ~/.ssh/authorized_keys

输出将是一长串字符,即你的公钥。

ssh-rsa AAAA...[long key string]...== sshuser@ubuntu

测试使用公钥身份验证进行 SSH 登录

在最后一步中,你将测试新配置以确保公钥身份验证正常工作。你将尝试使用创建的密钥对登录 SSH 服务器。系统不应提示你输入用户密码,而是提示你输入为私钥设置的密码短语。

确保你仍以 sshuser 账户身份操作:

whoami

你应该看到输出为 sshuser。如果不是,请切换回 sshuser 账户:

sudo su - sshuser

现在,让我们发起一个到 localhost 的 SSH 连接。由于你在复制密钥的过程中已经连接过一次,主机密钥应该已经被接受了。

执行以下命令进行连接:

ssh sshuser@localhost

系统会提示你输入私钥的密码短语。这是你在步骤 1 中创建的密码短语(sshkey-password)。

Enter passphrase for key '/home/sshuser/.ssh/id_rsa':

输入你的密码短语 sshkey-password 并按 回车键。如果输入正确,你将登录到服务器并看到欢迎消息。

Welcome to Ubuntu 22.04.x LTS (GNU/Linux x.x.x-xx-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

Last login: Mon Jun 30 10:45:23 2024 from ::1
sshuser@ubuntu:~$

恭喜!你已成功使用公钥身份验证登录。你现在处于一个新的 SSH 会话中。请注意,系统没有提示你输入用户账户密码(password123),而只要求输入密钥密码短语。

要验证你是否处于新的 SSH 会话中,可以检查环境变量:

echo $SSH_CONNECTION

这应该显示连接详情,确认你正处于 SSH 会话中。

要关闭 SSH 会话并返回原始终端,只需输入 exit 并按 回车键

exit

你会看到一条确认连接已关闭的消息。

logout
Connection to localhost closed.

最后,你可以从 sshuser 账户退出,返回到 labex 用户:

exit

你现在已成功使用专门的演示用户配置并测试了 SSH 公钥身份验证。

总结

在本实验中,你学习了如何配置和使用 SSH 公钥身份验证,以建立到远程 Linux 服务器的安全免密连接。你首先创建了一个专门的演示用户(sshuser),以确保密钥身份验证设置环境的纯净。然后,你使用 ssh-keygen 命令生成了一个新的 RSA 密钥对。此过程创建了一个私钥(保持安全并由密码短语保护以增加额外安全性)和一个相应的公钥。

随后,你使用了 ssh-copy-id 工具将公钥安全地传输到服务器的已授权密钥文件中。该命令自动将密钥追加到 ~/.ssh/authorized_keys 文件中,从而授权了该密钥对的访问权限。最后一步涉及通过发起服务器 SSH 会话来测试连接,该会话成功使用私钥的密码短语而不是用户账户密码进行了身份验证,确认了公钥身份验证功能正常。