介绍
SSH或安全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密钥身份验证登录的服务器上安装公用密钥。
如何在创建服务器时嵌入公钥
在DigitalOcean控制面板上,在Droplet创建过程中,您可以选择将一个或多个公共SSH密钥添加到正在创建的Droplet。 对于FreeBSD的Droplet,这个公共SSH密钥将被安装在freebsd
用户,具有超级用户权限。
假设你创建在默认位置你的SSH密钥对,您的公共密钥位于~/.ssh/id_rsa.pub
。 公钥是你想要添加到新的Droplet。
在本地计算机上,输入此命令到终端以打印您的公共SSH密钥:
cat ~/.ssh/id_rsa.pub
现在通过DigitalOcean控制面板启动Droplet创建过程。 命名Droplet,使你的需要进行选择,直到你直接在“创建快捷批处理”按钮之前到达添加SSH密钥(可选)部分。
点击+添加SSH密钥的链接。 这将打开一个表单,将允许您添加您的公共SSH密钥。
在SSH密钥内容字段,粘贴您的SSH公钥的内容(从终端复制,并粘贴)。 您也可以通过使用注释(可选)字段的标记您的SSH密钥。 它看起来像这样:
现在,点击绿色的添加SSH密钥按钮的SSH密钥添加到您的帐户DigitalOcean。 将自动选择新添加的SSH(以蓝色突出显示),这表示它将添加到新Droplet中。 它应该看起来像这样:
现在,通过点击创建按钮Droplet完成Droplet创建过程。
所选的SSH密钥将被自动添加到freebsd
用户的帐户。 服务器启动时,您将能够为到服务器进行身份验证freebsd
通过使用相应的私钥的用户。
请注意,SSH密钥已添加到您的DigitalOcean帐户,现在可以添加到您在将来创建的任何Droplet,只需在Droplet创建过程中选择它。
如何将公钥复制到服务器
如果您已经有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密钥的身份验证。 但是,您的基于密码的身份验证机制仍处于活动状态,这意味着您的服务器仍然暴露在强力攻击之下。
在完成本节中的步骤之前,请确保您为此服务器上的根帐户配置了基于SSH密钥的身份验证,或者最好为具有sudo访问权的此服务器上的帐户配置基于SSH密钥的身份验证。 此步骤将锁定基于密码的登录,因此确保您仍然能够获得管理访问权限是至关重要的。
一旦上述条件为真,使用SSH密钥登录到远程服务器,以root身份或使用具有sudo权限的帐户登录。 打开SSH守护程序的配置文件:
sudo ee /etc/ssh/sshd_config
在文件中,找到一个名为指令ChallengeResponseAuthentication
。 它可以注释掉。 取消注释行,通过删除#
字符,然后将该值设置为“无”。 完成后应该看起来像这样:
ChallengeResponseAuthentication no
保存并关闭文件。 如果使用的是ee
,保存和按退出ESC
接着a
,然后a
试。
为使更改生效,必须重新启动sshd
服务。 要在FreeBSD上重新启动SSH守护程序,请使用以下命令:
sudo service sshd restart
现在,对服务器的任何SSH访问都必须使用SSH密钥认证,因为密码认证已禁用。
结论
您现在应该已经在FreeBSD服务器上启用和运行基于SSH密钥的身份验证,从而允许您在不提供用户密码的情况下登录。 从这里,您可能想了解有关保护FreeBSD服务器的更多信息。 如果您想了解更多有关SSH的工作,看看我们的SSH要点指南 。