如何在 Linux 服务器上配置基于 SSH 密钥的身份验证

介绍

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

虽然有几种不同的方式来登录SSH服务器,但在本指南中,我们将专注于设置SSH密钥。

<$>[info] 简化部署应用程序到服务器与 DigitalOcean App Platform. 在几分钟内直接部署从GitHub。

SSH 密钥如何工作?

SSH服务器可以使用各种不同的方法验证客户端,其中最基本的是密码验证,易于使用,但不是最安全的。

虽然密码以安全的方式发送到服务器上,但密码一般并不复杂或足够长,无法抵抗反复不断的攻击. 现代的处理能力与自动化脚本相结合,使得野蛮地强制使用密码保护的账户变得非常可能. 虽然还有其他增加安全性的方法(fail2ban等),但SSH密钥被证明是一个可靠和安全的替代.

SSH 密钥对是两个加密安全密钥,可以用来验证客户端到 SSH 服务器,每个密钥对由一个公共密钥和一个私钥组成。

隐私密钥由客户端保留,应该保持绝对秘密. 任何对隐私密钥的妥协将允许攻击者在没有额外身份验证的情况下登录与相关公共密钥配置的服务器。

相关的公共密钥可以自由共享,无需任何负面后果。 公共密钥可以用来加密信息,只有私钥才能解密。

公共密钥被上传到您希望能够使用 SSH 登录的远程服务器上,该密钥被添加到您正在登录的用户帐户内的特殊文件中,称为 ~/.ssh/authorized_keys

当客户端尝试使用 SSH 密钥进行身份验证时,服务器可以测试客户端是否拥有私钥,如果客户端可以证明其拥有私钥,则生成 shell 会话或执行所要求的命令。

第1步:创建SSH密钥

将 SSH 密钥验证配置到您的服务器的第一步是在本地计算机上生成一个 SSH 密钥对。

为了做到这一点,我们可以使用一个名为ssh-keygen的特殊实用程序,该实用程序包含了标准的OpenSSH工具套件,默认情况下,这将创建一个3072位RSA密钥对。

在本地计算机上,通过键入生成一个SSH密钥对:

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

该实用程序将提示您为将生成的密钥选择一个位置. 默认情况下,密钥将存储在用户主目录中的~/.ssh目录中。

通常情况下,最好在这个阶段保持默认位置。这样做将允许您的SSH客户端在尝试验证时自动找到您的SSH密钥。如果您想选择非默认路径,请现在输入,否则按ENTER来接受默认。

如果您之前已经生成了一个 SSH 密钥对,您可能会看到一个提示,看起来像这样:

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

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

1[secondary_label Output]
2[environment local]
3Created directory '/home/username/.ssh'.
4Enter passphrase (empty for no passphrase):
5Enter same passphrase again:

接下来,您将被要求输入密钥的密码,这是一个可选的密码,可以用来加密磁盘上的私钥文件。

您可能想知道SSH密钥提供哪些优点,如果您仍然需要输入密码。

  • 联合国 私人SSH密钥(可以被密码句保护的部分)在网络上从未被曝光. 密码句只用于解密本地机上的密钥. 这意味着基于网络的野蛮强迫是无法对抗密码句的.
  • 联合国 私钥保存在一个限制性目录中. SSH 客户端将不会识别未保存在受限制目录中的私钥. 密钥本身也必须拥有受限权限(仅供所有者阅读和写入). 这意味着系统上的其他用户不能窥探.
  • 联合国 任何希望破解私密SSH密钥密码句的攻击者,都必须已经可以进入系统. 这意味着他们已经可以访问您的用户账户或根账户 。 如果您处于此位置, 密码句可以阻止攻击者立即登录到您的其他服务器 。 希望这能让你有时间创建并实施一个新的SSH密钥对,并去除被损坏密钥的存取. .

由于私钥从未暴露在网络中,并且通过文件权限受到保护,因此此文件绝不能被您(以及 root 用户)访问。

如果您输入一个,您将不得不每次使用此密钥时提供它(除非您正在运行存储解密密钥的SSH代理软件)。

 1[secondary_label Output]
 2[environment local]
 3Your identification has been saved in /home/username/.ssh/id_rsa.
 4Your public key has been saved in /home/username/.ssh/id_rsa.pub.
 5The key fingerprint is:
 6SHA256:CAjsV9M/tt5skazroTc1ZRGCBz+kGtYUIPhRvvZJYBs username@hostname
 7The key's randomart image is:
 8+---[RSA 3072]----+
 9|o   ..oo.++o ..  |
10| o o +o.o.+...   |
11|. . + oE.o.o  .  |
12| . . oo.B+  .o   |
13|  .   .=S.+ +    |
14|      . o..*     |
15|        .+= o    |
16|        .=.+     |
17|       .oo+      |
18+----[SHA256]-----+

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

第2步:将SSH公共密钥复制到您的服务器

<$>[info] 注: 本教程的早期版本有指示将SSH公共密钥添加到您的DigitalOcean帐户中。这些指示现在可以在我们的DigitalOcean产品文档的 _SSH Keys_部分(https://docs.digitalocean.com/products/droplets/how-to/add-ssh-keys/)。

您可以通过多种方式将公共密钥上传到远程 SSH 服务器,而您使用的方法主要取决于您所拥有的工具和当前配置的细节。

下列方法都产生相同的最终结果. 最简单、最自动的方法首先被描述,并且随之而来的方法需要额外的手动步骤. 您只应遵循这些步骤,如果您无法使用前面的方法。

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

将您的公共密钥复制到现有服务器的最简单的方法是使用一个名为ssh-copy-id的实用程序。

ssh-copy-id工具在许多发行版中包含在OpenSSH包中,因此您可能已经在本地系统上使用了它。

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

语法是:

1[environment local]
2ssh-copy-id username@remote_host

你可能会看到这样的信息:

1[secondary_label Output]
2[environment local]
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[secondary_label Output]
2[environment local]
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[secondary_label Output]
2[environment local]
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 密钥已上传到远程帐户中,您可以继续进入下一节。

使用 SSH 复制您的公共密钥

如果您没有可用的ssh-copy-id,但您有基于密码的 SSH 访问您的服务器上的帐户,您可以使用传统的 SSH 方法上传您的密钥。

我们可以通过在本地计算机上输出我们的公共 SSH 密钥的内容,并通过 SSH 连接到远程服务器来输出它。

我们将使用>>重定向符号添加内容,而不是重写它,这将允许我们添加密钥而不会破坏之前添加的密钥。

整个命令将是这样的:

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

你可能会看到这样的信息:

1[secondary_label Output]
2[environment local]
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[secondary_label Output]
2[environment local]
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[label ~/.ssh/id_rsa.pub]
2[environment local]
3ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== username@hostname

使用您可用的任何方法访问您的远程主机,这可能是基础设施提供商提供的基于 Web 的控制台。

注意:如果您正在使用DigitalOcean Droplet,请参阅我们的DigitalOcean产品文件中的恢复控制台文档(https://docs.digitalocean.com/products/droplets/resources/recovery-console/)。

一旦你在远程服务器上访问了你的帐户,你应该确保创建了~/.ssh目录,如果有必要,这个命令将创建目录,或者如果它已经存在的话,不要做任何事情:

1mkdir -p ~/.ssh

现在,您可以在该目录中创建或修改authorized_keys文件. 您可以将您的id_rsa.pub文件的内容添加到authorized_keys文件的末尾,必要时使用以下方式创建它:

1echo public_key_string >> ~/.ssh/authorized_keys

在上述命令中,用您在本地系统上执行的cat ~/.ssh/id_rsa.pub命令的输出代替public_key_string

如果这有效,您可以继续测试新的基于密钥的 SSH 身份验证。

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

如果您已成功完成上述程序之一,您应该能够登录远程主机 without 远程帐户的密码。

过程大多是相同的:

1[environment local]
2ssh username@remote_host

如果这是你第一次连接到这个主机(如果你使用了上面的最后一种方法),你可能会看到这样的东西:

1[secondary_label Output]
2[environment local]
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

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

如果您没有为您的私钥提供密码,您将立即登录。如果您在创建密钥时为私钥提供密码,您将被要求现在输入密码。

如果成功,继续了解如何锁定服务器。

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

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

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

一旦上述条件是真实的,请使用SSH密钥登录您的远程服务器,无论是作为 root 或具有sudo特权的帐户。

1sudo nano /etc/ssh/sshd_config

在檔案內,尋找名為「PasswordAuthentication」的指令。這可能會被評論出來. 通過在行開始時刪除任何「# 」並將該值設定為「不」。

1[label /etc/ssh/sshd_config]
2PasswordAuthentication no

完成后保存并关闭文件. 要实际执行我们刚刚做的更改,您必须重新启动服务。

在大多数Linux发行版中,您可以发出以下命令:

1sudo systemctl restart ssh

完成此步骤后,您已成功过渡到您的 SSH 对象,只响应 SSH 密钥。

结论

您现在应该在您的服务器上配置并运行基于 SSH 密钥的身份验证,允许您在不提供帐户密码的情况下登录。从这里开始,您可以前往许多方向。如果您想了解更多有关使用 SSH 的信息,请参阅我们的 SSH 基本指南

Published At
Categories with 技术
comments powered by Disqus