Fail2Ban(基于 IPFW、PF 与 IPF)登录身份验证管理控制系统

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.0192.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 参考文献

15.1.5.2 PF

15.1.5.2.1 fail2ban 配置文件

将上方配置文件 /usr/local/etc/fail2ban/jail.d/sshd.confaction=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.confaction=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

  1. 启动 PF 防火墙

    pfctl -e

作用:启用 PF,相当于 service pf start

  1. 禁用 PF 防火墙规则

    pfctl -d

作用:停用 PF 防火墙,相当于 service pf stop

  1. 加载规则集文件中的规则

    pfctl -f /etc/pf.conf

作用:将 /etc/pf.conf 文件中的规则加载到 PF 中。

  1. 解析规则但不加载

    pfctl -nf /etc/pf.conf

作用:检查规则语法是否正确,但不实际应用。

可选参数:

  • -N:只解析 NAT 规则
  • -R:只加载过滤规则
  • -A:只加载队列规则
  • -O:只加载选项规则
  1. 查看 PF 的对象信息

    pfctl -s all

作用:显示 PF 的所有对象信息。

可用替换 all 的选项:nat rules info labels等

  1. 删除 PF 的所有规则

    pfctl -F all

作用:删除 PF 中所有已加载的规则和状态信息。

如果想查看特定规则,可以用 natqueuerulesstatessourcesinfotablesosfp 替换 all

相关推荐
skywalk81637 天前
clonos web界面使用cbsd创建一个bhyve ubuntu server虚拟机(未成功)
linux·运维·服务器·freebsd
skywalk816310 天前
clonos control-pane: FreeBSD下的CBSD的web管理版(未完成,还有500error错误)
服务器·云原生·容器·freebsd·cbsd
skywalk816310 天前
cbsd的clonos/control-pane web管理页面一直闪烁和网页打开显示500error 的问题解决(500error问题未解决)
服务器·前端·freebsd·cbsd
skywalk816312 天前
MiniMax说的FreeBSD系统使用Kubernetes完整指南
云原生·容器·kubernetes·freebsd
skywalk816314 天前
阿里云FreeBSD系统升级cbsd:cbsd: 14.3.2 -> 15.0.0 [FreeBSD]
运维·服务器·freebsd
skywalk816314 天前
阿里云的esc云服务器安装FreeBSD是否支持zfs文件系统
服务器·阿里云·云计算·freebsd
skywalk816320 天前
用bhyve-webadmin来管理FreeBSD系统下的bhyve虚拟机(上)
freebsd·bhyve
skywalk81631 个月前
学习FreeBSD 从入门到跑路:使用 Qjail 管理 Jail
服务器·开发语言·容器·freebsd·虚拟
skywalk81632 个月前
第一次安装FreeBSD15.0 Release版本
运维·服务器·freebsd