如何在 Ubuntu 20.04 上设置 SSH 密钥

介绍

SSH 或安全外壳是一种加密协议,用于管理服务器并与服务器进行通信。在使用 Ubuntu 服务器时,您很可能将大部分时间花在通过 SSH 连接到服务器的终端会话中。

在本指南中,我们将重点介绍为 Ubuntu 20.04 安装设置 SSH 密钥。SSH 密钥提供了一种登录服务器的安全方式,建议所有用户使用。

步骤 1 — 创建密钥对

第一步是在客户端机器(通常是你的电脑)上创建一个密钥对:

  • ssh-keygen

默认情况下,最近版本的ssh-keygen将创建一个 3072 位 RSA 密钥对,这对于大多数用例来说足够安全(您可以选择传入-b 4096标志以创建更大的 4096 位密钥)。

输入命令后,您应该看到以下输出:

Output
Generating public/private rsa key pair. Enter file in which to save the key (/your_home/.ssh/id_rsa):

按 Enter 将密钥对保存到.ssh/主目录子目录中,或指定备用路径。

如果您之前已经生成了 SSH 密钥对,您可能会看到以下提示:

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

如果您选择覆盖磁盘上的密钥,您将无法再使用以前的密钥进行身份验证。选择是时要非常小心,因为这是一个无法逆转的破坏性过程。

然后您应该看到以下提示:

Output
Enter passphrase (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: SHA256:/hk7MJ5n5aiqdfTVUZr+2Qt+qCiS7BIm5Iv0dxrc3ks user@host The key's randomart image is: +---[RSA 3072]----+ | .| | + | | + | | . o . | |o S . o | | + o. .oo. .. .o| |o = oooooEo+ ...o| |.. o *o+=.*+o....| | =+=ooB=o.... | +----[SHA256]-----+

您现在拥有可用于进行身份验证的公钥和私钥。下一步是将公钥放在您的服务器上,以便您可以使用基于 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 '203.0.113.1 (203.0.113.1)' 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继续。

接下来,该实用程序将扫描您的本地帐户以查找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@203.0.113.1's password:

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

您应该看到以下输出:

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

此时,您的id_rsa.pub密钥已上传到远程帐户。您可以继续执行步骤 3

使用 SSH 复制公钥

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

我们可以通过使用cat命令读取本地计算机上公共 SSH 密钥的内容并通过 SSH 连接将其传送到远程服务器来完成此操作。

另一方面,我们可以确保该~/.ssh目录存在并且在我们使用的帐户下具有正确的权限。

然后,我们可以将通过管道传输的内容输出到authorized_keys该目录中调用的文件中我们将使用>>重定向符号来附加内容而不是覆盖它。这将让我们在不破坏先前添加的键的情况下添加键。

完整的命令如下所示:

  • cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"

您可能会看到以下消息:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' 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@203.0.113.1'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+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+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如有必要,请使用以下命令创建它:

  • echo public_key_string >> ~/.ssh/authorized_keys

在上述命令中,将 替换为您在本地系统上执行public_key_stringcat ~/.ssh/id_rsa.pub命令的输出它应该以ssh-rsa AAAA....

最后,我们将确保~/.ssh目录和authorized_keys文件具有适当的权限集:

  • chmod -R go= ~/.ssh

这将递归删除目录的所有“组”和“其他”权限~/.ssh/

如果您使用root帐户为用户帐户设置密钥,那么~/.ssh目录属于用户而不是root也很重要

  • chown -R sammy:sammy ~/.ssh

在本教程中,我们的用户名为sammy,但您应该将适当的用户名替换为上述命令。

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

第 3 步 — 使用 SSH 密钥对您的 Ubuntu 服务器进行身份验证

如果您已成功完成上述过程之一,您应该能够在提供远程帐户密码的情况下登录到远程主机

基本流程是一样的:

  • ssh username@remote_host

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

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' 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继续。

如果您没有为您的私钥提供密码,您将立即登录。如果您在创建密钥时为私钥提供了密码,系统将提示您现在输入它(请注意,您的击键不会显示在终端会话中以确保安全)。身份验证后,应该使用 Ubuntu 服务器上的配置帐户为您打开一个新的 shell 会话。

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

第 4 步 – 在您的服务器上禁用密码身份验证

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

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

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

  • sudo nano /etc/ssh/sshd_config

在文件中,搜索名为PasswordAuthentication. 该行可以用行首的 a 注释掉#通过删除 取消注释该行#,并将值设置为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 密钥的身份验证,允许您在不提供帐户密码的情况下登录。

如果您想了解有关使用 SSH 的更多信息,请查看我们的SSH Essentials Guide

觉得文章有用?

点个广告表达一下你的爱意吧 !😁