设置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 密钥,我们需要执行以下操作:
- 限制账户的所有权限
- 使用强密码。可以是带数字和特殊字符的句子
- 避免在任何在线或不安全的服务器上共享私钥