介绍
SSH 或安全外壳是一种网络协议,它提供了一种安全、加密的方式来与您的服务器通信和管理您的服务器。 由于 SSH 是使用 FreeBSD 服务器最常用的方式,因此您需要熟悉验证和登录服务器的不同方式。 虽然有多种登录 FreeBSD 服务器的方法,但本教程将重点介绍设置和使用 SSH 密钥进行身份验证。
SSH 密钥的工作原理
SSH 服务器可以使用多种方法对客户端进行身份验证。 最常见的方法包括密码和 SSH 密钥身份验证。 虽然密码确实为未经授权的访问提供了屏障,但使用 SSH 密钥通常更安全。
密码的问题在于它们通常是手动创建的,没有足够的长度或内容复杂性。 因此,它们很容易受到暴力攻击的影响。 SSH 密钥提供了一种可靠安全的替代方案。
SSH 密钥对可以代替密码进行认证,每个密钥对由一个私钥和一个对应的公钥组成。
私钥 的作用类似于密码,并保存在客户端计算机上。 它的内容必须保密——如果未经授权的人访问了您的私钥,则应将其视为已泄露并应立即更换。 私钥的长度通常至少为 2048 位,并且可以选择使用密码(基本上是使用私钥所需的密码)进行加密,以在未经授权的人访问密钥的情况下限制其使用。
关联的 公钥 可以自由共享,不会产生任何负面后果。 它可用于加密只有私钥才能解密的消息——这是 SSH 密钥身份验证工作的基础。
为了能够使用私钥进行身份验证,相应的公钥被安装到远程服务器上的用户帐户中。 必须将公钥添加到远程用户主目录中名为 .ssh/authorized_keys
的特殊文件中。 当客户端尝试连接到远程服务器时,服务器可以验证客户端是否具有与授权密钥之一相对应的私钥——如果验证私钥与授权公钥匹配,则客户端通过身份验证,并且外壳会话启动。
如何创建 SSH 密钥对
设置 SSH 密钥身份验证的第一步是在您的本地计算机上生成一个 SSH 密钥对,您将从该计算机登录。
要生成 SSH 密钥对,您可以使用 ssh-keygen
实用程序。 默认情况下,它将创建一个 2048 位的 RSA 密钥对,这对于大多数情况来说已经足够了。
在本地计算机的终端中,使用以下命令生成密钥对:
ssh-keygen
您将看到如下输出:
Generating public/private rsa key pair. Enter file in which to save the key (/home/username/.ssh/id_rsa):
在提示符下,您可以接受默认密钥位置或输入不同的路径。 如果您接受默认值,则密钥将存储在用户主目录中的 .ssh
目录中。 私钥将称为 id_rsa
,公钥将称为 id_rsa.pub
。
如果您刚刚开始使用 SSH 密钥,最好坚持使用默认位置。 这样做将允许您的 SSH 客户端在尝试进行身份验证时自动找到您的 SSH 密钥。 如果您想选择非标准路径,请立即输入,否则,将提示留空并按 RETURN
接受默认值。
如果您之前生成了 SSH 密钥对,您可能会看到如下提示:
/home/username/.ssh/id_rsa already exists. Overwrite (y/n)?
如果您选择覆盖现有密钥,它将被删除,您将无法再使用它进行身份验证。 也就是说,除非您确定不需要它来对任何服务器进行身份验证,否则不应覆盖它。
此时,您应该会看到输入密码的提示:
Created directory '/home/username/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again:
此可选密码用于加密私钥。 如果您在此处设置密码短语,则每当您使用私钥进行身份验证时都需要它 - 即,身份验证将需要私钥 和 其密码,如果私钥是,则可以提供额外的安全性以某种方式妥协。 如果您将密码留空,您将能够在没有 密码 的情况下使用私钥登录您的服务器——也就是说,身份验证将仅基于您的私钥进行,因此请务必保留您的密钥安全。
在此之后,您将看到以下输出,它将告诉您在哪里创建了私钥和公钥,以及其他详细信息:
Your identification has been saved in /home/sammy/.ssh/id_rsa. Your public key has been saved in /home/sammy/.ssh/id_rsa.pub. The key fingerprint is: 76:e2:bc:19:18:b3:35:59:f4:54:b9:d3:bc:d0:56:a1 username@localcomputer The key's randomart image is: +--[ RSA 2048]----+ | . ...o.| | . o o .| | . .E.+.| | o .ooo| | o S . o..| | X + . | | o + | | + | | o | +-----------------+
现在您已经拥有了一个公共和私有 SSH 密钥对,您需要在要使用 SSH 密钥身份验证登录的服务器上安装公共密钥。
创建服务器时如何嵌入公钥
在 DigitalOcean 控制面板上,在液滴创建过程中,您可以选择向正在创建的液滴添加一个或多个公共 SSH 密钥。 对于 FreeBSD droplet,此公共 SSH 密钥将安装在具有超级用户权限的 freebsd
用户上。
假设您在默认位置创建了 SSH 密钥对,您的公钥位于 ~/.ssh/id_rsa.pub
。 公钥是您要添加到新液滴的内容。
在您的本地计算机上,在终端中输入以下命令以打印您的公共 SSH 密钥:
cat ~/.ssh/id_rsa.pub
现在通过 DigitalOcean 控制面板开始液滴创建过程。 为 droplet 命名,并进行所需的选择,直到进入 Add SSH Keys (Optional) 部分,就在“Create Droplet”按钮之前。
单击 +添加 SSH 密钥 链接。 这将打开一个表单,允许您添加公共 SSH 密钥。
在 SSH Key content 字段中,粘贴您的公共 SSH 密钥的内容(从您的终端复制并粘贴)。 您还可以使用 Comment (optional) 字段来标记您的 SSH 密钥。 它看起来像这样:
现在单击绿色的 Add SSH Key 按钮将公共 SSH 密钥添加到您的 DigitalOcean 帐户。 新添加的 SSH 将被自动选中(以蓝色突出显示),表示它将被添加到新的 droplet 中。 它应该如下所示:
现在通过单击 Create Droplet 按钮完成液滴创建过程。
所选的 SSH 密钥将自动添加到 freebsd
用户的帐户中。 当服务器启动时,您将能够使用相应的私钥以 freebsd
用户身份向服务器进行身份验证。
请注意,SSH 密钥已添加到您的 DigitalOcean 帐户中,现在只需在液滴创建过程中选择它即可将其添加到您将来创建的任何液滴中。
如何将公钥复制到您的服务器
如果您已经有一个 FreeBSD 服务器并且在创建过程中没有向其添加 SSH 密钥(如上一节所述),那么还有一些其他方法可以添加您的公钥并使用您的私钥对您的服务器进行身份验证. 每种方法最终都会得到相同的结果,即使用您的 SSH 密钥对对服务器上的特定用户进行身份验证的能力。 请注意,您可以重复这些方法中的任何一种来安装多个 SSH 密钥(允许访问任何相应私钥的所有者)。
我们将描述几种不同的方法,从最简单的开始。 只需使用您拥有工具且最熟悉的方法即可。
使用 SSH-Copy-ID 复制您的公钥
如果您的本地计算机上有 ssh-copy-id
实用程序,您可以使用它轻松地将公共 SSH 密钥添加到您具有基于密码的 SSH 访问权限的远程服务器。 ssh-copy-id
实用程序通常但不总是包含在 OpenSSH 包中(提供 ssh
和 ssh-keygen
的同一包)。
要检查本地计算机上是否有该工具,只需尝试从命令行运行 ssh-copy-id
。 如果它不可用,您将收到“找不到命令”错误。 如果您没有可用的实用程序,您可以安装尝试安装它或使用以下小节中描述的其他方法之一。
要使用 ssh-copy-id
,您必须指定远程主机的 IP 地址或域名,以及要添加公共 SSH 密钥的用户。 它可以像这样运行(用适当的信息替换突出显示的部分):
ssh-copy-id username@remote_host
您可能会看到这样的消息:
The authenticity of host '111.222.11.222 (111.222.11.222)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ab:e6:6d:12:fe. Are you sure you want to continue connecting (yes/no)? yes
这意味着您的本地计算机无法识别远程服务器,因为它之前从未尝试使用 SSH 连接到它。 使用 yes
响应提示,然后按 RETURN
继续。
该实用程序将扫描您的本地用户帐户以查找您之前创建的公钥 id_rsa.pub
。 找到后,将提示您输入远程服务器上用户的密码:
/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.222.11.222's password:
输入密码,然后点击RETURN
。 该实用程序将连接到远程主机上的用户帐户并安装您的公钥 id_rsa.pub
。 通过将公钥的内容复制到远程用户主目录中名为 .ssh/authorized_keys
的文件中来安装密钥。
如果复制成功,您将看到如下输出:
Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'username@111.222.11.222'" and check to make sure that only the key(s) you wanted were added.
由于您的公钥安装在远程用户的 authorized_keys
文件中,相应的私钥(本地计算机上的 id_rsa
)将被接受为远程服务器上用户的身份验证。
继续 使用 SSH 密钥对您的服务器进行身份验证 部分,使用 SSH 密钥登录到您的服务器。
使用 SSH 复制您的公钥
如果您的本地计算机上没有 ssh-copy-id
,但您对服务器具有基于密码的 SSH 访问权限,则可以使用 SSH 客户端安装您的公钥。
此方法通过在本地计算机上输出公共 SSH 密钥并通过 SSH 管道 将其输出到删除服务器。 在远程服务器上,我们执行几个命令来创建 ~/.ssh
目录(如果它不存在),然后将公钥添加到名为 authorized_keys
的文件中。 我们将使用 >>
重定向将密钥附加到 authorized_keys
文件,如果它已经存在,以防远程用户的帐户上已经安装了任何公共 SSH 密钥(所以它们不会被作为授权密钥被覆盖并删除)。
假设您的公钥具有默认名称 id_rsa.pub
,以下是安装公钥 SSH 密钥的命令(替换远程用户和主机):
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
您可能会看到这样的消息:
The authenticity of host '111.222.11.222 (111.222.11.222)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ab:e6:6d:12:fe. Are you sure you want to continue connecting (yes/no)? yes
这意味着您的本地计算机无法识别远程服务器,因为它之前从未尝试使用 SSH 连接到它。 使用 yes
响应提示,然后按 RETURN
继续。
现在将提示您输入远程用户的密码:
username@111.222.11.222's password:
输入密码,然后点击RETURN
。 如果命令执行成功,您将不会收到任何反馈。 您的公钥 id_rsa.pub
的内容将附加到远程用户的 authorized_keys
文件的末尾。
继续 使用 SSH 密钥对您的服务器进行身份验证 部分,使用 SSH 密钥登录到您的服务器。
手动复制您的公钥
如果您希望手动安装公钥,您可以使用 SSH 或控制台访问来执行此操作。 您将需要以要安装公钥的用户身份登录远程服务器。
基本过程是获取您的公共 SSH 密钥,即 id_rsa.pub
的内容,并将其添加到远程主机上用户主目录中的 .ssh/authorized_keys
文件中。
首先,登录到远程服务器。 如果您没有使用 DigitalOcean 控制面板中的控制台,请使用以下命令通过 SSH 连接:
ssh username@remote_host
您可能会看到这样的消息:
The authenticity of host '111.222.11.222 (111.222.11.222)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ab:e6:6d:12:fe. Are you sure you want to continue connecting (yes/no)? yes
这意味着您的本地计算机无法识别远程服务器,因为它之前从未尝试使用 SSH 连接到它。 使用 yes
响应提示,然后按 RETURN
继续。
现在将提示您输入远程用户的密码:
Password for username@111.222.11.222:
现在您应该在远程用户的主目录中创建一个 .ssh
目录,如果它不存在的话。 此命令将执行此操作:
mkdir -p ~/.ssh
在您的 本地计算机 上,在终端中输入此命令以打印您的公共 SSH 密钥:
cat ~/.ssh/id_rsa.pub
将输出复制到剪贴板,然后在您选择的文本编辑器中打开 authorized_keys
文件。 我们将在这里使用 ee
:
ee ~/.ssh/authorized_keys
将您的公钥粘贴到 authorized_keys
文件中,然后保存并退出。 如果您正在使用 ee
,请按 ESC
然后按 a
然后再按 a
保存并退出。
您的公共 SSH 密钥现已安装在远程服务器上。 继续下一部分以使用 SSH 密钥登录到您的服务器。
使用 SSH 密钥对您的服务器进行身份验证
如果您已使用上述方法之一在 FreeBSD 服务器上成功安装了公共 SSH 密钥,您应该能够使用密钥身份验证登录服务器。 也就是说,您将不再需要远程用户的密码来登录。
尝试使用 SSH 登录远程服务器:
ssh username@remote_host
如果您没有使用密码创建 SSH 密钥对,您将立即登录。 如果您使用密码创建了密钥对,系统将提示您输入密码。
如果您已登录到您的服务器,这意味着 SSH 密钥已成功安装。
请注意,现在为此用户启用了密码和基于密钥的身份验证。 如果您想为您的服务器禁用密码验证,通过要求 SSH 密钥登录使其更安全,请阅读下一节。
在您的服务器上禁用密码验证
如果您能够在没有密码的情况下使用 SSH 登录您的帐户,则您已成功为您的帐户配置了基于 SSH 密钥的身份验证。 但是,您的基于密码的身份验证机制仍然处于活动状态,这意味着您的服务器仍然面临暴力攻击。
在完成本节中的步骤之前,请确保您为此服务器上的 root 帐户配置了基于 SSH 密钥的身份验证,或者最好为该服务器上的具有 sudo 访问权限的帐户配置了基于 SSH 密钥的身份验证。 此步骤将锁定基于密码的登录,因此确保您仍然能够获得管理访问权限至关重要。
满足上述条件后,使用 SSH 密钥登录远程服务器,以 root 身份或具有 sudo 权限的帐户。 打开 SSH 守护进程的配置文件:
sudo ee /etc/ssh/sshd_config
在文件中,找到一个名为 ChallengeResponseAuthentication
的指令。 可能会被注释掉。 通过删除 #
字符取消注释该行,然后将值设置为“no”。 完成后应该是这样的:
ChallengeResponseAuthentication no
保存并关闭文件。 如果您正在使用 ee
,请按 ESC
然后按 a
然后再按 a
保存并退出。
要使更改生效,您必须重新启动 sshd
服务。 要在 FreeBSD 上重新启动 SSH 守护程序,请使用以下命令:
sudo service sshd restart
现在任何对服务器的 SSH 访问都必须使用 SSH 密钥身份验证,因为密码身份验证已被禁用。
结论
您现在应该在 FreeBSD 服务器上启动并运行基于 SSH 密钥的身份验证,允许您在不提供用户密码的情况下登录。 从这里,您可能想了解更多关于保护您的 FreeBSD 服务器的信息。 如果您想了解有关使用 SSH 的更多信息,请查看我们的 SSH 基本指南 。