如何在 Ubuntu 16.04 上设置 SSH 密钥

介绍

SSH,也称为安全外壳 (Secure Shell),是一种通常用于管理和与服务器通信的加密协议。在使用 Ubuntu 服务器时,本教程将重点介绍如何为 Ubuntu 16.04 设置 SSH 密钥。建议所有用户使用 SSH 密钥,它能提供一种简单、安全的服务器登录方式。

步骤 1 — 创建 RSA 密钥对

设置 SSH 密钥的第一步是在客户端机器(通常在计算机上)上创建密钥对:


$ ssh-keygen

首先,ssh-keygen 将创建一个 2048 位 RSA 密钥对,这对于大多数用例来说足够安全。

或者,您可以选择传入 -b 4096 标志来创建更大的 4096 位密钥

输入命令后,你应该能够看到以下提示:


Output

Enter file in which to save the key (/your_home/.ssh/id_rsa):

按回车键将密钥对保存到主目录中的 .ssh/ 子目录或自定义备用路径中。
应该会出现以下提示:


Output

Enter passphrase ( leave empty for no passphrase):

您也可以选择输入安全密码,我们强烈建议您这样做。密码可以增加额外的安全保障,防止未经授权的用户登录。要了解更多关于安全性的信息,请参阅我们的教程:如何在 Linux 服务器上配置基于 SSH 密钥的身份验证。

然后您应该会看到以下输出:

Output

Your identification has been saved in /your_home/.ssh/id_rsa.
Your public key has been saved in /your_home/.ssh/id_rsa.pub.
The key fingerprint is:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
The key's randomart image is:
+--[ RSA 2048]----+
| ..o |
| E o= . |
| o. o |
| .. |
| ..S |
| o o. |
| =o.+. |
|. =++.. |
|o=++. |
+-----------------+

现在您应该拥有可用于身份验证的公钥和私钥。下一步是将公钥放在服务器上,以便使用基于 SSH 密钥的身份验证登录。


第 2 步 - 将公钥复制到 Ubuntu 服务器


将公钥复制到 Ubuntu 主机的最快方法是使用名为 ssh-copy-id 的实用程序。如果可用,强烈建议使用此方法。如果您的客户端计算机上没有 ssh-copy-id,您可以使用本节提供的两种替代方法之一(通过基于密码的 SSH 复制或手动复制密钥)。


使用 ssh-copy-id 复制公钥


ssh-copy-id 工具已默认包含在很多操作系统中,您可能已经在本地系统上安装了它。要使其正常工作,您需要拥有基于密码的 SSH 服务器访问权限。
要使用该实用程序,您需要指定要连接的远程主机,并添加您拥有 SSH 密码访问权限的用户帐户。您的 SSH 公钥将被复制到该帐户。


语法是:


$ ssh-copy-id username@remote_host

您可能会看到以下消息:


Output

The authenticity of host '111.111.11.111 (111.111.11.111)' 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

这意味着您的本地计算机无法识别远程主机。这很可能发生在您第一次连接到新主机时。输入“yes”并按 ENTER 继续。


接下来,该实用程序将扫描您的本地帐户,查找我们之前创建的 id_rsa.pub 密钥。找到密钥后,它将提示您输入远程用户帐户的密码:


Output

/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
username@111.111.11.111's password:

输入密码(请注意,出于安全考虑,您输入的内容不会显示出来),然后按 ENTER。该实用程序将使用您提供的密码连接到远程主机上的帐户。然后,它会将您 ~/.ssh/id_rsa.pub 密钥的内容复制到远程帐户主目录 ~/.ssh 中名为 authorized_keys 的文件中。


之后您应该看到以下输出:


Output

Number of key(s) added: 1

Logging into the machine, with: "ssh 'username@111.111.11.111'"
and check to make sure that only the key you wanted was added.

在此过程中,您的 id_rsa.pub 密钥已上传到远程帐户。

使用 SSH 复制公钥

如果您没有可用的 ssh-copy-id,但您可以通过密码的 SSH 访问服务器上的帐户,则可以使用传统的 SSH 方法上传密钥。

我们可以通过使用 cat 命令读取本地计算机上 SSH 公钥的内容,并通过 SSH 连接将其传输到远程服务器来实现这一点。另一方面,我们可以确保 ~/.ssh 目录存在于我们正在使用的帐户下,然后将我们传输的内容输出到该目录中名为 authorized_keys 的文件中。

我们将使用 >> 重定向符号来附加内容,而不是覆盖它。这样我们可以添加键,而不会破坏之前添加的键。

完整命令如下:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

您可能会看到以下消息:

Output

The authenticity of host '111.111.11.111 (111.111.11.111)' 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

这意味着您的本地计算机无法识别远程主机。第一次连接到新主机时会出现这种情况。输入“yes”并按 ENTER 继续。

之后,系统将提示您输入远程用户帐户密码:

Output

username@111.111.11.111's password:

输入密码后,您的 id_rsa.pub 密钥的内容将被复制到远程用户帐户的 authorized_keys 文件的末尾。如果成功,请继续执行步骤 3。

手动复制公钥

如果您没有基于密码的 SSH 访问您的服务器,您将必须手动完成上述过程。

我们将手动将您的 id_rsa.pub 文件的内容附加到远程计算机上的 ~/.ssh/authorized_keys 文件中。

要显示 id_rsa.pub 密钥的内容,请在本地计算机中输入以下内容:


cat ~/.ssh/id_rsa.pub

您将看到密钥的内容,它看起来应该是这样的:


Output

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle
7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G
/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U
/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

使用您可用的方法访问您的远程主机。

一旦你能够访问远程服务器上的帐户,请确保 ~/.ssh 目录存在。该命令将在必要时创建该目录,如果目录已存在,则不会执行任何操作:

mkdir -p ~/.ssh

现在,您可以在此目录中创建或修改authorized_keys文件。您可以将id_rsa.pub文件的内容添加到authorized_keys文件的末尾,并在必要时使用以下命令创建该文件:


在以下命令中,将 public_key_string 替换为您在本地系统上执行的 cat ~/.ssh/id_rsa.pub 命令的输出。它必须以 ssh-rsa AAAA... 开头。

echo public_key_string >> ~/.ssh/authorized_keys

我们现在可以尝试使用无密码身份验证访问我们的 Ubuntu 服务器。

第 3 步 - 使用 SSH 密钥向 Ubuntu 服务器进行身份验证

如果您已完成上述步骤之一,则您应该能够在没有远程帐户密码的情况下登录远程主机。

基本过程与我们上次使用时相同:

$ ssh username@remote_host

如果这是您第一次连接到该主机(如果您使用了上面的最后一种方法),您可能会看到如下内容:

Output

The authenticity of host '111.111.11.111 (111.111.11.111)' 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

如果出现这种情况,则表示您的本地计算机无法识别远程主机。输入“yes”,然后按 ENTER 继续。


如果您未提供私钥的密码,您将立即登录。如果您在创建密钥时提供了私钥的密码,系统将提示您立即输入(请注意,出于安全考虑,您的按键操作不会显示在终端会话中)。身份验证完成后,将打开一个新的 shell 会话,其中包含 Ubuntu 服务器上已配置的帐户。


如果基于密钥的身份验证成功,请继续了解如何通过禁用密码身份验证来进一步保护您的系统。


第 4 步 — 在服务器上禁用密码验证

如果您能够使用 SSH 无需密码登录您的帐户,则表示您已成功为您的帐户配置基于 SSH 密钥的身份验证。但是,基于密码的身份验证机制仍然处于活动状态,这意味着您的服务器仍然容易受到暴力攻击。


在完成本节中的步骤之前,请确保已为此服务器上的 root 帐户配置了基于 SSH 密钥的身份验证,或者最好为此服务器上具有 sudo 权限的非 root 帐户配置了基于 SSH 密钥的身份验证。此步骤将锁定基于密码的登录,因此确保您仍然能够获得管理访问权限至关重要。


确认远程帐户具有管理员权限后,请使用 SSH 密钥登录远程服务器(以 root 身份或具有 sudo 权限的帐户登录)。然后,打开 SSH 守护进程的配置文件:

sudo nano /etc/ssh/sshd_config

在文件中,搜索名为 PasswordAuthentication 的指令。该指令可能被注释掉了。取消注释该行,并将其值设置为“no”。这将禁用你使用账户密码通过 SSH 登录的功能:

/etc/ssh/sshd_config
...
PasswordAuthentication no
...

完成后按 CTRL + X 保存并关闭文件,然后按 Y 确认保存文件,最后按 ENTER 退出 nano。要实际实现这些更改,我们需要重新启动 sshd 服务:


$ sudo systemctl restart ssh

作为预防措施,在关闭此会话之前,打开一个新的终端窗口并测试 SSH 服务是否正常运行:

$ ssh username@remote_host

一旦验证了您的 SSH 服务,您就可以安全地关闭所有当前服务器会话。


您的 Ubuntu 服务器上的 SSH 守护进程现在仅响应 SSH 密钥。基于密码的身份验证已成功禁用。


结论


完成本教程后,您现在应该已经在服务器上配置了基于 SSH 密钥的身份验证,这允许您无需提供帐户密码即可登录。