在《弃用宝塔,从零开始,用Docker搭建一个方便搬家,资源占用少的WordPress个人网站(上)》这篇文章中,为了让服务器更安全,我们已经设置了:不使密码登录,仅使用SSH密钥登录。
SSH 密钥对通常是 2048 位或 4096 位的,其复杂度是任何人类能记住的密码都无法比拟的。以目前的计算能力,暴力破解一个 2048 位的 RSA 密钥,需要的时间是以万年甚至更长来计算的。所以,只要私钥没有泄露,黑客通过暴力破解进入我们的服务器的可能性几乎为零。
但黑客写的入侵脚本往往没有那么智能,尽管我们已经设置仅SSH密钥登录,但它还是会不停尝试“root+密码”登录你的服务器(输入命令:tail -n 500 /var/log/auth.log
,查看最后500行认证日志,大概率能看到黑客尝试入侵的记录),持续的连接尝试会消耗我们服务器的网络和 CPU 资源,并在auth.log 中留下大量垃圾日志。
而在《防止黑客利用xmlrpc.php接口分布式暴力破解WordPress网站》这篇文章中,我们安装了Fail2ban用于解决黑客利用xmlrpc.php接口、wp-login.php页面暴力破解WordPress网站的问题,同样的,我们也可以使用Fail2ban阻止黑客入侵脚本持续的连接尝试,减少服务器资源浪费和日志噪音。
SSH 登录加固
检查并启用 SSH 防护 jail
-
打开 Fail2ban 的默认配置文件
Fail2ban 自带一个 jail.conf 文件,里面包含了对各种常见服务的防护配置模板。我们通常会创建一个 jail.local 文件来覆盖和启用我们需要的配置。nano /etc/fail2ban/jail.local
我们之前为了设置白名单已经创建过这个文件,这里直接编辑它就行。
-
添加或修改 [sshd] jail 配置
在文件中,找到 [sshd] 这一段。如果找不到,就手动添加它。我们来配置一个和之前网站防护一样严格的“零容忍”策略。# 如果文件是空的,或者没有 [sshd] 段,可以把这个加进去 # 如果已经有 [sshd] 段,就修改它 [sshd] # 启用这个 jail enabled = true # 端口是 ssh port = ssh # 使用内置的 sshd 过滤器 filter = sshd # 日志路径 logpath = /var/log/auth.log # 后端,Debian 默认就是 auto,可以不写 # backend = auto # --- 你的自定义严格策略 --- # 任何一次登录失败都立即触发 maxretry = 1 # 封禁时间为31天 bantime = 31d findtime = 1m
请注意:如果你之前在 jail.local 的 [DEFAULT] 段设置了 ignoreip(白名单),那么这个白名单对 [sshd] jail 同样生效。这意味着,即使您用白名单里的IP输错一次SSH密码,也不会被封禁。这是安全的。
-
保存并重启 Fail2ban
systemctl restart fail2ban
紧急预案:解封被锁在门外的自己
尽管我们已经设置了ip白名单,但如果因为某些原因(比如在没有私钥的电脑上尝试登录、运营商动态IP段变化)导致自己的 IP 被封禁,从而无法通过 SSH 连接服务器,这时该怎么办?
解决方案:通过云服务商提供的“网页控制台”或“VNC登录”功能。
几乎所有的云服务器提供商都提供了一种不依赖于网络 SSH、直接登录到服务器的“紧急通道”。
操作步骤(以腾讯云轻量应用服务器为例):
-
登录腾讯云控制台
访问 cloud.tencent.com,登录账号。 -
进入轻量应用服务器管理页面
在产品列表中找到“轻量应用服务器”。 -
找到你的服务器实例
在服务器列表中,点击你被锁住的那台服务器,进入它的详情页面。 -
使用“远程登录”功能
在详情页面下拉,找到“远程登录”,能看见有3种登录方式这里我们选择“免密登录”(通过OrcaTerm免密登录实例)
点击登录后,会弹出一个新的浏览器窗口,里面是一个模拟的、直接连接到你服务器显示器和键盘的终端界面。
-
执行解封命令
成功登录后,你就获得了一个不受 Fail2ban 防火墙影响的、拥有 root 权限的 shell。现在,你可以从容地执行解封命令了:# 首先,查看你的公网IP是多少 (百度“ip”查询) # 假设你被封的IP是 123.45.67.89 # 执行解封命令 fail2ban-client unban 123.45.67.89
-
退出网页控制台,用 SSH 重新连接
执行完解封命令后,关闭网页终端窗口。回到你自己的电脑上,现在应该可以正常通过 SSH 连接服务器了。
设置被攻击告警
通过上述和之前的操作,我们的个人网站已经相对安全了,若要进一步提升安全防护,我们还可以在云服务器服务商后台设置告警,通过服务器资源的使用率来判断网站是否正在被暴力攻击,以便及时采取反制措施。
我们的个人网站服务器设想是:1核1g内存,25g硬盘,月300g流量。经过我的测试和观察,我的anjir.top网站,日常cpu占用是2%左右,内存占用是70%左右,硬盘占用是24%左右,月流量大概1%左右。所以我设置的告警如下图,你也可以结合自己的情况,设置更加合理的告警。
设置好后,若我们的服务器资源利用率触发了告警,会马上收到邮件或者短信通知,然后我们可以结合告警内容,登录服务器后台,查看相关日志,及时采取反制措施。
未经允许不得转载:无花果 » 系统层防护,对SSH登录加固和设置被攻击告警