最近为网站的安全伤透了脑筋,总有莫名其妙的网络攻击导致网站出现各种问题,经过一番折腾,找到一款叫 fail2ban 的软件,和系统自带的防火墙搭配可极大提高服务器安全。
一、关于Fail2ban
- Fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽)。如:当有人在试探你的HTTP、SSH、SMTP、FTP密码,只要达到你预设的次数,fail2ban就会调用防火墙屏蔽这个IP,而且可以发送e-mail通知系统管理员,是一款很实用、很强大的软件!
- Fail2ban由python语言开发,基于logwatch、gamin、iptables、tcp-wrapper、shorewall等。如果想要发送邮件通知,那还需要安装postfix或sendmail。
- 在外网环境下,有很多的恶意扫描和密码猜测等恶意攻击行为,使用Fail2ban配合系统自带的防火墙,是实现网站安全的一个很好的解决方案。
二、安装Fail2ban
1、通过yum仓库安装
#CentOS内置源并未包含fail2ban,需要先安装epel源 yum -y install epel-release #安装fial2ban yum -y install fail2ban
查看Fail2ban当前版本,若想安装最新版本可采取下面的方法。
[root@izbp10tooeq1ny71db941mz ~]# fail2ban-server -V Fail2Ban v0.9.7
2、通过wget下载安装
首先找到fail2ban的托管平台 https://github.com/fail2ban/fail2ban/releases,目前最新版本为 0.10.4,复制其下载链接:
#从github下载相应版本 wget https://github.com/fail2ban/fail2ban/archive/0.10.4.tar.gz #解压 tar -xf 0.10.4.tar.gz #进入解压目录 cd fail2ban-0.10.4 #安装 python setup.py install
或者:
#从github下载相应版本 wget https://github.com/fail2ban/fail2ban/archive/0.10.4.zip #解压 unzip 0.10.4.zip #进入解压目录 cd fail2ban-0.10.4 #安装 python setup.py install
安装完成后fail2ban位于 /etc/fail2ban,其主要文件和文件夹如下:
/etc/fail2ban/action.d #动作文件夹,内含默认文件。iptables以及mail等动作配置
/etc/fail2ban/filter.d #条件文件夹,内含默认文件。过滤日志关键内容设置
/etc/fail2ban/jail.conf #主要配置文件,模块化。主要设置启用ban动作的服务及动作阀值
/etc/fail2ban/fail2ban.conf #定义了fai2ban日志级别、日志位置及sock文件位置
/etc/rc.d/init.d/fail2ban #启动脚本文件
三、生成 jail.local 文件并配置全局参数
新建 jail.local 并复制 jail.conf 的默认规则,不在 jail.conf 中直接编辑是为了防止升级后覆盖了配置好的规则:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑 jail.local 文件,下面用的是Linux下的 vi 编辑器,如果是宝塔Linux面板可直接在面板里面编辑:
vi /etc/fail2ban/jail.local
编辑 jail.local 文件的全局参数:
[DEFAULT] ignoreip = 127.0.0.1/8 backend = auto
- ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔
- backend:日志修改检测机制(有gamin 、polling 、auto 三种,默认auto)
注:vi编辑器有3种模式,命令模式(默认模式),编辑模式(i进入,ESC进入命令模式),尾行模式(:进入,ESC进入命令模式)。一般在编辑模式下编辑完文档后,按ESC退出编辑模式并进入到命令模式,然后在底行输入:wq保存退出。更多vi操作学习请进这里
四、防止SSH爆破
如果你还在使用默认SSH端口(22),可能每天都会被扫描并被尝试爆破,这时可以使用fail2ban将恶意IP屏蔽。
继续修改 jail.local 文件,在后面追加如下内容:
[sshd] enabled = true filter = sshd action = iptables[name=sshd,port=22,protocol=tcp] maxretry = 3 findtime = 60 bantime = 7200 logpath = /var/log/secure
- [sshd]:服务名,最好与规则名称相同,以免出错
- enabled:是否激活(true/false),true表示激活
- filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
- action:动作的相关参数,对应action.d/iptables.conf文件
- maxretry:在设定的时间范围内允许尝试的最大次数
- findtime:时间范围,单位为秒(s)
- bantime:屏蔽IP的时间,单位为秒(s)
- logpath:需要监视的日志路径
到这一步,jail.local 文件的规则看起来就是下面的样子:
[DEFAULT] ignoreip = 127.0.0.1/8 backend = auto [sshd] enabled = true filter = sshd action = iptables[name=sshd,port=22,protocol=tcp] maxretry = 3 findtime = 60 bantime = 7200 logpath = /var/log/secure
上面的配置规则表示:如果一个 IP,在1分钟内连续超过3次通过SSH登陆错误,则防火墙Firewalld根据规则将此 IP 屏蔽两小时。以上配置可以根据自己的要求适当修改,比如端口、次数、时间等。
输入下面的命令启动fail2ban试试效果。
systemctl start fail2ban
使用一SSH工具连接服务器,连续输错三次密码则会拒绝连接,说明 IP 被屏蔽了。
可以输入下面的命令查看被屏蔽的 IP。
fail2ban-client status sshd
因为这时SSH工具无法连接服务器,只能通过阿里云控制台的远程连接登陆服务器,输入上面的命令可见屏蔽的 IP。如下截图:
五、防止CC攻击
这里以Nginx为例,使用fail2ban来监视nginx日志,匹配短时间内频繁请求的IP并将其屏蔽,达到CC防护的作用。Apache与这类似。
先新建一个nginx日志关键字过滤匹配规则文件 nginx-cc.conf
vi /etc/fail2ban/filter.d/nginx-cc.conf
#输入如下内容
[Definition] failregex = <HOST> -.*- .*HTTP/1.* .* .*$ ignoreregex =
继续修改 jail.local 文件追加如下内容:
[nginx-cc] enabled = true filter = nginx-cc action = iptables[name=nginx-cc,port=80,protocol=tcp] maxretry = 30 findtime = 60 bantime = 300 logpath = logpath = /usr/local/nginx/logs/access.log
上面的配置规则表示:如果在60s内,同一IP的请求达到30次,则将其IP 屏蔽 5分钟,上面只是为了测试,请根据自己的实际情况修改。logpath为nginx日志路径,正常情况下在/usr/local/nginx/logs/access.log ,不过我使用的是宝塔Linux面板,其日志在 /www/wwwlogs/xxx.xxx.log。
六、防止Wordpress爆破
如果您经常分析日志会发现有大量机器人在扫描wordpress登录页面 wp-login.php,虽然对方可能没成功,但是为了避免万一还是将其 IP 屏蔽掉为好。
#需要先新建一个nginx日志关键字过滤匹配规则文件 wordpress-cc.conf
vi /etc/fail2ban/filter.d/wordpress-cc.conf
#输入如下内容
[Definition] failregex = <HOST> -.* /wp-login.php.* HTTP/1\.. ignoreregex =
继续修改 jail.local 文件追加如下内容:
[wordpress-cc] enabled = true filter = wordpress-cc action = iptables[name=wordpress,port=80,protocol=tcp] maxretry = 20 findtime = 60 bantime = 600 logpath = /usr/local/nginx/logs/access.log
logpath为nginx日志路径,路径问题可参考上面。
当然,别忘记输入
systemctl restart fail2ban
重启fail2ban使其生效。
七、常用命令
#启动fail2ban systemctl start fail2ban #重启fail2ban systemctl restart fail2ban #停止fail2ban systemctl stop fail2ban #开机启动fail2ban systemctl enable fail2ban #停止开机自启动fail2ban systemctl disable fail2ban.service #查看开机启动项 systemctl list-unit-files | grep enable #查看fail2ban当前版本 fail2ban-server -V #验证fail2ban成功运行 fail2ban-client ping 正常运行会显示:Server replied: pong #查看fail2ban监控对象(会列出当前监控的监狱列表) fail2ban-client status #查看一个特定监狱的状态(注意规则名称与你的保持一致) fail2ban-client status sshd 或 fail2ban-client status nginx-cc 或 fail2ban-client status wordpress-cc #释放被特定监狱屏蔽的IP(注意规则名称与你的保持一致) fail2ban-client set sshd unbanip 192.168.111.111 或 fail2ban-client set nginx-cc unbanip 192.168.111.111 或 fail2ban-client set wordpress-cc unbanip 192.168.111.111 #在SSH监护服务忽略IP列表(白名单)中添加IP fail2ban-client set sshd addignoreip 192.168.111.111 #在SSH监护服务忽略IP列表(白名单)中删除IP fail2ban-client set sshd delignoreip 192.168.111.111 #查看日志 tail /var/log/fail2ban.log
八、写在最后
在安装完fail2ban后请立即重启一下fail2ban,看是不是能正常启动,因为在后边我们配置完规则后如果发生无法启动的问题我们可以进行排查。
如果安装完后以默认规则能够正常启动,而配置完规则后却不能够正常启动,请先检查一下你 /var/log/ 目录下有没有规则里的 logpath= 后边的日志文件,有可能这个日志文件的路径或名称与规则里的不一致,这时请在 logpath 项那里修改你的路径或文件名。
在 filter.d 目录下fail2ban已经内置了很多匹配规则,包含了常见的SSH/FTP/Nginx/Apache等日志的异常信息匹配,如果这无法满足你的需求,你可以自行新建规则来匹配日志的异常信息以屏蔽那些恶意IP。
参考资料
CentOS 7安装fail2ban + Firewalld防止爆破与CC攻击
centos下fail2ban安装与配置详解 centos7 下安装使用fail2ban
转载请注明:好奇网 » CentOS安装Fail2ban之小白攻略