怎样部署fail2ban

2017年4月21日 由 Amon

参考:http://amon.org/firewalld

【介绍】

官网:http://www.fail2ban.org/

fail2ban是可以监视你的系统日志,利用做filter和actor对匹配条件的错误信息(正则式匹配)执行相应的屏蔽动作。
CentOS 7已经自带Firewalld,并且使用Firewalld作为网络防火墙更加简单方便,以下是fail2ban + Firewalld使用方法。

建议:不要用封ip条目的方式,iptables列表长度是 65535 时就会封满,服务器也就会死机。

【环境】

检查Firewalld是否启用。

如果已经安装iptables建议先关闭:

service iptables stop

输出:

Redirecting to /bin/systemctl stop iptables.service
Failed to stop iptables.service: Unit iptables.service not loaded.

查看Firewalld状态:

firewall-cmd --state

输出:

running

启动firewalld:

systemctl start firewalld

设置firewalld开机启动:

systemctl enable firewalld.service

设置firewalld端口:

启用Firewalld后会禁止所有端口连接,因此请务必放行常用的端口,以免被阻挡在外。

firewall-cmd --zone=public --add-port=22/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent

重载配置使之生效:

firewall-cmd --reload

查看已放行端口:

firewall-cmd --zone=public --list-ports

【安装】

yum -y install fail2ban

输出:

...
Installed:
 fail2ban.noarch 0:0.9.7-1.el7
Dependency Installed:
 fail2ban-firewalld.noarch 0:0.9.7-1.el7
 fail2ban-sendmail.noarch 0:0.9.7-1.el7
 fail2ban-server.noarch 0:0.9.7-1.el7
 systemd-python.x86_64 0:219-57.el7_5.1
Complete!

安装完成。

如果报错:

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.ash.fastserv.com
 * extras: mirror.ash.fastserv.com
 * updates: mirror.ash.fastserv.com
No package fail2ban available.
Error: Nothing to do

参考:https://www.yeely.cn/fix-nopackage-available-on-linux.html

方法:用yum命令直接从企业版Linux库配置包中安装扩展包。一直等待,直到出现 Complete 就完成了epel的安装。

yum install -y epel-release

查看版本:

fail2ban-client -V

输出:

Fail2Ban v0.9.7
Copyright (c) 2004-2008 Cyril Jaquier, 2008- Fail2Ban Contributors
Copyright of modifications held by their respective authors.
Licensed under the GNU General Public License v2 (GPL).
Written by Cyril Jaquier <cyril.jaquier@fail2ban.org>.
Many contributions by Yaroslav O. Halchenko <debian@onerussian.com>.

设为开机自启:

systemctl enable fail2ban

输出:

Created symlink from /etc/systemd/system/multi-user.target.wants/fail2ban.service to /usr/lib/systemd/system/fail2ban.service.

启动fail2ban:

systemctl start fail2ban

重启fail2ban:

systemctl restart fail2ban

查看状态:

systemctl status fail2ban

查看被ban IP,其中sshd为名称,比如[wordpress]:

fail2ban-client status sshd

删除被ban IP:

fail2ban-client set sshd delignoreip 192.168.111.111

查看日志:

tail /var/log/fail2ban.log

【配置】

安装成功后fail2ban配置文件位于/etc/fail2ban,其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录,其它目录/文件一般很少用到。

fail2ban已经内置很多匹配规则,位于filter.d目录下,包含了常见的SSH/FTP/Nginx/Apache等日志匹配。

设置 jail.local :

新建 /etc/fail2ban/jail.local ,jail.local 将覆盖 jail.conf 的所有默认规则:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

参考:https://www.xiaoz.me/archives/9831
参考:https://qiita.com/kskiwmt/items/f871f940fa9b64b4f396

默认配置:

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s

参数解释:
ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔
bantime:屏蔽时间,单位为秒(s)
findtime:时间范围
maxretry:最大次数
banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口。必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写。

防止SSH爆破:

如果您还在使用默认SSH端口(22),可能每天都会被扫描,强烈建议先参考《Linux服务器之登录安全》加强服务器防护,或者可以使用fail2ban将恶意IP屏蔽。

参考:https://www.xiaoz.me/archives/8223

继续修改jail.local这个配置文件,在后面追加如下内容:

[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure

参数解释:
[sshd]:自己定义。
filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
port:对应的端口
action:采取的行动
logpath:需要监视的日志路径

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

保存 jail.local 后,重新启用fail2ban:

systemctl restart fail2ban

测试效果:

使用另一台服务器不断尝试连接SSH,并且不断的将密码输入错误,会发现连续超过5次后直接连不上,说明IP被ban了,可以查看被ban的IP:

fail2ban-client status sshd

输出:

Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches:
`- Actions
 |- Currently banned: 0
 |- Total banned: 0
 `- Banned IP list:

【WordPress防护】

分析日志会发现有大量机器人在扫描wordpress登录页面wp-login.php,虽然对方可能没成功,但是为了避免万一还是将他IP干掉为好。

新建一个日志匹配规则,/etc/fail2ban/filter.d/wordpress.conf

注意:所有新的规则都放置于 /etc/fail2ban/filter.d/ ,文件名与 jail.local 中的 [wordpress] 相对。

填写如下内容:

[Definition]
failregex = ^</host><host> -.* /wp-login.php.* HTTP/1\.."
ignoreregex =

修改 jail.local ,追加如下内容:

[wordpress]
enabled = true
port = http,https
filter = wordpress
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log

【排错】

报错: WARNING Wrong value for ‘findtime’ in ‘sshd’.

文件:jail.local

一般是因为时间格式引起的,统一用秒表示即可。

报错:WARNING Wrong value for ‘dbpurgeage’ in ‘Definition’

文件:fail2ban.conf

一般是因为时间格式引起的,统一用秒表示即可。

参考:https://www.cnblogs.com/miketwais/articles/fail2ban.html

# dbpurgeage = 1d
dbpurgeage = 86400

报错: fail2ban ERROR NOK: (“No ‘host’

参考:https://github.com/fail2ban/fail2ban/issues/1723

参考:https://www.centos.org/forums/viewtopic.php?t=49819

【源码安装】

源码:https://github.com/fail2ban/fail2ban

git clone https://github.com/fail2ban/fail2ban.git && cd fail2ban && python setup.py install

Fail2ban将安装到Python的库目录下,可执行脚本位于/usr/bin,配置文件位于/etc/fail2ban。

启动脚本:复制源码路径files下相应的操作系统的启动脚本到/etc/init.d/下 :

cp files/redhat-initd /etc/init.d/fail2ban

开机启动:

systemctl enable fail2ban

如果需要对IPv6地址进行匹配,Fail2ban的版本需要大于0.10。

【应用】

参考:https://stackoverflow.com/questions/32652703/fail2ban-filter-error-no-host-found-in

failregex looks like this:

failregex = ^.*?<HOST> https?://.*?[Aa]dmin.*? ((301)|(404)).*$

参考:https://my.oschina.net/CandyMi/blog/500767
参考:https://my.oschina.net/yiyuanxi/blog/810988

【参考】

参考:https://www.cnblogs.com/miketwais/articles/fail2ban.html
参考:http://www.tutorials.makkugasho.com/2014/02/21/asterisk-11-5-fail2ban/
参考:http://blog.csdn.net/clebeg/article/details/37960425
参考:https://www.xiaoz.me/archives/9831
参考:https://www.ifshow.com/centos-7-install-fail2ban-with-firewalld-to-defend-brute-force-password/
参考:http://baike.baidu.com/item/Fail2ban
参考:http://www.cnblogs.com/canxuexiecheng/articles/3315021.html
参考:https://my.oschina.net/monkeyzhu/blog/418592
参考:https://calvinpeak.herokuapp.com/2014/12/15/install-centos-7-in-linode/

广告位
Sedo

评论已关闭.