Fail2Ban登录身份验证管理控制系统
文档来源:15.1 Fail2Ban(基于 IPFW、PF 与 IPF) | FreeBSD 从入门到跑路
根据 官方说明 备份,Fail2Ban 可封禁多次身份验证错误的主机,即通过更新系统防火墙规则来拒绝来自那些 IP 地址的新连接 备份。Fail2Ban 几乎完全由 Python 写就(Python 占比约 96%)。本文适配了 FreeBSD 中常见的三种防火墙------IPFW、PF、IPF,你无需同时配置以上所有防火墙,只需选择其中一款即可。
15.1.1 安装 Fail2Ban
-
使用 pkg 安装:
pkg install security/py-fail2ban
-
或者使用 Ports 安装:
cd /usr/ports/security/py-fail2ban/
make install clean
-
启用 fail2ban 服务,实现开机自动启动:
service fail2ban enable
15.1.2 查看 fail2ban 安装后说明
# pkg info -D security/py-fail2ban
py311-fail2ban-1.1.0_1:
On install:
Please do not edit the fail2ban.conf, jail.conf, or any other
files in the distributen as they will be overwritten upon each
upgrade of the port. Instead, create new files named *.local e.g.
fail2ban.local or jail.local.
# 请不要直接修改 fail2ban.conf、jail.conf 或其他官方提供的配置文件
# 因为它们在每次升级软件包时会被覆盖
# 应该创建 *.local 文件,如 fail2ban.local 或 jail.local,来自定义配置。
For more information, see the official manual:
http://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Configuration
# 更多信息可参见官方手册。
If you have custom filters or actions and you are upgrading from
0.9.x please check them.
# 如果你定义了自定义过滤器或操作,且从 0.9.x 升级而来,请检查其兼容性。
Users of pf: please read the notes in action.d/pf.conf and the
discussion at https://github.com/fail2ban/fail2ban/pull/1925
# 使用 pf 防火墙的用户请阅读 action.d/pf.conf 中的注释,
# 以及上面 GitHub 讨论链接中的相关说明。
Please note that fail2ban will put curly braces '{}' around the
ports in the action so you shouldn't do it yourself.
# 注意:fail2ban 会自动在动作命令中将端口号用大括号 {} 包裹,
# 因此你自己不需要再加。
15.1.3 Fail2Ban 配置解释
注意
此处的
jail不是 BSD 系统中的 jail(一种容器)。这里的 jail 指的是"封禁"的含义。
配置示例位于 /usr/local/etc/fail2ban/jail.conf(勿直接编辑,参见上文),下文仅列出本书所需内容:
# DEFAULT 是全局定义的配置,之后每个 jail 都可以单独覆盖这些设置。
[DEFAULT]
# "ignoreip" 可以是单个 IP 地址、CIDR 子网或 DNS 主机名列表。Fail2Ban
# 不会封禁列表中匹配的主机。多个地址可以使用空格或逗号分隔
# "ignoreip" 即白名单
# ignoreip = 127.0.0.1/8 ::1
# "maxretry" 默认重试次数
maxretry = 5
# 如果主机在过去的 "findtime" 秒内产生了 "maxretry" 次失败,主机将被封禁。
# 即定义封禁频率。
findtime = 10m
# "bantime" 表示主机被封禁的时间,可用秒为单位的整数或时间缩写格式(m 表示分钟,h 表示小时,d 表示天,w 表示周,mo 表示月,y 表示年)
# 即多长时间后可重试。
bantime = 10m
[sshd]
# enabled = true
#
# 参见 jail.conf(5)
# "filter" 定义了 jail 所使用的过滤器。 ①
# 在默认情况下,jail 的名称与其过滤器名称相匹配。
#
filter = %(__name__)s[mode=%(mode)s]
# 例如:
# filter = sshd[mode=aggressive]
#
# 操作快捷方式。用于定义 action 参数。
# Fail2Ban 还需要防火墙来执行封禁动作。
# 默认封禁操作(例如 iptables、iptables-new、iptables-multiport、shorewall 等)。 ②
# 它用于定义 action_* 变量,可以在 jail.local 文件的全局或特定部分中覆盖。
# banaction = iptables-multiport
# banaction_allports = iptables-allports
-
① 列出 fail2ban 的过滤器选项:
ls /usr/local/etc/fail2ban/filter.d/
......省略一部分输出......
bsd-sendmail.conf mssql-auth.conf slapd.conf
bsd-sshd.conf murmur.conf softethervpn.conf
bsdftp.conf mysqld-auth.conf sogo-auth.conf
courier-auth.conf nginx-botsearch.conf sshd.conf
需要注意,以 bsd- 开头的文件(如 bsd-sshd.conf)是 FreeBSD Port 维护者打的补丁。但是在本文中并不能使用。应该直接使用 sshd.conf。
-
② 查看 Fail2Ban 支持的防火墙:
ls /usr/local/etc/fail2ban/action.d/
bsd-ipfw.conf ipfw.conf ipfilter.conf
......省略其他防火墙......
15.1.4 Fail2Ban 封禁配置
创建并编辑文件 /usr/local/etc/fail2ban/jail.d/sshd.conf,写入如下内容:
[DEFAULT]
ignoreip=192.168.0.0/24
maxretry = 3
findtime = 10m
bantime = 8h
[sshd]
enabled=true
filter=sshd
action=bsd-ipfw
配置解释:
- 白名单,表示不会被封禁的 IP 段。
192.168.0.0/24表示从192.168.0.0到192.168.0.254 bsd-ipfw是示例防火墙。你可自选。参见下文。
警告
若使用 IPFW 防火墙,必须选择
bsd-ipfw,而不能使用ipfw,否则无法生效。
15.1.5 配置防火墙
启动 fail2ban 服务:
# service fail2ban start
15.1.5.1 IPFW
Fail2Ban 配置同上。
15.1.5.1.1 配置自启服务
启用防火墙,实现开机自动启动:
# sysrc firewall_enable="YES"
警告
不要 立即执行
start命令,否则可能导致无法通过 SSH 连接。
15.1.5.1.2 修改 IPFW 默认规则
-
IPFW 规则是"默认拒绝",我们改成"默认允许":
echo net.inet.ip.fw.default_to_accept="1" >> /boot/loader.conf # 设置防火墙默认策略为接受,并开机生效
reboot # 重启生效
-
显示当前 IPFW 防火墙规则列表:
ipfw list
......省略一部分......
65535 allow ip from any to any
15.1.5.1.3 参考文献
- man ipfw(8),man 页面
- fail2ban 备份,本节架构基于此
15.1.5.2 PF
15.1.5.2.1 fail2ban 配置文件
将上方配置文件 /usr/local/etc/fail2ban/jail.d/sshd.conf 中 action=bsd-ipfw 改为 action=pf[port={22 23}, name=ssh],其他不需要改。
15.1.5.2.2 修改 PF 配置文件
-
将示例 PF 配置文件复制到 /etc 目录以便修改和使用,否则 PF 无法启动。
cp /usr/share/examples/pf/pf.conf /etc/
-
编辑
/etc/pf.conf,写入:table <f2b> persist # 定义并持久化名为 f2b 的表
anchor "f2b/*" # 创建并引用 f2b 相关的 anchor
block drop in log quick on em0 from <f2b> to any # 在 em0 接口上快速阻止并记录来自 f2b 表的所有流量 -
em0:示例中的em0为笔者的网卡名称,请根据实际网卡修改,可使用命令ifconfig查看
15.1.5.2.3 服务
# kldload pf # 加载内核模块,后边就不需要了
# service pf enable # 开机自启
# service pf start # 启动 PF 防火墙!
15.1.5.2.3.1 参考文献
15.1.5.3 IPFILTER (IPF)
15.1.5.3.1 fail2ban 配置文件
将上方配置文件 /usr/local/etc/fail2ban/jail.d/sshd.conf 中 action=bsd-ipfw 改为 action=ipfilter,其他不需要改。
15.1.5.3.2 服务
-
复制示例文件作为默认配置规则集文件,否则 ipfilter 启动后会没有规则。示例文件自带的规则不影响使用
cp /usr/share/examples/ipfilter/ipf.conf.sample /etc/ipf.rules # 将示例 ipfilter 配置文件复制为 /etc/ipf.rules 以便修改和使用
-
配置守护进程:
service ipfilter enable # 设置 ipfilter 服务开机自启动
service ipfilter start # 启动 ipfilter 防火墙服务
完成上述步骤后,Fail2Ban 即可正常使用。终于不用再配置了,默认就可以用
15.1.6 测试效果
-
为了查看效果,使用 fail2ban 客户端将 IP 192.168.179.1 在 sshd 监控下加入封禁列表
fail2ban-client set sshd banip 192.168.179.1
-
TTY 输出
Mar 25 15:27:38 gkla sshd[970]: error : maximum authentication attempts exceeded for ykla from 192.168.179.1 port 8652 ssh2 [ preauth ]
已建立的 SSH 连接也会被强制断开
15.1.6.1 查看状态
查看 fail2ban 对 sshd 监控的状态,包括被封禁的 IP 列表:
# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 4
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.179.1
15.1.6.2 解禁 IP
从 sshd 监控中解除对指定 IP 的封禁:
# fail2ban-client set sshd unbanip 192.168.179.1
1
# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 4
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 1
`- Banned IP list:
15.1.7 故障排除与未竟事宜
- Fail2Ban 的日志文件位于
/var/log/fail2ban.log文件。
实践
登录FreeBSD的服务器:
ssh xx@39.97.8.x
pkg安装fail2ban
sudo pkg install security/py-fail2ban
启用fail2ban服务
先enable fail2ban
sudo service fail2ban enable
写配置文件
创建并编辑文件 /usr/local/etc/fail2ban/jail.d/sshd.conf,写入如下内容:
[DEFAULT]
ignoreip=192.168.0.0/24
maxretry = 3
findtime = 10m
bantime = 8h
[sshd]
enabled=true
filter=sshd
# action=bsd-ipfw
action=pf[port={22 23}, name=ssh]
这里使用了pf防火墙,如果使用ipfw,就使用这句:action=bsd-ipfw
将防火墙pf的配置文件放入/etc目录
sudo cp /usr/share/examples/pf/pf.conf /etc/
编辑/etc/pf.conf文件,加入:
table <f2b> persist # 定义并持久化名为 f2b 的表
anchor "f2b/*" # 创建并引用 f2b 相关的 anchor
block drop in log quick on vtnet0 from <f2b> to any # 在 em0 接口上快速阻止并记录来自 f2b 表的所有流量
启动pf和fail2ban服务
sudo kldload pf # 加载内核模块,后边就不需要了
sudo service pf enable # 开机自启
sudo service pf start # 启动 PF 防火墙!
这里我认为还需要启动一下fail2ban服务,手册上是在pf防火墙之前启动,我在那之前启动过,没有起作用,pf启动之后,又启动了一次,才起作用。
sudo service fail2ban start
测试
测试一下禁止某ip
sudo fail2ban-client set sshd banip 192.168.179.1
sudo fail2ban-client set sshd banip 123.56.226.x
果然马上就把设定ip的ssh链接给断开了,而且没法登录了。
查看状态
果然该ip被禁止了
sudo fan-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 123.56.xx.xx
去掉禁止
sudo fail2ban-client set sshd unbanip 192.168.179.1
sudo fail2ban-client set sshd unbanip 123.56.226.x
去掉之后就能ssh上来了。
测试输错密码
去做测试,在输入密码错误两次(不知道为什么是两次,我设置的是三次),就被拒绝了,后面再登录都不允许了
ssh 39.97.x.x
Connection closed by 39.97.x.x.x port 22
注意事项
ipfw防火墙
如果使用的是ipfw,那就在配置ipfw的列表之前,不要启动防火墙。
-
IPFW 规则是"默认拒绝",我们要先改成"默认允许":
echo net.inet.ip.fw.default_to_accept="1" >> /boot/loader.conf # 设置防火墙默认策略为接受,并开机生效
reboot # 重启生效
改成默认允许后,再启动防火墙或者重启机器。
pf防火墙
-
将示例 PF 配置文件复制到 /etc 目录以便修改和使用,否则 PF 无法启动。
cp /usr/share/examples/pf/pf.conf /etc/
pf防火墙命令
PF 的管理命令为 pfctl
-
启动 PF 防火墙
pfctl -e
作用:启用 PF,相当于 service pf start。
-
禁用 PF 防火墙规则
pfctl -d
作用:停用 PF 防火墙,相当于 service pf stop。
-
加载规则集文件中的规则
pfctl -f /etc/pf.conf
作用:将 /etc/pf.conf 文件中的规则加载到 PF 中。
-
解析规则但不加载
pfctl -nf /etc/pf.conf
作用:检查规则语法是否正确,但不实际应用。
可选参数:
-N:只解析 NAT 规则-R:只加载过滤规则-A:只加载队列规则-O:只加载选项规则
-
查看 PF 的对象信息
pfctl -s all
作用:显示 PF 的所有对象信息。
可用替换 all 的选项:nat rules info labels等
-
删除 PF 的所有规则
pfctl -F all
作用:删除 PF 中所有已加载的规则和状态信息。
如果想查看特定规则,可以用 nat、queue、rules、states、sources、info、tables、osfp 替换 all。