如何在Ubuntu18.04上设置SSH密钥
介绍
SSH 或安全外壳,是一种用于管理和与服务器通信的加密协议。 使用 Ubuntu 服务器时,您可能大部分时间都花在通过 SSH 连接到服务器的终端会话中。
在本指南中,我们将重点介绍为 Ubuntu 18.04 安装设置 SSH 密钥。 SSH 密钥提供了一种登录服务器的安全方式,建议所有用户使用。
第 1 步 — 创建 RSA 密钥对
第一步是在客户端计算机(通常是您的本地计算机)上创建一个密钥对:
ssh-keygen
默认情况下,ssh-keygen
将创建一个 2048 位 RSA 密钥对,这对于大多数用例来说足够安全(您可以选择传入 -b 4096
标志以创建更大的 4096 位密钥)。
输入命令后,您应该会收到以下输出:
OutputGenerating 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)?
如果您选择覆盖磁盘上的密钥,您将 而不是 能够再使用以前的密钥进行身份验证。 选择“是”时要非常小心,因为这是一个无法逆转的破坏性过程。
下一个提示将要求您输入安全密码:
OutputEnter passphrase (empty for no passphrase):
在这里,您可以选择输入安全密码,强烈建议您这样做。 密码短语增加了一层安全性,以防止未经授权的用户登录。 要了解有关安全性的更多信息,请参阅我们关于 如何在 Linux 服务器上配置基于 SSH 密钥的身份验证 的教程。
总之,ssh-keygen
命令将返回如下输出:
OutputYour 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 密钥的身份验证来登录。
- Step 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
您可能会收到以下消息:
OutputThe 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
的文件中。
您应该收到以下输出:
OutputNumber 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 方法上传您的密钥。 请记住,这仅在您对服务器具有基于密码的 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"
您可能会收到以下消息:
OutputThe 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
继续。
之后,应该会提示您输入远程用户帐户的密码:
Outputusername@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
这将在命令的输出中返回密钥的内容:
Outputssh-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
文件的末尾,必要时创建它。 对于此命令,将 public_key_string
替换为您在本地系统上执行的 cat ~/.ssh/id_rsa.pub
命令的输出。 它应该以 ssh-rsa AAAA...
开头:
echo public_key_string >> ~/.ssh/authorized_keys
最后,确保 ~/.ssh
目录和 authorized_keys
文件具有适当的权限设置:
chmod -R go= ~/.ssh
这会递归删除 ~/.ssh/
目录的所有“组”和“其他”权限。
如果您使用 root 帐户为用户帐户设置密钥,那么 ~/.ssh
目录属于用户而不是 root 也很重要。 在本教程中,我们的用户名为 sammy,但您应该将适当的用户名替换为以下命令:
chown -R sammy:sammy ~/.ssh
现在您可以尝试使用您的 Ubuntu 服务器进行无密码身份验证。
第 3 步 — 使用 SSH 密钥对 Ubuntu 服务器进行身份验证
如果您已成功完成步骤2中的步骤之一,您应该可以在没有远程帐户密码的情况下登录远程主机。
过程是一样的:
ssh username@remote_host
如果这是您第一次连接到此主机(如果您使用手动方法),您可能会收到如下信息:
OutputThe 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 密钥的身份验证,或者最好为某个服务器配置了基于 SSH 密钥的身份验证。此服务器上具有 sudo
权限的非 root 帐户。 此步骤将锁定基于密码的登录,确保您仍然能够获得管理访问权限是至关重要的。
一旦您确认您的远程帐户具有管理权限,请使用 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 密钥的身份验证,允许您在不提供帐户密码的情况下登录。
如果您想了解有关使用 SSH 的更多信息,请查看我们的 SSH 基础指南。