如何在 Ubuntu 18.04 上设置 SSH 密钥

介绍

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

在本指南中,我们将专注于为 Ubuntu 18.04 安装设置 SSH 密钥。

步骤1:创建 RSA 密钥对

第一步是在客户端机器(通常是本地计算机)上创建一个密钥对:

1[environment local]
2ssh-keygen

默认情况下,ssh-keygen 会创建一个 2048 位 RSA 密钥对,这对于大多数用例来说是足够安全的(您可以选择通过 `-b 4096' 旗帜创建一个更大的 4096 位密钥)。

输入命令后,您将收到以下输出:

1[environment local]
2[secondary_label Output]
3Generating public/private rsa key pair.
4Enter file in which to save the key (/your_home/.ssh/id_rsa):

ENTER,将密钥对保存到您的主目录中的.ssh/子目录中,或指定替代路径。

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

1[environment local]
2[secondary_label Output]
3/home/your_home/.ssh/id_rsa already exists.
4Overwrite (y/n)?

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

下一个提示将要求您输入一个安全的密码:

1[environment local]
2[secondary_label Output]
3Enter passphrase (empty for no passphrase):

在这里,您可以选择输入安全密码,这是非常建议的。 密码添加了一层安全性,以防止未经授权的用户登录。 有关安全性的更多信息,请参阅我们的教程 如何在 Linux 服务器上配置 SSH 基于密钥的身份验证

总之,ssh-keygen命令将返回如下输出:

 1[environment local]
 2[secondary_label Output]
 3Your identification has been saved in /your_home/.ssh/id_rsa.
 4Your public key has been saved in /your_home/.ssh/id_rsa.pub.
 5The key fingerprint is:
 6a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
 7The key's randomart image is:
 8+--[ RSA 2048]----+
 9|     ..o         |
10|   E o= .        |
11|    o. o         |
12|        ..       |
13|      ..S        |
14|     o o.        |
15|   =o.+.         |
16|. =++..          |
17|o=++.            |
18+-----------------+

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

步骤 2 – 将公共密钥复制到 Ubuntu 服务器

最快的方法来将您的公共密钥复制到Ubuntu主机是使用一个名为ssh-copy-id的实用程序. 由于其简单性,这种方法在可用的情况下非常建议。 如果您在客户端机上没有ssh-copy-id,您可以使用本节提供的两种替代方法之一(通过基于密码的SSH复制或手动复制密钥)。

使用ssh-copy-id复制公共密钥

ssh-copy-id工具默认包含在许多操作系统中,因此您可以在本地系统上使用它。

<$>[注] 注: 要使此方法工作,您必须已经有基于密码的 SSH 访问到您的服务器。

要使用该实用程序,您可以指定您想要连接的远程主机和您有基于密码的 SSH 访问权限的用户帐户。

语法如下:

1ssh-copy-id username@remote_host

你可能會收到以下訊息:

1[environment local]
2[secondary_label Output]
3The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.
4ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
5Are you sure you want to continue connecting (yes/no)? yes

这意味着您的本地计算机无法识别远程主机,这将发生在您第一次连接到新主机时。

接下来,该实用程序将扫描您的本地帐户以获取您之前创建的 id_rsa.pub 密钥.当它找到密钥时,它将提示您查找远程用户帐户的密码:

1[environment local]
2[secondary_label Output]
3/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
4/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
5[email protected]'s password:

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

你应该得到以下的输出:

1[environment local]
2[secondary_label Output]
3Number of key(s) added: 1
4
5Now try logging into the machine, with:   "ssh '[email protected]'"
6and 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的文件中。 使用>>重定向符号来附加内容,而不是重写内容。

完整的命令显示如下:

1[environment local]
2cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"

你可能會收到以下訊息:

1[environment local]
2[secondary_label Output]
3The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.
4ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
5Are you sure you want to continue connecting (yes/no)? yes

这意味着您的本地计算机无法识别远程主机,这将发生在您第一次连接到新主机时。

之后,您应该被要求输入远程用户帐户的密码:

1[environment local]
2[secondary_label Output]
3[email protected]'s password:

输入密码后,你的 id_rsa.pub 密钥的内容将被复制到远程用户帐户的 authorized_keys 文件的末尾。

手动复制公共密钥

如果您没有基于密码的 SSH 访问到您的服务器,您将不得不手动完成该过程。

本节概述了如何手动将您的 id_rsa.pub 文件的内容附加到远程计算机上的 ~/.ssh/authorized_keys 文件中。

要显示您的 id_rsa.pub 内容,在本地计算机上运行以下命令:

1[environment local]
2cat ~/.ssh/id_rsa.pub

这将返回命令输出中的密钥的内容:

1[environment local]
2[secondary_label Output]
3ssh-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目录存在,如果有必要,这个命令将创建目录,或者如果它已经存在的话,不要做任何事情:

1mkdir -p ~/.ssh

现在你可以创建或修改这个目录中的authorized_keys文件. 你可以将你的id_rsa.pub文件的内容添加到authorized_keys文件的末尾,如果需要,创建它。 对于这个命令,用你在本地系统上执行的cat ~/.ssh/id_rsa.pub命令的输出代替public_key_string。 它应该从ssh-rsa AAAA...开始:

1echo public_key_string >> ~/.ssh/authorized_keys

最后,确保~/.ssh目录和autorized_keys文件具有相应的权限设置:

1chmod -R go= ~/.ssh

这会反复删除对 ~/.ssh/ 目录的所有其他权限。

如果您正在使用 root帐户为用户帐户设置密钥,则重要的是~/.ssh目录属于用户,而不是 root

1chown -R sammy:sammy ~/.ssh

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

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

如果您成功完成了 步骤 2中的程序之一,则您应该能够登录远程主机 without 远程帐户的密码。

过程是相同的:

1[environment local]
2ssh username@remote_host

如果这是您第一次连接到此主机(如果您使用了手动方法),您可能会收到这样的东西:

1[environment local]
2[secondary_label Output]
3The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.
4ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
5Are you sure you want to continue connecting (yes/no)? yes

这意味着您的本地计算机无法识别远程主机,然后键入,然后按ENTER继续。

如果您在创建密钥时没有为您的私钥提供一个密码,您将立即登录。 如果您在创建密钥时为私钥提供了密码,您将被要求输入它(请注意,您的密钥打击不会出现在终端会话中以确保安全性)。

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

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

如果您能够在没有密码的情况下使用 SSH 登录帐户,则已成功配置 SSH 基于密钥的身份验证到您的帐户,但是,您的基于密码的身份验证机制仍然活跃,这意味着您的服务器仍然受到暴力攻击。

在完成本节中的步骤之前,请确保您已为此服务器上的 root帐户配置了基于 SSH 密钥的身份验证,或者最好是为此服务器上的非root帐户配置了基于 SSH 的身份验证,具有sudo权限。

一旦您确认您的远程帐户具有管理权限,请使用 SSH 密钥登录您的远程服务器,无论是作为 root,还是使用具有sudo权限的帐户。

1sudo nano /etc/ssh/sshd_config

在文件中,搜索一个名为PasswordAuthentication的指令。这可能会被评论为#在行开始时。 通过删除#删除行,并将值设置为

1[label /etc/ssh/sshd_config]
2...
3PasswordAuthentication no
4...

当您完成时,将文件保存并关闭,按CTRL + X,然后按YENTER,以退出nano

1sudo systemctl restart ssh

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

1[environment local]
2ssh username@remote_host

一旦您确认您的 SSH 服务正常运行,您可以安全地关闭所有当前的服务器会话。

您的 Ubuntu 服务器上的 SSH 示威器现在只响应基于 SSH 密钥的身份验证,并禁用了基于密码的身份验证。

结论

您现在应该在您的服务器上配置基于 SSH 密钥的身份验证,允许您在不提供帐户密码的情况下登录。

如果您想了解有关使用 SSH 的更多信息,请参阅我们的 SSH 基本指南

Published At
Categories with 技术
comments powered by Disqus