Fail2Ban
项目介绍
Fail2Ban 通过扫描日志文件和日志(使用指定的正则表达式,也称为过滤规则)并执行配置的操作以禁止尝试次数过多(匹配指定的过滤规则)的失败。例如,它通过更新系统防火墙规则来拒绝来自这些 IP 地址的新连接,持续时间可配置。但您可以编写或配置自己的操作来禁止主机/IP 等其他内容,例如用户或电子邮件。
安装
我这是使用的Centos系统,以Centos系统为例:
sudo yum install epel-release
sudo yum install fail2ban -y
# 对于centos8,可以使用如下命令:
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
配置
按照惯例,path_f2b
表示 Fail2ban 工作所需的路径。这取决于您的系统。例如,在 Synology 上,我们指的是 /volumeX/docker/fail2ban/
,在其他系统上我们指的是 /etc/fail2ban/
。
配置文件说明
以下是 Fail2ban 的基本配置文件说明:
/etc/fail2ban/jail.conf
或/etc/fail2ban/jail.local
:这是 Fail2ban 的主要配置文件之一,
jail.local
通常用于用户定义的自定义配置。如果在jail.local
中定义了与jail.conf
中相同的规则,将会覆盖jail.conf
中的配置。在这个文件中,你可以配置 jails,也就是定义监视和响应规则的地方。每个 jail 代表一个特定的监视规则。
例如,你可以定义针对SSH登录尝试的监视规则、针对HTTP请求的监视规则等。
需要注意的是,配置规则时需要谨慎,避免封锁了合法用户。
/etc/fail2ban/action.d/
:这个目录包含了 Fail2ban 可用的动作(actions)。动作定义了在检测到恶意行为时应该执行的操作,比如封锁IP地址、发送邮件通知等。
例如,
iptables
是一个常用的动作,用于在防火墙中添加规则以阻止恶意IP。
/etc/fail2ban/filter.d/
:这个目录包含了 Fail2ban 可用的过滤器(filters)。过滤器用于定义如何在日志中匹配恶意行为。
比如,针对 SSH 登录失败的过滤器会匹配相关日志中的错误消息,从而确定是否有恶意登录尝试。
/etc/fail2ban/jail.d/
:这个目录包含了 Fail2ban 针对特定 jails 的自定义配置。
你可以在这里创建单独的配置文件以覆盖默认的 jails 配置。
/etc/fail2ban/fail2ban.conf
:- 这是 Fail2ban 的主要配置文件,包含了全局配置选项,如 loglevel、socket、pidfile 等。
/etc/fail2ban/fail2ban.local
:- 这是一个用于用户自定义配置的文件。如果在此文件中定义了与
fail2ban.conf
中相同的选项,将会覆盖fail2ban.conf
中的配置。
- 这是一个用于用户自定义配置的文件。如果在此文件中定义了与
以上是 Fail2ban 的主要配置文件和目录,它们用于配置监视规则、动作、过滤器等,以保护系统免受恶意登录尝试的攻击。在进行配置时,请务必小心谨慎,以避免误封锁合法用户或导致其他问题。
Fail2ban 的配置规则是在 jail.local
或 jail.conf
文件中定义的。这些规则用于监视日志文件并触发相应的动作以响应恶意行为。
Fail2ban 读取配置文件的顺序如下,.local 会覆盖 .conf:
- /etc/fail2ban/jail.conf
- /etc/fail2ban/jail.d/*.conf
- /etc/fail2ban/jail.local
- /etc/fail2ban/jail.d/*.local
SSH配置示例
fail2ban默认就有一些配置,其中就包括ssh,我们只需要启用即可。
Fail2Ban安装包含一个名为 jail.conf 的默认配置文件。Fail2Ban升级时该文件将被覆盖,因此如果对此文件进行自定义,我们所做的配置修改将会丢失。所以,我们将 jail.conf 文件复制到一个名为 jail.local 的文件中。通过将我们的配置更改放入jail.local,它们将在升级过程中保持不变。这两个文件都会被自动读取Fail2Ban。
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
然后修改 jail.local
文件中的ssh策略(大概在274行):
[sshd]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
enabled = true # 开启jail
bantime = 90 # 封禁时间,默认秒
findtime = 90 # 匹配多长时间内的日志,默认秒
maxretry = 2 # 最大尝试次数
port = ssh # 使用ssh服务
# ignoreip = 127.0.0.1 # 忽略某个ip(白名单)
logpath = %(sshd_log)s
backend = %(sshd_backend)s
Vaultwarden配置示例
Filter
在 path_f2b/filter.d
创建并写入 vaultwarden.local
文件:
# centos的实际路径:/etc/fail2ban/filter.d/vaultwarden.local
[INCLUDES]
before = common.conf
[Definition]
failregex = ^.*?Username or password is incorrect\. Try again\. IP: <ADDR>\. Username:.*$
ignoreregex =
Jail
在 path_f2b/jail.d
创建并写入 vaultwarden.local
文件:
# centos的实际路径:/etc/fail2ban/jail.d/vaultwarden.local
[vaultwarden]
# 是否开启
enabled = true
# 指定监视的服务或对应的端口,例如我的vaultwarden的端口为3333
port = 80,443,3333
# 指定使用的过滤器
filter = vaultwarden
# 默认的动作执行行为,在 action.d 目录下有各种行为策略,默认是 iptables-multiport
banaction = %(banaction_allports)s
# 要筛选的日志路径
logpath = /opt/vaultwarden/vaultwarden.log
# 客户端被封禁的时间,默认单位秒,-1为永久封禁
bantime = 14400
# 日志文件中,在 findtime 时间段内(默认秒),ip 出现超过 maxretry 次数,就会封禁该 IP
findtime = 14400
# 匹配到的阈值(次数)
maxretry = 3
# Specify chain where jumps would need to be added in iptables-* actions
chain = INPUT
常用命令
查看过滤规则是否正确:
# 打印匹配的日志
fail2ban-regex /opt/vaultwarden/vaultwarden.log /etc/fail2ban/filter.d/vaultwarden.local --print-all-matched
# 打印被丢弃的日志
fail2ban-regex /opt/vaultwarden/vaultwarden.log /etc/fail2ban/filter.d/vaultwarden.local --print-all-missed
# 打印忽略的日志
fail2ban-regex /opt/vaultwarden/vaultwarden.log /etc/fail2ban/filter.d/vaultwarden.local --print-all-ignored
查看服务状态:
# 查看启用的监控配置
fail2ban-client status
# 查看指定 JAIL 的详细信息和状态:
fail2ban-client status [JAIL名称]
# 取消某个ip的封禁
fail2ban-client set [JAIL名称] unbanip [IP 地址]
# 取消所有封禁
fail2ban-client unban -all
#查看 iptables 禁 ip 情况
iptables -nvL
容器化部署Fail2Ban
拉取镜像
docker pull crazymax/fail2ban
创建持久化目录
mkdir -p /opt/docker/fail2ban/action.d/ mkdir -p /opt/docker/fail2ban/jail.d/ mkdir -p /opt/docker/fail2ban/filter.d/
启动容器
docker run -d --name fail2ban --network host \ -v /opt/docker/fail2ban:/data \ -v /var/log:/var/log:ro \ -v /opt/vaultwarden:/vaultwarden:ro \ -e TZ=Asia/Shanghai -e F2B_DB_PURGE_AGE=30d \ -e F2B_LOG_TARGET=/data/fail2ban.log -e F2B_LOG_LEVEL=INFO -e F2B_IPTABLES_CHAIN=INPUT \ --privileged --cap-add NET_ADMIN --cap-add NET_RAW \ --restart always crazymax/fail2ban # --network host: 使用主机网络模式。 # --privileged: 给予容器特权(允许容器做一些更高权限的操作)。 # --cap-add: 添加特定的能力,例如 NET_ADMIN 和 NET_RAW。
把相应的配置放入
/opt/docker/fail2ban
中的相应文件夹,然后重启容器即可。
其它
压缩炸弹
现在我们网站几乎每天都有脚本在找后台,结合之前刷到的gzip炸弹文章,直接给以/admin开头的请求全部返回一个高压炸弹,相应压缩包50M左右大小,然后request请求自动解压是50G大小。代码如下:
# 压缩炸弹创建命令,count=1000就是1G,1G压缩后的大小是1M,50G就是count=50000,压缩后的文件为50M,自己取舍
dd if=/dev/zero bs=1M count=1000 | gzip > boom.gz
# nginx配置
location ~ ^/admin {
alias /boom/boom.gz;
add_header Content-Encoding gzip;
add_header Content-Type "text/html";
}