CentOS7安装fail2ban与使用笔记 (firewall)

《CentOS7安装fail2ban与使用笔记 (firewall)》

起因

真正的懒癌晚期患者(缺钱也治不了),懒到不想给服务器做安全加固,就靠着复杂的数字字母混合16位密码保障着。前段时间看了看/var/log/secure文件,吓到了,好几个IP登录ssh失败,有近几万次之多。网上的闲人是真不少啊,网站没几个正经访客,各种扫描的倒是每天都有近千IP。还是得出手干活啊,不然哪天真攻破了服务器,也对不起自己的专业了。
手里服务器大部分是centos7,方案上自然选择fail2ban+firewall了。

firewall 相关配置可以查看这里:firewall设置笔记

安装fail2ban

fail2ban主要靠监控系统各种日志文件,并根据一定规则匹配异常IP后,再使用相应的防火墙将IP屏蔽,针对密码爆破和漏洞扫描非常有用。

# yum -y install epel-release
# yum -y install fail2ban

安装成功之后,fail2ban的配置文件位于/etc/fail2ban,其中的jail.conf为主要配置文件,有关的匹配规则位于filter.d目录下。
fail2ban的目录结构说明如下:

 /etc/fail2ban                 ## fail2ban 服务配置目录
 /etc/fail2ban/action.d        ## iptables 、mail 等动作文件目录
 /etc/fail2ban/filter.d        ## 条件匹配文件目录,过滤日志关键内容
 /etc/fail2ban/jail.d          ## 规则文件目录,按具体防护项目分成文件
 /etc/fail2ban/jail.local      ## 默认规则文件
 /etc/fail2ban/jail.conf        ## fail2ban 防护配置文件
 /etc/fail2ban/fail2ban.conf    ## fail2ban 配置文件,定义日志级别、日志、sock 文件位置等

fail2ban规则配置

新建/etc/fail2ban/jail.local来设置默认配置

# vi /etc/fail2ban/jail.local
# 以下是全局默认设置
[DEFAULT]
#time is in seconds. 3600 = 1 hour, 86400 = 24 hours (1 day)
findtime = 600
bantime = 8640000
maxretry = 2
ignoreip = 127.0.0.1 127.0.0.0/8  192.168.0.0/16

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

#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写 
 banaction = firewallcmd-ipset
 action = %(action_mwl)s

参数说明:
 ignoreip:IP白名单,白名单中的IP不会屏蔽
 bantime:屏蔽时间,单位为秒(s)
 findtime:时间范围
 maxretry:最大次数
 banaction:过滤动作由那个软件来执行
 action:过滤动作

修改 /etc/fail2ban/jail.d/00-firewalld.conf

# vi /etc/fail2ban/jail.d/00-firewalld.conf
//加入以下几句
[DEFAULT]
#banaction = firewallcmd-ipset
#action = %(action_mwl)s

参数说明:
 banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽ip
 action: 触发规则后进行的动作
 这里banaction必须用firewallcmd-ipset,这是firewall支持的关键,
 如果是用Iptables则填写iptables-multiport[name=sshd-ddos, port="22", protocol=tcp]

防止SSH爆破

#为ssh新建文件/etc/fail2ban/jail.d/sshd.local ,或者写入全局配置文件

# vi /etc/fail2ban/jail.local
//加入以下内容
 [sshd]
 enabled     = true
 filter      = sshd
 action      = %(action_mwl)s
 logpath     = /var/log/secure

 参数说明:
 [sshd]:名称,可以随便填写
 filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
 port:对应的端口,默认端口,所以这里没有填写
 action:采取的行动
 logpath:需要监视的日志路径

防止CC攻击

已经过反复测试

这里仅以Nginx为例,使用fail2ban来监视nginx日志,匹配短时间内频繁请求的IP,并使用firewalld将其IP屏蔽,达到CC防护的作用。

# 需要先新建一个nginx日志匹配规则
vi /etc/fail2ban/filter.d/nginx-cc.conf
# 填写如下内容
[Definition]
# 屏蔽访问次数异常的ip 已经排除jpg/css等普通类型的文件
# 只有后缀如,html,tm,php,asp,jsp,aspx,或无后缀的文件才会被匹配
failregex = <HOST> - - .? \"(GET|POST|HEAD) .?\/(?:(?!(\.jpg|\.css|\.js|\.txt|\.gif|\.png)).)+? HTTP/1.* .*$  
ignoreregex =

继续修改jail.local追加如下内容:
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 40
findtime = 30
bantime = 3600
logpath = /var/log/nginx/access.log  //请填写自己nginx服务器日志的位置

上面的配置意思是如果在60s内,同一IP达到180次请求,则将其IP ban 1小时,上面只是为了测试,请根据自己的实际情况修改。logpathnginx日志路径。

测试规则是否有效:

//使用如下命令,可以测试正则规则的有效性:  重要!!
//主要是匹配ip
# fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-cc.conf

防止目录爆破

已经过反复测试:
vi /etc/fail2ban/filter.d/nginx-404.conf
[Definition]
failregex =  ^<HOST> - - .* \"(GET|POST|HEAD) .*\.(php|html|htm|asp|aspx|jsp).*? HTTP/1.* 404 .*$
ignoreregex =

//继续修改jail.local追加如下内容:
[nginx-404]
# 屏蔽尝试访问404页的ip 
enabled = true
port = http,https
filter = nginx-404
maxretry = 3
findtime = 60
bantime = 8640000
logpath = /var/log/nginx/access.log
action = %(action_mwl)s
banaction = firewallcmd-ipset

防止Wordpress爆破

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

#需要先新建一个nginx日志匹配规则
vi /etc/fail2ban/filter.d/wordpress.conf
#填写如下内容
[Definition]
failregex = ^<HOST> - - .*/wp-login.php.* HTTP/1\.."
ignoreregex =

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

[wordpress]
enabled = true
port = http,https
filter = wordpress
action = %(action_mwl)s
maxretry = 5
findtime = 600
bantime = 864000
logpath = /var/log/nginx/access.log  //请填写自己nginx服务器日志的位置
//日志文件不存在时无法启动服务器
# mkdir -p /var/log/nginx/
# cd /var/log/nginx/
# touch access.log
# chmod 0777 ./access.log   

解除绑定

# fail2ban-client set nginx-404 unbanip 184.15.66.88

fail2ban相关的命令

 查看当前版本
 fail2ban-server -v
 fail2ban-server status
 启动
 systemctl start fail2ban
 停止
 systemctl stop fail2ban
 启动
 systemctl restart fail2ban
 开机启动
 systemctl enable fail2ban
 是配置立即生效
 systemctl daemon-reload
 查看是否开机启动
 systemctl is-enabled fail2ban
 查看被ban IP,其中sshd为名称
 fail2ban-client status sshd
 删除被ban IP
 fail2ban-client set sshd unbanip 192.168.111.111
 或
 fail2ban-client set sshd delignoreip 192.168.111.111
 如果用以上命令删除被ban IP发现这个IP还是无法连接,是因为在临时策略中的ipset集合,只有电脑重启或者从这里面删除IP才行。
 查看临时策略中的ipset集合:“ipset list”,删除ipset集合中IP:“ipset del     fail2ban-sshd 192.168.111.111 -exist”
 查看日志
 tail /var/log/fail2ban.log 

状态说明

|- Filter
|  |- Currently failed: 14  //当前失败数
|  |- Total failed: 953    //总失败数
|  `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 2   //当前屏蔽数
   |- Total banned: 6       //包含已经解封的(曾经屏蔽的)总屏蔽数  
   `- Banned IP list:117.182.xxx.xxx 116.19.xxx.xxx //当前屏蔽的列表

总结

fail2ban已经内置很多匹配规则,位于filter.d目录下,包含了常见的SSH/FTP/Nginx/Apache等日志匹配,如果都还无法满足您的需求,您也可以自行新建规则来匹配异常IP。使用fail2ban+Firewalld来阻止恶意IP是行之有效的办法,可极大提高服务器安全。

点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注