背景

我使用的服务器是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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐