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

[ad_1]

本指南解释了什么是基于 SSH 密钥的身份验证、SSH 身份验证方法的类型,以及如何在 Linux 和类 Unix 操作系统中配置基于 SSH 密钥的身份验证。

内容

  1. 什么是基于 SSH 密钥的身份验证?
  2. 在 Linux 中配置基于 SSH 密钥的身份验证
    1. 生成 SSH 密钥对
    2. 将 SSH 公钥复制到远程系统
    3. 在远程系统中禁用 SSH 基于密码的身份验证
    4. 从本地系统访问远程系统
      1. 向 SSH 服务器添加更多客户端系统的密钥
    5. 结论

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

众所周知, 安全外壳, 不久 SSH, 是一种加密网络协议,允许您通过不安全的网络(例如 Internet)安全地通信/访问远程系统。

每当您使用 SSH 通过不安全的网络发送数据时,数据将在源系统中自动加密,并在目标端解密。

SSH 提供了四种身份验证方法,即 基于密码的身份验证, 基于密钥的身份验证, 基于主机的身份验证, 和 键盘认证.

最常用的身份验证方法是基于密码和基于密钥的身份验证。

在基于密码的身份验证中,您所需要的只是远程系统用户的密码。 如果您知道远程用户的密码,您可以使用 “ssh [email protected]” 命令。

另一方面,在基于密钥的身份验证中,您需要生成 SSH 密钥对并将 SSH 公钥上传到远程系统,以便通过 SSH 进行通信。

每个 SSH 密钥对由一个私钥和一个公钥组成。 私钥应保存在客户端系统中,公钥应上传到远程系统。 你 不应向任何人透露私钥.

希望您对 SSH 及其身份验证方法有基本的了解。 现在让我们在 Linux 中配置基于 SSH 密钥的身份验证。

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

出于本指南的目的,我将使用 Arch Linux 系统作为本地系统,使用 Ubuntu 18.04 LTS 作为远程系统。

本地系统详细信息:

  • : Arch Linux 桌面
  • IP地址 : 192.168.225.37 /24

远程系统详细信息:

  • : Ubuntu 18.04 LTS 服务器
  • IP地址 : 192.168.225.22/24

生成 SSH 密钥对

如前所述,在基于 SSH 密钥的身份验证方法中,应将公钥上传到您要通过 SSH 访问的远程系统。

公钥通常存储在一个名为 ~/.ssh/authorized_keys 在远程 SSH 系统中。

重要的提示: 不要将密钥对生成为 ,因为只有 root 才能使用这些密钥。 以普通用户身份创建密钥对。

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

$ ssh-keygen

上述命令将创建 2048 位 RSA 密钥对。 Enter 密码短语两次。 更重要的是,记住你的密码。 你稍后会需要它。

样本输出:

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 [email protected]
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 密钥 ~/.ssh/id_rsa 并想使用密码更新密钥,请使用以下命令:

$ 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 服务器:

$ ssh-copy-id [email protected]

在这里,我将把本地(Arch Linux)系统的公钥复制到远程系统(在我的例子中是 Ubuntu 18.04 LTS)。

从技术上讲,上述命令将复制本地系统的内容 ~/.ssh/id_rsa.pub 密钥 进入远程系统 ~/.ssh/authorized_keys 文件。 清除? 好的。

类型 是的 继续连接到远程 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
[email protected]'s password:

Number of key(s) added: 1

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

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

$ ssh-copy-id -f [email protected]

我们已成功将本地系统的 SSH 公钥添加到远程系统。

我们现在可以在远程系统中完全禁用基于密码的身份验证。 因为,我们已经配置了基于密钥的身份验证,所以我们不再需要基于密码的身份验证。

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

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

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

$ sudo vi /etc/ssh/sshd_config

找到以下行。 取消注释并将其值设置为 .

PasswordAuthentication no

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

$ sudo systemctl restart sshd

从本地系统访问远程系统

使用以下命令转到本地系统并通过 SSH 连接到远程服务器:

$ ssh [email protected]

Enter 登录远程系统的密码。

样本输出:

Enter passphrase for key '/home/sk/.ssh/id_rsa': 
Last login: Mon Jul 9 09:59:51 2018 from 192.168.225.37
[email protected]:~$

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

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

$ ssh [email protected]

样本输出:

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 服务器添加更多客户端系统的密钥

这是非常重要的。 就像我已经说过的,你不能通过 SSH 访问远程系统,除了你配置的系统(在我们的例子中,它是 Ubuntu)。

我想授予更多客户端访问远程 SSH 服务器的权限。 我该怎么办? 简单的。 您需要在所有客户端系统中生成 SSH 密钥对,并将 ssh 公钥手动复制到要通过 SSH 访问的远程服务器。

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

$ ssh-keygen

Enter 密码短语两次。 生成密钥对后,手动将公共 ssh 密钥(不是私钥)复制到远程服务器。

使用命令显示 pub 密钥:

$ cat ~/.ssh/id_rsa.pub

您应该会看到如下所示的输出。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCt3a9tIeK5rPx9p74/KjEVXa6/OODyRp0QLS/sLp8W6iTxFL+UgALZlupVNgFjvRR5luJ9dLHWwc+d4umavAWz708e6Na9ftEPQtC28rTFsHwmyLKvLkzcGkC5+A0NdbiDZLaK3K3wgq1jzYYKT5k+IaNS6vtrx5LDObcPNPEBDt4vTixQ7GZHrDUUk5586IKeFfwMCWguHveTN7ykmo2EyL2rV7TmYq+eY2ZqqcsoK0fzXMK7iifGXVmuqTkAmZLGZK8a3bPb6VZd7KFum3Ezbu4BXZGp7FVhnOMgau2kYeOH/ItKPzpCAn+dg3NAAziCCxnII9b4nSSGz3mMY4Y7 [email protected]

复制全部内容(通过 USB 驱动器或任何介质)并转到远程服务器的控制台。 创建一个名为 SSH 在主目录中,如下所示。

$ mkdir -p ~/.ssh

接下来,将您在上一步中生成的客户端系统的 pub 密钥附加到一个名为 “~/.ssh/authorized_keys”

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

在远程系统上重新启动 ssh 服务。 现在,您将能够从新客户端通过 SSH 连接到您的服务器。

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

建议阅读:

  • 查找用户是否使用基于密码或基于密钥的 SSH 身份验证
  • SSLH – 为 HTTPS 和 SSH 共享同一个端口
  • ScanSSH – 快速 SSH 服务器和开放代理扫描器

结论

基于 SSH 密钥的身份验证提供额外的保护层,防止暴力攻击。 如您所见,配置基于密钥的身份验证也不是那么困难。 这是保证 Linux 服务器安全的推荐方法之一。

配置基于 SSH 密钥的身份验证DecryptionEncryptionLinuxSecure ShellSecuritySSHSSH 身份验证SSH 无密码身份验证

[ad_2]

Related Posts