增强Linux云服务器SSH安全性的方法

前言

暑假在家,忽然想起上学期有一门课还有几百块的华为云代金券没用,算了一下,代金券剩下的额度还可以买大半年的云服务器玩一玩,于是就行动起来了。刚买完一天,按着自己之前留下的总结在 Windows Terminal 中配置好了 Oh-My-Zsh 后,结果第二天起床就收到华为云发来的短信,说服务器遭到了暴力破解,但没有成功。

image-20210822222415754

上两学期也曾在学校听说过同学的服务器被 hack,数据库被删除了而且还留下了一个比特币的汇款账户;此外,学院的服务器也曾被 hack 来用于挖矿;听说被 hack 的次数不少,但还真没想到有一天会发生在自己身上。接到通知后,我首先登录查看了自己的服务器有没有异常进程,检查完毕后发现没有,再去查了对我服务器进行恶意登录的 IP,居然也是来自华为云的,不免引人遐想。

image-20210822222649991

虽然只是一个用着代金券剩余的钱买来的土豆服务器(1核1G,系统为Ubuntu 18.04),但在平常的学习中也是大有可为的,就这么被坏人得逞也太憋屈了,所以我决定上网搜集一下有关云服务器中有关 SSH 的防 hack 方法,折腾并记录一下。网上查到的方法有几种,下面我将分点阐明。

云服务器增强SSH防护的方法

一、 购买云服务厂商的安全服务

由于是云服务器,所以这种方法是最为省时省力的,可惜就是不省钱。我到华为云上查了查服务的价格,是服务器价格的几倍,所以就不考虑了。

二、 更换密码

经过查阅资料和观察自己的被攻击记录发现,入侵者都是通过脚本来暴力攻击 SSH 服务的默认端口——22 端口,并随机生成密码来尝试登陆的。那么这样意味着只要我们的密码设置得足够复杂(同时包含大小写字母数字和符号),就可以避免入侵者轻易试出我们的密码。入侵者一般在一段时间内会尝试入侵多台服务器,而不会对一台服务器破解过久,因此密码设置得稍微复杂一点,可以大大提高安全性。

云服务器密码重设的方法有两种,第一种是进入系统后通过命令重新设置,第二种则较为简单,直接到云服务器厂商的控制台重新设置即可。

  • 通过命令重新设置

    1
    2
    3
    4
    5
    6
    7
    # 将当前用户转为root用户(如果当前已经是root用户则忽略这一步)
    sudo su root

    # 更换密码
    sudo passwd root

    # 接下来按照指引输入并确认密码,重启即可生效
  • 控制台重新设置(华为云)

    image-20210822230758903

你可能会问,如果密码设置得太复杂,自己每次都要输入很久、或者是有可能忘掉,应该怎么办?有解决方法的,那请看到最后吧~

三、更换端口号

SSH 服务默认的端口号是 22 端口,也是入侵者一般入侵的端口号。为了进一步巩固云服务器的安全性,可以更改一下服务器中 SSH 的端口号,简单来说就是:修改配置文件,自定义一个不常见的 SSH 端口号,同时取消掉默认的 22 端口号,并在云服务器的控制台中关闭 22 端口。具体来说,该操作分为以下几步:

  1. 打开 SSH 配置文件 sshd_config

    1
    vim /etc/ssh/sshd_config
  2. 修改配置文件中的端口信息并使其生效

    找到 Port 22 这一行,在下面换成你自定义的端口,比如 2021,并且先不要删掉原来 Port 22 这一行,以免配置出错,无法通过默认端口登录云服务器。

    image-20210815234104477

保存文件之后,再用命令重启一下 SSH 服务,使配置生效。

1
service sshd restart

如果你使用的是云服务器,那么还需要在控制台对服务器的安全组进行设置,在入方向规则中添加新的端口号。

image-20210823174217922

  1. 测试新端口是否有效

    将 SSH 客户端中的连接端口改为新设置的端口,之后登录新的端口,登录成功则说明设置成功。

    image-20210823175321290

测试成功后,重新用 vim /etc/ssh/sshd_config 打开配置文件,并将 22 端口删除,只保留新建的 2021 端口即可。

image-20210815234152227

四、限制登录次数

为了防止入侵者进行多次的暴力破解,可以在配置文件中限制输入密码的次数和密码错误后的用户锁定时间。具体方法如下:

1
2
3
4
5
6
7
8
9
10
11
# 打开配置文件
vim /etc/pam.d/sshd

# 在第二行注释下加入该行命令
auth required pam_tally2.so deny=3 unlock_time=3600 even_deny_root root_unlock_time=3600

# 上一命令中的参数解释
# deny = 3 代表最多可尝试登陆三次,超过三次则进行锁定用户
# unlock_time = 3600 代表非root用户锁定3600秒
# even_deny_root 代表即使是root用户也需要锁定
# root_unlock_time = 3600 代表root用户锁定3600秒

配置文件(Ubuntu 18.04)的截图如下所示:

image-20210822215748965

5. 设置免密登录

经过上述步骤的配置,目前云服务器的 SSH 服务已经较为安全了。但是,为了保障我们服务器的安全性,在第二步中我们将密码设置得较为复杂,同时也在第四步限制了密码输入错误的次数。这样有可能导致我们会忘记太复杂的密码、或者是在每次登录的时候需要花较长时间输入密码,甚至是多次输入错误的密码导致用户锁定。解决上面几个问题最后的方法就是——设置当前主机免密登录。

  1. 在本地生成公私钥

    1
    2
    3
    4
    5
    6
    7
    8
    # 生成公私钥(下面的命令需要有git环境)
    ssh-keygen

    # 进入对应的目录(Windows在C盘的用户文件夹下)
    cd ~/.ssh

    # 查看目录下的公私钥
    ls # id_rsa 为私钥,id_rsa.pub为公钥
  2. 上传公钥到服务器中

    1
    2
    3
    4
    5
    # 上传公钥
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip # ip改成服务器对应的ip

    # 检查是否上传成功
    cd ~/.ssh # 看到了 autorized keys 即代表上传成功

    在输入上面的第一条命令后,终端会弹出如下图的一系列信息,一路 Enter 即可。

    image-20210823190536215

    完成了上述步骤后,使用 ssh root@ip -port,把 ip 和端口号置换成自己设置的端口号即可免密登录服务器啦!

写在后面

在经过了更换密码、端口和限制登录次数的三个方法,云服务器的安全性得到了很好的提高,同时在设置了免密登录后,SSH 登录也更为便捷。感谢您看到这里,同时也希望未来大家能多多注重服务器的安全,毕竟服务器只有在安全的前提下才能好好用于学习和玩耍呀!