如何在Debian 9上设置SSH密钥

介绍

SSH或安全shell是用于管理服务器和与服务器通信的加密协议。使用Debian服务器时,您可能会将大部分时间花在通过SSH连接到服务器的终端会话中。

在本教程中,我们将专注于为vanilla 9安装设置SSH密钥。SSH密钥提供了一种简单,安全的登录服务器的方式,建议所有用户使用。

要完成本教程,您需要具备一台已经设置好可以使用sudo命令的非root账号的Debian服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

步骤1 - 创建RSA密钥对

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

ssh-keygen

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

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

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

按Enter键将密钥对保存到主目录的.ssh/子目录中,或指定备用路径。

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

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

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

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

Enter passphrase (empty for no passphrase):

在这里,您可以选择输入安全密码,强烈建议您使用。密码短语增加了额外的安全层,以防止未经授权的用户登录。

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

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:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
The key's randomart image is:
+--[ RSA 2048]----+
|     ..o         |
|   E o= .        |
|    o. o         |
|        ..       |
|      ..S        |
|     o o.        |
|   =o.+.         |
|. =++..          |
|o=++.            |
+-----------------+

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

第2步 - 将公钥复制到Debian服务器

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

使用复制公钥 ssh-copy-id

默认情况下,ssh-copy-id工具包含在许多操作系统中,因此您可以在本地系统上使用该工具。要使此方法起作用,您必须已对服务器进行基于密码的SSH访问。

要使用该实用程序,只需指定要连接的远程主机以及具有SSH访问密码的用户帐户即可。这是您的公共SSH密钥将被复制到的帐户。

语法是:

ssh-copy-id username@remote_host

您可能会看到以下消息:

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

这意味着您的本地计算机无法识别远程主机。这将在您第一次连接到新主机时发生。输入“是”,然后按ENTER继续。

接下来,该实用程序将扫描您的本地帐户以查找我们之前创建的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@203.0.113.1's password:

输入密码(出于安全目的,不会显示您的输入内容),然后按ENTER。该实用程序将使用您提供的密码连接到远程主机上的帐户。然后,它会将~/.ssh/id_rsa.pub密钥的内容复制到远程帐户主~/.ssh目录中的文件authorized_keys中。

您应该看到以下输出:

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中。我们将使用>>重定向符号来附加内容而不是覆盖它。这将让我们添加键而不会破坏以前添加的键。

完整命令如下所示:

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

您可能会看到以下消息:

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

这意味着您的本地计算机无法识别远程主机。这将在您第一次连接到新主机时发生。输入“是”,然后按ENTER继续。

之后,系统会提示您输入远程用户帐户密码:

username@203.0.113.1's password:

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

手动复制公钥

如果您没有可用的基于密码的SSH访问服务器,则必须手动完成上述过程。

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

要显示id_rsa.pub密钥的内容,请在本地计算机中键入:

cat ~/.ssh/id_rsa.pub

您将看到密钥的内容,其内容应如下所示:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

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

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

mkdir -p ~/.ssh

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

echo public_key_string >> ~/.ssh/authorized_keys

在上面的命令中,将替换为public_key_string在本地系统上执行的cat ~/.ssh/id_rsa.pub命令的输出。它应该从ssh-rsa AAAA...开始。

最后,我们将确保~/.ssh目录和authorized_keys文件具有相应的权限集:

chmod -R go= ~/.ssh

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

如果您使用root帐户为用户帐户设置密钥,则~/.ssh目录属于该用户并且不属于root也很重要:

chown -R sammy:sammy ~/.ssh

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

我们现在可以使用Debian服务器尝试无密码身份验证。

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

如果您已成功完成上述某个过程,则应该能够在没有远程帐户密码的情况下登录远程主机。

基本过程是一样的:

ssh username@remote_host

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

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

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

如果您没有为您的私钥提供密码,您将立即登录。如果在创建密钥时为私钥提供了密码,系统将提示您立即输入密钥(请注意,为了安全起见,您的按键不会显示在终端会话中)。在身份验证之后,应该使用Debian服务器上配置的帐户为您打开一个新的shell会话。

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

步骤4 - 在服务器上禁用密码验证

如果您能够在没有密码的情况下使用SSH登录帐户,则表明您已成功为帐户配置基于SSH密钥的身份验证。但是,基于密码的身份验证机制仍处于活动状态,这意味着您的服务器仍然受到暴力攻击。

在完成本节中的步骤之前,请确保您为此服务器上的root帐户配置了基于SSH密钥的身份验证,或者最好是为此非root帐户配置了基于SSH密钥的身份验证有sudo权限的服务器。此步骤将锁定基于密码的登录,因此确保您仍然能够获得管理访问权限至关重要。

确认远程帐户具有管理权限后,请使用SSH密钥以root用户或具有sudo权限的帐户登录远程服务器。然后,打开SSH守护程序的配置文件:

sudo nano /etc/ssh/sshd_config

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

...
PasswordAuthentication no
...

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

sudo systemctl restart ssh

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

ssh username@remote_host

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

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

结论

您现在应该在服务器上配置基于SSH密钥的身份验证,允许您在不提供帐户密码的情况下登录。

想要了解更多关于设置SSH密钥的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How to Set Up SSH Keys on Debian 9》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

Git for Windows之使用SSH协议开通公钥免密登陆功能

13520
来自专栏云计算教程系列

给你CVM服务器加把锁,如何使用SSH密钥

SSH或安全shell是用于管理服务器和与服务器通信的加密协议。使用Ubuntu服务器时,您可能会将大部分时间花在通过SSH连接到服务器中。

19840
来自专栏linux系统运维

Nginx负载均衡,ssl原理,生成ssl密钥对,Nginx配置ssl

30340
来自专栏编程之旅

在Mac上使用ssh-key免密码登录服务器

从很早之前开始,在搭建测试服务器的时候,就不停的谷歌怎么免密登录服务器,每次配置好免密登录后,到搭建新的服务器时,又忘记了具体的命令,所以决定把这个方法记下来,...

1.8K40
来自专栏Java帮帮-微信公众号-技术文章全总结

Centos6.5安装配置nginx

出现如下代码: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is...

11630
来自专栏云计算教程系列

如何在Debian 9上安装和配置Nextcloud

Nextcloud是ownCloud的一个分支,它是一个文件共享服务器,允许您将个人内容(如文档和图片)存储在集中位置,就像Dropbox一样。与Nextclo...

1.9K30
来自专栏IT可乐

邮件实现详解(二)------手工体验smtp和pop3协议

  上篇博客我们简单介绍了电子邮件的发送和接收过程,对参与其中的邮件服务器,邮件客户端软件,邮件传输协议也有简单的介绍。我们知道电子邮件需要在邮件客户端和邮件服...

463100
来自专栏FreeBuf

文件上传限制绕过技巧

文件上传漏洞是web安全中经常利用到的一种漏洞形式。一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意...

42720
来自专栏FreeBuf

新手教程 | 如何使用Burpsuite抓取手机APP的HTTPS数据

* 本文原创作者:smartdone,本文属FreeBuf原创奖励计划,未经许可禁止转载 1.所需条件 · 手机已经获取root权限 · 手机已经成功安装xpo...

74370
来自专栏游戏杂谈

PHP 图片验证码的问题

发现没有问题,查看php.ini中的扩展,发现extension=php_gd2.dll 已经开启了

21420

扫码关注云+社区

领取腾讯云代金券