Contents

设置SSH的公共密钥身份验证

1. 简介

**公钥身份验证是向远程服务器标识我们自己的另一种方法。**与常规密码不同,公钥身份验证使用加密密钥对进行验证。

使用强密码可能有助于防止暴力攻击,但公钥身份验证可提供加密强度。此外,它允许我们进行自动无密码登录。这增加了两个 Linux 服务器之间的信任,使文件传输更加容易。

在本教程中,我们将介绍如何在 Linux 系统上设置公钥身份验证。

2. 创建SSH密钥对

我们首先需要在本地计算机上生成 SSH 密钥对来配置 SSH 密钥身份验证。为此,我们可以使用一个名为*ssh-keygen *的特殊实用程序,它包含在标准 OpenSSH 工具套件中。

默认情况下,ssh-keygen会创建一个 3072 位 RSA 密钥对。让我们使用此命令生成 SSH 密钥对:

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

使用*-b*选项,我们还可以为将生成的密钥对指定字节长度:

$ ssh-keygen -b 4096

系统将提示我们为创建的密钥对选择保存位置。默认情况下,密钥存储在~/.ssh*目录中。建议在此阶段使用默认位置,因为它允许 SSH 客户端自动找到我们的 SSH 密钥。*

我们可以按ENTER 键以保留默认位置或键入其他位置以保存密钥对。

如果之前生成了 SSH 密钥对,我们将收到覆盖现有密钥的提示:

/home/user/.ssh/id_rsa already exists.
Overwrite (y/n)?

选择是将覆盖现有密钥,我们将无法再次使用它。这是一个不可逆的过程。

接下来,系统将提示我们输入密码以加密本地计算机上的私钥:

Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):

**密码作为额外的安全层来保护生成的私钥。**我们每次使用私钥都需要输入它。

输入密码是可选的,但建议用于安全系统。我们在成功创建密钥对时得到以下输出:

Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:f6sdCUZLKUm61/Mbv7DZh+NNR4Dn7oA+vnb4JB82qyc user@user-PC
The key's randomart image is:
+---[RSA 3072]----+
|        .        |
|       o . . .   |
|      . o + . o  |
|       . = . o . |
|      . S *   . .|
|       . o = o . |
|          +.& ..o|
|         .EBo^ooo|
|         o*XX.*+.|
+----[SHA256]-----+

这将创建两个文件:

  • id_rsa:代表私钥
  • id_rsa.pub:代表公钥

我们现在拥有可用于身份验证的公钥和私钥。下一步是将公钥复制到远程服务器。

3. 将公钥复制到远程服务器

我们可以使用多种方法将公钥上传到远程 SSH 服务器:

  • 使用ssh-copy-id
  • 使用SSH
  • 手动复制它

让我们仔细研究每一种方法。

3.1. 使用ssh-copy-id

**ssh-copy-id 是一个将公钥复制到远程 SSH 服务器的实用程序。**这是复制公钥的最简单和最推荐的方法。

它包含在大多数 Linux 发行版的 OpenSSH 包中,因此我们不需要安装它。我们必须启用基于密码的身份验证才能使用此方法。

它要求我们为远程主机指定一个 IP 地址,并启用基于密码的身份验证的用户帐户:

$ ssh-copy-id user@remote_host_ip_address
The authenticity of host 'xxx.x.xxx.x (xxx.x.xxx.x)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)?

收到此消息是正常的,因为我们的本地计算机还不能识别远程服务器。让我们输入yes,然后按ENTER键继续。

该实用程序将继续扫描我们之前生成的公钥。一旦找到密钥,它就会提示我们在远程服务器上输入密码。

当我们输入正确的密码时,该实用程序将连接到远程服务器并复制我们的公钥。密钥被复制到远程服务器上的*~/.ssh目录,文件名为authorized_keys*。

我们应该得到这个输出:

Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'user@xxx.x.xxx.x'"
and check to make sure that only the key(s) you wanted were added.

3.2. 使用 SSH

我们也可以通过常规的SSH方式上传公钥。为此,我们需要输出公钥的内容并通过 SSH 将其通过管道传输到远程服务器。

让我们使用*»*重定向运算符来附加内容而不是覆盖任何现有的键:

$ cat ~/.ssh/id_rsa.pub | ssh user@remote_host_ip_address "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
The authenticity of host 'xxx.x.xxx.x (xxx.x.xxx.x)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)?

同样,收到此消息是正常的,因为我们的本地计算机还不能识别远程服务器。我们只需要输入yes,然后按ENTER键继续。

接下来,系统将提示我们在远程服务器上输入密码。授权时,我们本地计算机上的公钥将被复制到authorized_key文件的末尾。

3.3. 手动复制公钥

**如果我们没有基于密码的远程服务器访问权限,我们也可以手动复制公钥。**为此,我们需要手动复制公钥中的内容,并将其粘贴到远程服务器。

让我们使用cat 来显示我们的公钥:

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAA...truncated...AGvaQ== user@host_ip_address

接下来,我们需要从终端复制密钥,然后通过我们可用的任何方式访问我们的远程服务器。例如,我们可以使用基于 Web 的控制台或仪表板。

然后,我们使用mkdir 命令创建*~/.ssh*目录(如果它尚不存在):

$ mkdir -p ~/.ssh

或者,我们只是在无法访问基于 Web 的控制台的情况下手动创建文件夹。

最后,让我们创建或修改authorized_keys目录并粘贴我们复制的公钥:

$ echo public_key >> ~/.ssh/authorized_keys

这会将我们的公钥内容附加到authorized_keys文件而不覆盖它。

4. 通过 SSH 密钥测试身份验证

一旦我们将公钥复制并粘贴到我们的远程服务器,我们应该能够在没有密码的情况下成功登录。让我们使用此命令来测试我们的密钥:

$ ssh user@remote_ip_address

如果我们在密钥对生成期间创建了密码,系统将提示我们输入密码。否则,我们将立即登录到远程服务器并可以访问其文件和文件夹。

这是一个示例输出:

Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-154-generic x86_64)
...truncated...
Last login: Thu Jan  6 10:48:29 2022 from xxx.xxx.xx.xxx
user@ubuntu-s-1vcpu-1gb-nyc1-01:~#

登录后,我们可以看到有关远程服务器的许多重要信息,包括当前登录用户数、CPU 使用率统计信息等等。

5. 在远程服务器上禁用密码验证

禁用仍然有效的基于密码的身份验证对我们来说至关重要,以保护我们的远程服务器免受暴力攻击。

我们需要确保我们使用root用户或任何其他具有sudo权限的可用用户设置了 SSH 密钥身份验证设置。这对于确保我们仍然能够获得管理访问权限很重要。

首先,让我们通过 SSH 登录到我们的远程服务器,然后通过nano 打开 SSH 配置文件:

$ sudo nano /etc/ssh/sshd_config

进入文件后,让我们搜索一行*“PasswordAuthentication”。根据我们的系统,它可能未被注释,但我们可以通过删除开头的“#”符号来启用它,然后将其值设置为“no”*:

PasswordAuthentication no

最后,让我们保存并关闭文件。要实施我们刚刚所做的更改,我们需要重新启动ssh服务:

$ sudo systemctl restart ssh

或者,我们可以使用这个命令:

sudo kill -HUP `cat /var/run/sshd.pid`

另一种方法是使用此命令:

sudo kill -HUP $(cat /var/run/sshd.pid)

这会在通过 SSH 登录时禁用密码验证。

6. 附加信息

让我们看一下有关公钥身份验证的一些有用的附加信息。

6.1. 备份现有的 SSH 密钥对

我们可以将文件复制到现有的备份服务器、外部媒体存储设备,如果我们更喜欢非数字方法,甚至可以将密钥对打印在一张纸上。

6.2. 添加或替换现有密钥的密码

要在默认 SSH 私钥上添加或修改现有密码,我们需要使用ssh-keygen命令:

$ ssh-keygen -p

要指定不同的文件名,我们可以使用*-f*标志传递它:

$ ssh-keygen -p -f ~/.ssh/private_key_filename

6.3. SSH 密钥的保护

为了保护我们的 SSH 密钥,我们需要执行以下操作:

  • 限制账户的所有权限
  • 使用强密码。可以是带数字和特殊字符的句子
  • 避免在任何在线或不安全的服务器上共享私钥