如何在Linux中配置基于SSH密钥的身份验证

时间:2020-03-21 11:47:44  来源:igfitidea点击:

什么是基于SSH密钥的身份验证?

众所周知,Secure Shell(简称SSH)是一种加密网络协议,可让我们通过不安全的网络(例如Internet)安全地通信/访问远程系统。
每当我们使用SSH通过不安全的网络发送数据时,数据将在源系统中自动加密,并在目标端解密。
SSH提供了四种身份验证方法,即基于密码的身份验证,基于密钥的身份验证,基于主机的身份验证和键盘身份验证。
最常用的身份验证方法是基于密码的身份验证和基于密钥的身份验证。

在基于密码的身份验证中,我们需要的只是远程系统用户的密码。
如果知道远程用户的密码,则可以使用“ ssh Hyman @ theitroad”命令访问相应的系统。

另一方面,在基于密钥的身份验证中,我们需要生成SSH密钥对并将SSH公钥上载到远程系统,以便通过SSH进行通信。
每个SSH密钥对都包含一个私钥和一个公钥。
私钥应保留在客户端系统内,而公钥应上载到远程系统。
我们不应将私钥透露给任何人。
希望我们对SSH及其身份验证方法有基本的了解。
在本教程中,我们将讨论如何在Linux中配置基于SSH密钥的身份验证。

在Linux中配置基于SSH密钥的身份验证

就本教程而言,我将使用Arch Linux系统作为本地系统,并使用Ubuntu 18.04 LTS作为远程系统。

本地系统详细信息:

  • 操作系统:Arch Linux Desktop
  • IP地址:192.168.225.37/24

远程系统详细信息:

  • 操作系统:Ubuntu 18.04 LTS Server
  • IP地址:192.168.225.22/24

本地系统配置

如前所述,在基于SSH密钥的身份验证方法中,应将公钥上载到要通过SSH访问的远程系统。
公共密钥通常将存储在远程SSH系统中名为~/.ssh/authorized_keys的文件中。

重要说明:请勿将密钥对作为根生成,因为只有root才能使用这些密钥。
以普通用户身份创建密钥对。

现在,让我们在本地系统中创建SSH密钥对。
为此,请在本地客户端系统中运行以下命令。

$ssh-keygen

上面的命令将创建2048位RSA密钥对。
输入两次密码。
更重要的是,请记住密码。
稍后我们将需要它。

输出示例:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/sk/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/sk/.ssh/id_rsa.
Your public key has been saved in /home/sk/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:wYOgvdkBgMFydTMCUI3qZaUxvjs+p2287Tn4uaZ5KyE Hyman@theitroad
The key's randomart image is:
+---[RSA 2048]----+
|+=+*= + |
|o.o=.* = |
|.oo * o + |
|. = + . o |
|. o + . S |
| . E . |
| + o |
| +.*o+o |
| .o*=OO+ |
+----[SHA256]-----+

如果我们已经创建了密钥对,则会看到以下消息。
只需键入“ y”即可覆盖现有密钥。

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

请注意,密码是可选的。
如果我们提供一个,则每次尝试通过SSH进入远程系统时都会要求我们输入密码,除非我们使用任何SSH代理来存储密码。
如果我们不希望使用密码短语(虽然并不安全),则在要求我们提供密码短语时,只需按两次ENTER键。
但是,我建议我们使用密码短语。
从安全的角度来看,使用无密码的ssh密钥通常不是一个好主意。
它们应限于非常特殊的情况,例如必须在没有用户干预的情况下访问远程系统的服务(例如,具有rsync,unison等的远程备份)。

如果私有文件~/.ssh/id_rsa中已经有不带密码短语的ssh密钥,并且想要使用密码短语更新密钥,请使用以下命令:

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

输出示例:

Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.

我们已经在本地系统中创建了密钥对。
接下来,使用以下命令将SSH公钥复制到远程SSH服务器:

$ssh-copy-id Hyman@theitroad

其中我将把本地(Arch Linux)系统的公钥复制到远程系统(在我的情况下为Ubuntu 18.04 LTS)。
从技术上讲,以上命令会将本地系统的~/.ssh/id_rsa.pub密钥的内容复制到远程系统的~/.ssh/authorized_keys文件中。
清除?
好的。

输入yes继续连接到远程SSH服务器,然后输入远程系统的sudo(或者root用户)密码。

/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
Hyman@theitroad's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'Hyman@theitroad'"
and check to make sure that only the key(s) you wanted were added.

如果我们已经复制了密钥,但是想用新的密码更新密钥,请使用-f选项覆盖现有密钥,如下所示。

$ssh-copy-id -f Hyman@theitroad

我们已成功将本地系统的SSH公钥添加到远程系统。
现在,我们可以在远程系统中完全禁用基于密码的身份验证。
因为我们已经配置了基于密钥的身份验证,所以我们不再需要基于密码的身份验证。

在远程系统中禁用基于SSH密码的身份验证

我们需要以root或者sudo用户身份执行以下命令。

要禁用基于密码的身份验证,请转到远程系统的控制台并使用任何编辑器编辑/etc/ssh/sshd_config配置文件:

$sudo vi /etc/ssh/sshd_config

查找以下行。
取消注释,并将其值设置为no。

PasswordAuthentication no

重新启动ssh服务以使更改生效。

$sudo systemctl restart sshd

从本地系统访问远程系统

转到本地系统,并使用以下命令SSH进入远程服务器:

$ssh Hyman@theitroad

输入密码以登录到远程系统。

输出示例:

Enter passphrase for key '/home/sk/.ssh/id_rsa': 
Last login: Mon May 9 09:59:51 2016 from 192.168.225.37
Hyman@theitroad:~$

如我们所见,我们已使用我们之前使用ssh-keygen命令创建的密码而不是用户帐户的实际密码登录了远程系统的帐户。

如果尝试从另一个客户端系统进行ssh,则会收到此错误消息。
例如,我尝试使用以下命令从CentOS SSH进入我的Ubuntu系统:

$ssh Hyman@theitroad

输出示例:

The authenticity of host '192.168.225.22 (192.168.225.22)' can't be established.
ECDSA key fingerprint is 67:fc:69:b7:d4:4d:fd:6e:38:44:a8:2f:08:ed:f4:21.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.225.22' (ECDSA) to the list of known hosts.
Permission denied (publickey).

从上面的输出中可以看到,我不允许从其他系统通过SSH进入远程Ubuntu 18.04系统。

向SSH服务器添加更多客户端系统的密钥

这个非常重要。
就像我已经说过的那样,除了我们配置的那个(在我们的例子中是Ubuntu),我们无法通过SSH访问远程系统。
我想给更多客户端访问远程SSH服务器的权限。
我应该怎么办?
简单的。
我们需要在所有客户端系统中生成SSH密钥对,然后将ssh公共密钥手动复制到要通过SSH访问的远程服务器上。

要在客户端系统上创建SSH密钥对,请运行:

$ssh-keygen

输入两次密码。
生成密钥对后,将公共ssh密钥(而非私有密钥)手动复制到远程服务器。

使用以下命令显示发布密钥:

$cat ~/.ssh/id_rsa.pub

我们应该看到类似下面的输出。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCt3a9tIeK5rPx9p74/KjEVXa6/OODyRp0QLS/sLp8W6iTxFL+UgALZlupVNgFjvRR5luJ9dLHWwc+d4umavAWz708e6Na9ftEPQtC28rTFsHwmyLKvLkzcGkC5+A0NdbiDZLaK3K3wgq1jzYYKT5k+IaNS6vtrx5LDObcPNPEBDt4vTixQ7GZHrDUUk5586IKeFfwMCWguHveTN7ykmo2EyL2rV7TmYq+eY2ZqqcsoK0fzXMK7iifGXVmuqTkAmZLGZK8a3bPb6VZd7KFum3Ezbu4BXZGp7FVhnOMgau2kYeOH/ItKPzpCAn+dg3NAAziCCxnII9b4nSSGz3mMY4Y7 Hyman@theitroad

复制整个内容(通过U盘或者任何介质),然后转到远程服务器的控制台。
如下所示,在主目录中创建一个名为ssh的目录。

$mkdir -p ~/.ssh

接下来,将我们在上一步中生成的客户端系统的发布密钥添加到名为“~/.ssh/authorized_keys”的文件中:

echo {Your_public_key_contents_here} >> ~/.ssh/authorized_keys

在远程系统上重新启动ssh服务。
现在,我们将能够从新客户端SSH到服务器。

如果似乎很难手动添加ssh pubkey,请在远程系统中临时启用基于密码的身份验证,然后使用本地系统中的“ ssh-copy-id”命令复制密钥,最后禁用基于密码的身份验证。