配置 SSH 只能使用密钥登录

本文最后更新于:2020年8月16日 下午

为了避免被暴躁老哥用暴力穷举出密码。

前言

一般来说,我们都是走 SSH,通过密码去登录服务器的。这个时候如果没有做好保护的话,那么就会有安全问题。

比如说,如果设置 SSH 端口是默认的 22 的,而且是通过密码登录服务器的话,那么有心人就有 可能 通过暴力穷举的方式去破解掉我们的账户密码,甚至是 root 账户的密码。这样我们的服务器安全岂不是根本得不到保障么?

并不是这样,我们可以通过设置 SSH 的端口为其他端口,并且通过交换密钥的方式实现免密登录,同时也能提高我们的安全性。

配置的环境

  • 本地环境 Windows10 1909
  • 服务器环境 debian10

简单的说下密钥的工作机制

密钥的工作机制是通过生成一对私钥和公钥,将自己的私钥自己保存,将自己的公钥交给别人。每次进行通信的时候都将通信的内容用密钥进行加密。

当我发给服务器数据时,我将这些数据用私钥进行加密,同时保证只能由公钥进行解密。而服务器发给我数据的时候,它就可以用我交给它的公钥进行加密,而这个加密的内容只能通过我的私钥进行解密。这样一来我与服务器的通信就可以说是比较安全的了,因为一般常用的密钥生成算法都会保证我们的这个密钥的破解时长是一般人难以接受的,比如说十年二十年这样。那么我只要妥善保管好我的私钥,就可以实现安全的数据交互。

制作密钥对

在你的电脑打开 cmd 或者 powershell,输入如下命令

❯ ssh-keygen

然后就会出现下面这样的提示,跟着做就行。

Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\YOUR USER NAME/.ssh/id_rsa):

这个地方是说选择在哪里保存你的私钥,默认的是在你的用户的根目录下的 /.ssh/ 文件夹里面的 id_rsa 里面保存。一般都不需要更改。直接按回车就行。

Enter passphrase (empty for no passphrase):

这里是说让你输入一个密码用于加密你的私钥. 一般来说都不需要直接按空格就好了。

Enter same passphrase again:

再次输入密码以确认。

然后就会出现下面这样的提示

Your identification has been saved in C:\Users\YOUR USER NAME/.ssh/id_rsa.
Your public key has been saved in C:\Users\YOUR USER NAME/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:QHli0XPdK1T3pqLfRs2DcR2jslJBmu46Yj1AtFVvm6U YOUR USER [email protected] PC NAME
The key's randomart image is:
+---[RSA 2048]----+
|           +*.+oo|
|           o+O oo|
|          o==.= o|
|         .oo.+  .|
|        S.o . ...|
|      .+.B + o o.|
|     .oo= * B + .|
|     .+  o E o o |
|     oo.         |
+----[SHA256]-----+

这个时候你的私钥和公钥就生成好了,C:\Users\YOUR USER NAME/.ssh/id_rsa 是你的私钥,C:\Users\YOUR USER NAME/.ssh/id_rsa.pub是你的公钥。

将公钥提交给服务器

现在我们登录到服务器,新建一个 .ssh 的目录,然后在里面新建一个叫做 authorized_keys 的文件,把你的公钥拷到里面就好了。

mkdir .ssh
cd .ssh
nano authorized_keys

把上面的命令输完后把你的公钥复制进去就行。就是 C:\Users\YOUR USER NAME/.ssh/id_rsa.pub 里面的数据。
现在再把 ssh 服务重启一下就可以试下没有密码登陆了。

service ssh restart

现在尝试下新开一个窗口输入以下的命令进行连接试试吧

ssh [email protected] -p hostport

user就是要登陆的账户名,host就是你的服务器的地址,-p hostport 这个命令是在你的默认 ssh 端口不在 22 的时候使用的,把 hostport 换成你实际的 ssh 端口就可以了

取消密码登录

现在我们登录到了服务器,开始取消密码登录吧。

nano etc/ssh/sshd_config

然后找到 PasswordAuthentication 项,把它设置为no
就像下面这样

PasswordAuthentication no

记得要取消前面的 ## 是用来注释的。

设置 SSH 运行在其他端口

还是刚才的 sshd_config 文件,找到 Port 项,把它设置为你希望监控的端口。
比如下面这样

Port 1234

这里也要记得要取消前面的#

现在配置完了,把 ssh 服务重启一下,再试试能不能通过密码登陆了。

service ssh restart

参考资料

设置 SSH 通过密钥登录