安全攻防 / 运维笔记

CentOS7安装Fail2ban+Firewalld防止SSH或vsftpd爆破

Einic Yeo · 3月23日 · 2019年 · · ·

fail2ban可以监视你的系统日志,然后匹配日志的错误信息执行相应的屏蔽动作。网上大部分教程都是关于fail2ban+iptables组合,考虑到CentOS 7已经自带Firewalld,所以这里我们也可以利用fail2ban+Firewalld来防SSH或vsftpd爆破。

准备工作

1、检查Firewalld是否启用

#如果您已经安装iptables建议先关闭
service iptables stop
#查看Firewalld状态
firewall-cmd --state
#启动firewalld
systemctl start firewalld
#设置开机启动
systemctl enable firewalld.service

启用Firewalld后会禁止所有端口连接,因此请务必放行常用的端口,以免被阻挡在外,以下是放行SSH端口(22)示例,供参考:

#放行22端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
#重载配置
firewall-cmd --reload
#查看已放行端口
firewall-cmd --zone=public --list-ports

安装fail2ban

#CentOS内置源并未包含fail2ban,需要先安装epel源
yum -y install epel-release
#安装fial2ban
yum -y install fail2ban

安装完成后,服务配置目录为:/etc/fail2ban
/etc/fail2ban/action.d #动作文件夹,内含默认文件。iptables以及mail等动作配置
/etc/fail2ban/fail2ban.conf #定义了fai2ban日志级别、日志位置及sock文件位置
/etc/fail2ban/filter.d #条件文件夹,内含默认文件。过滤日志关键内容设置
/etc/fail2ban/jail.conf #主要配置文件,模块化。主要设置启用ban动作的服务及动作阀值
/etc/rc.d/init.d/fail2ban #启动脚本文件

使用jail.local设定,覆盖默认配置

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local
[DEFAULT]                                 #全局设置
ignoreip = 127.0.0.1                      #忽略的IP列表,多个IP以空格分割或IP段127.0.0.1/8不受设置限制(白名单)
bantime  = 86400                            #屏蔽时间,单位:秒
findtime  = 600                           #这个时间段内超过规定次数会被ban掉
maxretry = 5                              #最大尝试次数
backend = auto                            #日志修改检测机制(gamin、polling和auto这三种)
#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写
banaction = firewallcmd-ipset
action = %(action_mwl)s

[sshd]
enabled = true
filter  = sshd
port    = 22
action = %(action_mwl)s
sendmail-whois[name=sshd, dest=root, [email protected]]
logpath = /var/log/secure
bantime  = 86400
findtime = 600
maxretry = 5

上面的配置意思是如果同一个IP,在10分钟内,如果连续超过5次错误,则使用Firewalld将他IP ban了。

fail2ban 重启验证

systemctl start fail2ban
查看iptables规则是否生效 
iptables -nL --line-number(注意查看f2b-模块名sshd所在行)

使用另一台服务器不断尝试连接SSH,并且不断的将密码输入错误,你会发现连续超过5次后直接连不上,说明IPban了,可以输入:fail2ban-client status sshd查看被banIP,如下截图。

常用命令

查看黑名单状态
fail2ban-client status sshd(模块名)
黑名单移除IP
fail2ban-client set sshd unbanip IP地址
过滤规则检查
fail2ban-regex 日志文件.log 规则文件../filter.d/sshd.conf

防火墙规则查看与清理
iptables -nL --line-number(注意查看f2b-模块名sshd所在行)
iptables -D f2b-sshd num(-D清理 防火墙模块名 编号)

vsftpd配置注意项

在之前开始使用fail2ban防止vsftpd或ssh暴力破解之后,有一定的效果,但在查看fail2ban.log日志时,发现一个问题:

fail2ban.filter : WARNING Unable to find a corresponding IP address for ns.rs996.com

我们再查看secure日志:

vsftpd: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=www.centos.bz rhost=ns.rs996.com

fail2ban是根据rhost取得客户端的ip,并使用iptables禁止它,但我们发现ns.rs996.com无法解析出ip地址,那它的ip去哪了呢?
经过分析得出结论:vsftpd默认对客户端ip进行反向解析,如果查询有结果,则把ip解析出来的域名记录secure日志中的rhost中,但是此反向解析出来的域名,本身又没有作A记录的解析,所以fail2ban再进行此域名的解析时,当然就无法获取到IP地址,也就无法禁止此客户端的暴力破解行为。
解决方法:
在vsftpd.conf中添加下面的代码禁止反向解析:

reverse_lookup_enable=NO

之后重启vsftpd即可。生效之后不仅解决了这个问题,也使得登录vsftpd不再停顿几秒了。
但是/var/log/secu版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!re里记录ftp登录失败有一个缺点,就是用相同的用户名,不同的密码登录多次,只是记录首次失败的信息,而之后的就只显示:last message repeated x times这样的信息,无法满足登录失败三次的条件,所以就不能阻版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!止此暴力破解,下面是解决这个问题的方法:
1、打开vsftpd.conf,添加如下代码:

dual_log_enable=YES
use_localtime=YES

2、打开/etc/fail2ban/jail.local,修改以下内容:

[vsftpd-iptables]
...
logpath = /var/log/vsftpd.log
...
版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!

注:

1.重启iptables 后需要重启fail2ban ,以此重新加载fail2ban黑名单规则到iptables,不然iptables规则为空;

2.原理:匹配到规则后先将IP加入黑名单̵版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!2;-再加入防火墙规则中;若防火墙规则已经删除,版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!未清理黑名单,再次触发则不会加入防火墙

参考文献

https://github.com/fail2ban/fail2ban
https://www.fail2ban.org/

0 条回应