如何在Debian 11上设置SSH密钥

介绍

SSH,即安全外壳协议,是一种用于管理和与服务器通信的加密协议。在使用 Debian 服务器时,您很可能会大部分时间都在通过 SSH 连接到服务器的终端会话中工作。

在本指南中,我们将重点介绍为纯净的 Debian 11 安装设置 SSH 密钥。SSH 密钥提供了一种简单、安全的登录服务器的方式,建议所有用户使用。

步骤 1 —— 创建 RSA 密钥对

第一步是在客户端机器(通常是您的计算机)上创建密钥对:

  1. ssh-keygen

默认情况下 ssh-keygen 将创建一个 3072 位的 RSA 密钥对,这对于大多数用例来说已经足够安全了(您可以选择传入 -b 4096 标志来创建一个更大的 4096 位密钥)。

输入命令后,您应该会看到以下输出:

Output
Generating public/private rsa key pair. Enter file in which to save the key (/your_home/.ssh/id_rsa):

按回车键将密钥对保存到您的主目录中的 .ssh/ 子目录中,或者指定一个替代路径。

如果您之前已经生成过 SSH 密钥对,则可能会看到以下提示:

Output
/home/your_home/.ssh/id_rsa already exists. Overwrite (y/n)?

警告:如果您选择覆盖磁盘上的密钥,则将无法再使用先前的密钥进行身份验证。在选择是时要非常小心,因为这是一个不可逆转的破坏性过程。

然后,您应该会看到以下提示:

Output
Enter passphrase (empty for no passphrase):

在这里,您可以选择输入一个安全的口令,强烈建议这样做。口令添加了额外的安全层,防止未经授权的用户登录。要了解更多关于安全性的信息,请参阅我们的教程《如何在Linux服务器上配置SSH基于密钥的身份验证》。

然后,您应该会看到以下输出:

Output
Your 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: SHA256:5E2BtTN9FHPBNoRXAB/EdjtHNYOHzTBzG5qUv7S3hyM root@debian-suricata The key's randomart image is: +---[RSA 3072]----+ | oo .O^XB| | . +.BO%B| | . = .+B+o| | o o o . =.| | S . . =| | o.| | .o| | E o..| | . ..| +----[SHA256]-----+

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

步骤2 —— 将公钥复制到Debian服务器

将您的公钥快速复制到Debian主机的最简单方法是使用一个名为ssh-copy-id的实用程序。由于其简单性,如果可用的话,强烈推荐使用此方法。如果您的客户端机器上没有ssh-copy-id,您可以使用本节提供的两种备用方法之一(通过基于密码的SSH复制,或手动复制密钥)。

使用ssh-copy-id复制公钥

许多操作系统默认包含ssh-copy-id工具,因此您的本地系统可能已经安装了它。要使此方法有效,您必须已经具有基于密码的SSH访问权限到您的服务器。

要使用该实用程序,您只需指定要连接到的远程主机和您拥有密码SSH访问权限的用户帐户。这是要将您的公共SSH密钥复制到的帐户。

语法如下:

  1. ssh-copy-id username@remote_host

您可能会看到以下消息:

Output
The 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

这意味着您的本地计算机不认识远程主机。当您第一次连接到新主机时会发生这种情况。键入“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的文件中。

您应该会看到以下输出:

Output
Number 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 方法上传您的密钥。

我们可以通过使用cat命令读取本地计算机上的公共 SSH 密钥的内容,并通过 SSH 连接将其传输到远程服务器来实现此目的。

在另一端,我们可以确保~/.ssh目录存在并且在我们使用的帐户下具有正确的权限。

然后,我们可以将传输过来的内容输出到此目录中名为authorized_keys的文件中。我们将使用>>重定向符号来追加内容而不是覆盖它。这将使我们能够添加密钥而不会破坏先前添加的密钥。

完整的命令如下:

  1. cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"

您可能会看到以下消息:

Output
The 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

这意味着您的本地计算机不识别远程主机。这将在您首次连接到新主机时发生。输入“yes”并按ENTER继续。

之后,您应该会被提示输入远程用户帐户密码:

Output
username@203.0.113.1's password:

输入密码后,将会把您的id_rsa.pub密钥内容复制到远程用户帐户的authorized_keys文件的末尾。如果这一步成功,请继续进行步骤 3

手动复制公钥

如果您的服务器上没有基于密码的SSH访问权限,您将不得不手动完成上述过程。

我们将手动将您的id_rsa.pub文件内容追加到您远程计算机的~/.ssh/authorized_keys文件中。

要显示您的id_rsa.pub密钥内容,请在本地计算机上输入以下内容:

  1. cat ~/.ssh/id_rsa.pub

您将看到密钥的内容,应该类似于这样:

Output
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDgkLJ8d2gGEJCN7xdyVaDqk8qgeZqQ0MlfoPK3TzWI5dkG0WiZ16jrkiW/h6lhO9K1w89VDMnmNN9ULOWHrZMNs//Qyv/oN+FLIgK2CkKXRxTmbh/ZGnqOm3Zo2eU+QAmjb8hSsstQ3DiuGu8tbiWmsa3k3jKbWNWpXqY3Q88t+bM1DZrHwYzaIZ1BSA1ghqHCvIZqeP9IUL2l2DUfSCT9LXJEgMQhgjakJnzEGPgd5VHMR32rVrbIbbDzlyyoZ7SpCe5y0vYvbV2JKWI/8SEOmwehEHJ9RBZmciwc+1sdEcAJVMDujb9p5rX4hyvFpG0KGhZesB+/s7PdOa8zlIg4TZhXUHl4t1jpPC83Y9KEwS/Ni4dhaxlnr3T6l5hUX2cD+eWl1vVpogBqKNGBMrVR4dWs3Z4BVUf9exqTRRYOfgo0UckULqW5pmLW07JUuGo1kpFAxpDBPFWoPsg08CGRdEUS7ScRnMK1KdcH54kUZr0O88SZOsv9Zily/A5GyNM= demo@test

使用您可用的任何方法访问远程主机。

一旦您可以访问远程服务器上的帐户,您应该确保~/.ssh目录存在。如果需要,此命令将创建该目录,如果目录已存在,则不执行任何操作:

  1. mkdir -p ~/.ssh

现在,您可以在此目录中创建或修改authorized_keys文件。您可以使用以下命令将您的id_rsa.pub文件的内容添加到authorized_keys文件的末尾,如果需要的话可以创建它:

  1. echo public_key_string >> ~/.ssh/authorized_keys

在上述命令中,用public_key_string替换您在本地系统上执行的cat ~/.ssh/id_rsa.pub命令的输出。它应该以ssh-rsa AAAA...开头。

最后,我们将确保~/.ssh目录和authorized_keys文件具有适当的权限设置:

  1. chmod -R go= ~/.ssh

这将递归地删除~/.ssh/目录的所有“组”和“其他”权限。

如果您正在使用root帐户为用户帐户设置密钥,那么~/.ssh目录属于用户而不是root也很重要:

  1. chown -R sammy:sammy ~/.ssh

在本教程中,我们的用户名为sammy,但您应该将适当的用户名替换为上述命令。

现在,您可以尝试在Debian服务器上进行无密码身份验证。

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

如果您已成功完成以上任何一项操作,则应能够登录远程主机无需远程帐户密码。

一般的流程是一样的:

  1. ssh username@remote_host

如果这是您第一次连接到此主机(如果您使用了上述的最后一种方法),您可能会看到类似于以下内容:

Output
The 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

这意味着您的本地计算机不识别远程主机。输入“yes”,然后按 ENTER 继续。

如果您未为私钥提供密码短语,则将立即登录。如果您在创建密钥时为私钥提供了密码短语,则现在将提示您输入它(请注意,出于安全考虑,您的按键不会在终端会话中显示)。认证后,一个新的shell会话应该会为您打开,使用在Debian服务器上配置的帐户。

如果基于密钥的身份验证成功,请继续学习如何通过禁用密码身份验证来进一步保护您的系统。

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

如果您能够使用SSH登录您的帐户而无需密码,则已成功将基于SSH密钥的身份验证配置到您的帐户。但是,您的基于密码的身份验证机制仍然处于活动状态,这意味着您的服务器仍然容易受到暴力破解攻击的威胁。

在完成本节中的步骤之前,请确保您在此服务器上已配置了基于SSH密钥的身份验证,可以是root帐户,也可以是具有sudo特权的非root帐户。

一旦您确认您的远程帐户具有管理员特权,请使用SSH密钥登录到您的远程服务器,可以是作为root用户,也可以是具有sudo特权的帐户。然后,打开SSH守护程序的配置文件:

  1. sudo nano /etc/ssh/sshd_config

在文件内部,搜索名为PasswordAuthentication的指令。这可能被注释掉。取消注释该行并将值设置为“no”。这将禁用通过帐户密码通过SSH登录的能力:

/etc/ssh/sshd_config
...
PasswordAuthentication no
...

完成后保存并关闭文件,按CTRL + X,然后按Y确认保存文件,最后按ENTER退出nano。要实际实施这些更改,我们需要重新启动sshd服务:

  1. sudo systemctl restart ssh

作为预防措施,打开一个新的终端窗口,并在关闭此会话之前测试SSH服务是否正常运行:

  1. ssh username@remote_host

一旦您验证了SSH服务,您可以安全地关闭所有当前的服务器会话。

您的Debian服务器上的SSH守护程序现在仅响应SSH密钥。已成功禁用基于密码的身份验证。

结论

现在您应该已经在您的服务器上配置了基于SSH密钥的身份验证,这样您就可以在不提供帐户密码的情况下登录。

如果您想了解更多关于使用SSH的信息,请查看我们的SSH基本指南

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-debian-11