在 Linux 中配置 SSH 公钥认证

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

引言

在本实验中,你将学习如何配置和使用 SSH 公钥认证,以安全地连接到远程 Linux 服务器。此方法通过用一对加密密钥替换传统的基于密码的登录,从而增强了安全性和便利性。你将创建一个私钥,该私钥保存在你的本地机器上且不公开,以及一个公钥,该公钥放置在服务器上以授权你的访问。

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

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

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

创建演示用户

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

sudo adduser sshuser

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

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 的隐藏目录中。按 Enter 接受此默认位置。

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

接下来,系统将要求你输入一个密码短语(passphrase)。密码短语为你的私钥增加了额外的安全层。在本实验中,让我们使用 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,然后按 Enter。如果输入正确,你将被登录到服务器并看到欢迎消息。

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 并按 Enter

exit

你将看到一条消息,确认连接已关闭。

logout
Connection to localhost closed.

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

exit

你现在已经成功配置并测试了使用专用演示用户进行的 SSH 公钥认证。

总结

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

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