Fail2ban
Posted 笨小孩@GF 知行合一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fail2ban相关的知识,希望对你有一定的参考价值。
-
优点:使用简单、灵活、功能强大
-
公网网站如果一直被人暴力破解 SSHD 服务密码,会导致系统负载很高,原因是在暴力破解的时候,系统会不断地认证用户,从而增加了系统资源额外开销,导致访问公司网站速度很慢。
-
然而 fail2ban 程序可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送 e-mail 通知系统管理员,很实用、很强大!
-
简单来说其功能就是防止暴力破解。
-
工作的原理是通过分析一定时间内的相关服务日志,将满足动作的相关 IP 利用 iptables 加入到 dorp 列表一定时间。
-
下载软件包
-
官方地址:http://www.fail2ban.org
-
还可以使用 yum 的 epel 方式安装(方便)
-
yum -y install epel-release && yum -y install fail2ban
-
首先 实现 Fail2ban + iptables 对 SSH 服务防护
-
实验环境 CentOS 7.8.2003
-
iptables-services 为运行状态
-
需要 python 开发环境,并且版本要大于 2.4
-
设置条件:SSH 远程登录 5 分钟内 3 次密码验证失败,禁止用户 IP 访问主机 1 小时,1 小时该限制自动解除,用户可重新登录。
因为动作文件(action.d/iptables.conf)以及日志匹配条件文件(filter.d/sshd.conf )安装后是默认存在的。基本不用做任何修改。所有主要需要设置的就只有 jail.conf 文件。启用 SSHD 服务的日志
分析,指定动作阀值即可。 -
编辑配置文件
-
vim /etc/fail2ban/jail.conf
- [sshd] #单个服务检查设置,如设置 bantime、findtime、maxretry 和全局冲突,服务优先级大于全局设置。
- port = ssh
- logpath = %(sshd_log)s
- backend = %(sshd_backend)s
- enabled = true #是否激活此项(true/false)修改成 true。
- filter = sshd #过滤规则 filter 的名字,对应 filter.d 目录下的 sshd.conf。
- action = iptables[name=SSH, port=22, protocol=tcp] #动作的相关参数,对应action.d/iptables.conf 文件。
- sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.com, sendername="Fail2Ban"] #触发报警的收件人。
- logpath = /var/log/secure #检测的系统的登陆日志文件。这里要写 sshd 服务日志文件。默认为 logpath = /var/log/sshd.log(在 centos8 当中需要删除默认的 ssh 区域 logpath 选项) 。
- #5 分钟内 3 次密码验证失败,禁止用户 IP 访问主机 1 小时。 配置如下。
- bantime = 3600 #禁止用户 IP 访问主机 1 小时。单位:秒
- findtime = 300 #在 5 分钟内内出现规定次数就开始工作。单位:秒
- maxretry = 3 #3 次密码验证失败。
- 启动服务
- 测试:故意输入错误密码 3 次,再进行登录时,会拒绝登录。
- 检测 fail2ban 工作状态
Status
|- Number of jail: 1
`- Jail list: sshd #具体看某一项的状态也可以看,如果显示被 ban 的 ip 和数目就表示成功了,如果都是 0,说明没有成功。
- fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 6
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 2
|- Total banned: 2
`- Banned IP list: 192.168.2.2 192.168.2.4 #加入黑名单的 IP
-
fail2ban 从黑名单中移除 IP 的方法:
fail2ban-client set sshd unbanip 192.168.2.2
-
下面实现 Fail2ban + firewalld 对 SSH 服务防护
- 实验环境: CentOS 8.2.2011
- firewalld 为 开启状态,并且 SSH 端口已经添加
- firewall-cmd --zone=public --add-port=2222/tcp --permanent
- firewall-cmd --zone=public --list-ports
- yum -y install epel-release && yum -y install fail2ban fail2ban-firewalld
-
安装好 fail2ban 后 新建配置文件
-
vim /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
#这里 banaction 必须用 firewallcmd-ipset ,这是 friewalld 支持的关键,如果是用 Iptables 请不要这样填写
banaction = firewallcmd-ipset
action = %(action_mwl)s[sshd]
enabled = true
filter = sshd
port = 2222
action = %(action_mwl)s
logpath = /var/log/secure -
ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔
-
bantime:屏蔽时间,单位为秒(s)
-
findtime:时间范围
-
maxretry:最大次数
-
banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口
-
[sshd]:名称,可以随便填写
-
filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
-
port:对应的端口
-
action:采取的行动
-
logpath:需要监视的日志路径
- 重启服务
- systemctl restart fail2ban.service firewalld.service
- fail2ban-client status sshd
- 测试
-
防止CC攻击
这里仅以
nginx
为例,使用fail2ban
来监视nginx
日志,匹配短时间内频繁请求的IP
,并使用firewalld
将其IP
屏蔽,达到CC
防护的作用。
需要先新建一个nginx日志匹配规则 vim /etc/fail2ban/filter.d/nginx-cc.conf
[Definition]
failregex = <HOST> -.*- .*HTTP/1.* .* .*$
ignoreregex =
然后修改 jail.local
追加如下内容:
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 86400
logpath = /var/log/nginx/access.log
如果在60s
内,同一IP
达到20
次请求,则将其IP ban 1
小时,上面只是为了测试,请根据自己的实际情况修改。logpath
为nginx
日志路径。
- 测试,这里为了看到效果将访问次数调低
以上是关于Fail2ban的主要内容,如果未能解决你的问题,请参考以下文章