介绍
SSH(Secure Shell)是一种网络协议,提供了一种安全、加密的方式来与服务器进行通信和管理。由于 SSH 是与 FreeBSD 服务器一起工作的最常见方式,您需要熟悉不同的身份验证和登录服务器的方式。虽然有几种登录 FreeBSD 服务器的方式,本教程将重点介绍设置和使用 SSH 密钥进行身份验证。
SSH 密钥的工作原理
SSH 服务器可以使用多种方法对客户端进行身份验证。最常见的方法包括密码和 SSH 密钥身份验证。虽然密码确实可以防止未经授权的访问,但使用 SSH 密钥通常更加安全。
密码的问题在于它们通常是手动创建的,长度不足或内容复杂度不够。因此,它们容易受到暴力攻击的威胁。SSH 密钥提供了一个可靠的安全替代方案。
SSH 密钥对可以用于身份验证,每个密钥对包括一个私钥和一个对应的公钥。
私钥类似于密码,保存在客户端计算机上。其内容必须保密——如果未经授权的人获取了您的私钥,应该视为已被泄露,并应立即更换。私钥通常至少为 2048 位长度,并且可以选择使用密码短语(基本上是需要使用私钥的密码)进行加密,以限制其在未经授权的人获取密钥的情况下的使用。
相关的公钥可以自由共享,没有任何负面影响。它可以用于加密只有私钥可以解密的消息——这是 SSH 密钥身份验证工作的基础。
为了启用私钥进行身份验证,相应的公钥被安装到远程服务器上用户的帐户中的一个特殊文件中,该文件称为 .ssh/authorized_keys
。当客户端尝试连接到远程服务器时,服务器可以验证客户端是否具有与授权密钥之一对应的私钥——如果私钥经过验证与授权公钥匹配,客户端将被验证,并启动一个 shell 会话。
如何创建 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 密钥身份验证登录的服务器上安装公钥。
如何将公钥复制到您的服务器
如果您已经拥有一个 FreeBSD 服务器,并且在创建过程中没有添加 SSH 密钥(如前一节所述),则有几种其他方法可以添加您的公钥并使用您的私钥对服务器进行身份验证。每种方法最终都会产生相同的结果,即能够使用您的 SSH 密钥对特定用户进行身份验证。请注意,您可以重复使用这些方法中的任何一个来安装多个 SSH 密钥(允许访问相应私钥的所有者)。
我们将描述几种不同的方法,从最简单的开始。只需使用您拥有工具并且最熟悉的方法。
使用 SSH-Copy-ID 复制您的公钥
如果您的本地计算机上有 ssh-copy-id
实用程序,您可以使用它轻松地将公共 SSH 密钥添加到您具有基于密码的 SSH 访问权限的远程服务器。ssh-copy-id
实用程序通常包含在 OpenSSH 软件包中(与提供 ssh
和 ssh-keygen
的软件包相同)。
要检查您的本地计算机上是否有该工具,只需尝试从命令行运行 ssh-copy-id
。如果不可用,您将收到“command not found”错误。如果您没有该实用程序可用,您可以尝试安装它,或者使用以下子部分中描述的其他方法之一。
要使用 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
文件中。
首先,登录到远程服务器。你可以使用以下命令通过 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 基础指南。