实战:CentOS 抵御暴力破解,解决上千次恶意登录问题
背景
我使用的服务器是Centos7.9。
最近半年把网站备案了,站点从香港迁到大陆,发现出现一些乱七八糟的问题,比如这个安全问题,几天不登录就出现:
There were 1085 failed login attempts since the last successful login.
查看下secure的日志
grep "Failed password" /var/log/secure | head -10
发现很多IP在尝试登录我的服务器,统计一下:
lastb | awk '{print $3}' | sort | uniq -c | sort -nr

感觉是被扫描以及尝试破解,而且都是在凌晨,白天都没有这些尝试。这个时候得升级加固下。
思路
最简单的思路就是直接禁封这个IP,但是这种,感觉有点太简单了,不智能。想想自己DIY一个策略,估计防护起来效果会好些。
当攻击者提交的user被判断为invalid user时,直接禁封这个IP,5分钟。当user提交的root用户,并且3次密码输入错误后,禁封这个IP,5分钟。并记录刚刚的日志。日志,独立,不与系统日志混合。用这个思路来看看,看看下一次又有多少次登录失败。
安装epel-release
yum install -y epel-release
yum install -y fail2ban
使得fail2ban开机自启并生效
systemctl enable fail2ban
systemctl start fail2ban
配置非Root用户登录失败策略:
vi /etc/fail2ban/filter.d/sshd-invalid-user.conf
策略如下:
[Definition]
failregex = ^.*pam_unix(sshd:auth): authentication failure;.*rhost=<HOST>.*user=unknown
^.*Failed password for invalid user .* from <HOST>
^.*Invalid user .* from <HOST>
ignoreregex =
配置Root用户登录失败策略:
vi /etc/fail2ban/filter.d/sshd-root-fail.conf
策略如下:
[Definition]
failregex = ^.*pam_unix(sshd:auth): authentication failure;.*rhost=<HOST>.*user=root
^.*Failed password for root from <HOST>
ignoreregex =
配置ssh自定义规则文件,将上面2个识别包含住
vim /etc/fail2ban/jail.d/ssh-custom.conf
内容如下:
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 300
findtime = 300
banaction = iptables-multiport
# 规则1:无效用户 → 一次就封
[sshd-invalid-user]
enabled = true
filter = sshd-invalid-user
#logpath = /var/log/secure
logpath = /var/log/ssh-attack.log
maxretry = 1
# 规则2:root 密码错误 → 3次封
[sshd-root-fail]
enabled = true
filter = sshd-root-fail
#logpath = /var/log/secure
logpath = /var/log/ssh-attack.log
maxretry = 3
创建日志重定向配置,将系统日志重定向到指定文件。
vi /etc/rsyslog.d/ssh-attack.conf
内容:
# sshd 日志同时写入两个文件
:programname, isequal, "sshd" /var/log/ssh-attack.log
:programname, isequal, "sshd" /var/log/secure
重启日志服务:
systemctl restart rsyslog
重启fail2ban服务:
systemctl restart fail2ban
测试:
root尝试3次登录失败:
/var/log/ssh-attack.log

/var/log/fail2ban.log

过了5分钟后,可再次尝试
ssh-attack.log

fail2ban.log

非root用户登录:


结论
① 整套防护逻辑依托日志体系实现:由 rsyslog 完成日志采集、分流与输出,Fail2ban 持续监听指定日志文件,利用正则表达式识别异常行为。当匹配到违规访问特征时,Fail2ban 会调用 iptables 防火墙规则对源 IP 进行临时封禁,封禁时长由配置定义,到期后自动释放 IP 访问权限。
② Fail2ban 具备良好的通用性,防护对象不局限于 SSH 服务。只要应用可正常生成运行日志,无论是数据库(MySQL)、中间件,还是自主开发的业务服务,均可通过定制正则匹配规则,接入本防护体系,实现异常访问的识别与 IP 自动封禁。
最终
封IP5分钟还是太仁慈了,发现还是有很多黑客,来扫描,感觉像是走了不同的代理。最终我改成了。
vim /etc/fail2ban/jail.d/ssh-custom.conf
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 300
findtime = 300
banaction = iptables-multiport
# 规则1:无效用户 → 一次就封,100小时
[sshd-invalid-user]
enabled = true
filter = sshd-invalid-user
#logpath = /var/log/secure
logpath = /var/log/ssh-attack.log
maxretry = 1
bantime = 360000
# 规则2:root 密码错误 → 3次封,100小时
[sshd-root-fail]
enabled = true
filter = sshd-root-fail
#logpath = /var/log/secure
logpath = /var/log/ssh-attack.log
maxretry = 3
bantime = 360000
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)