说明:官方资料只有0.8版,仅做参考。
Top

定义


Server(服务器)

Fail2ban由两个部分组成:服务器和客户端。
服务器是多线程的,并在Unix套接字上侦听命令。
服务器本身不受任何配置文件影响。因此在启动时,服务器处于默认状态,其中未定义任何jail。

fail2ban-server有以下可用选项: fail2ban-server仅在调试时使用。
-s <FILE>选项用于设置套接字路径,在调试时显得比较重要。
可以在不同的套接字上运行多个fail2ban实例。但由于fail2ban可以运行多个jail,所以一般不需要运行多个fail2ban实例。

如果fail2ban-server异常崩溃,则套接字文件可能无法正常回收(删除),-x选项告诉服务器在启动前删除以前遗留的套接字文件。
如果正在运行的服务器的套接字文件被删除,则无法再与此服务器通信。
服务器处理信号SIGTERMSIGINT。当接收到其中一个信号时,fail2ban-server将很好地退出。

Client(客户端)

fail2ban-client是fail2ban的前端。它连接到服务器套接字文件并发送命令以配置和操作服务器。
客户端可以读取配置文件,也可以简单地使用命令行或交互模式(使用-i选项激活)向服务器发送单个命令。
fail2ban-client也可以开始服务器。
以下是fail2ban-client可用的选项: 与fail2ban-server一样,选项-s <FILE>可以用于设置套接字路径。
注意,此命令行选项会覆盖掉fail2ban.conf文件中设置的socket选项。
进行调试时,-d是个有用的选项。
# fail2ban-client -d
2023-01-30 16:14:51,875 fail2ban.configreader   [1333]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
['set', 'syslogsocket', 'auto']
['set', 'loglevel', 'INFO']
['set', 'logtarget', '/var/log/fail2ban.log']
['set', 'allowipv6', 'auto']
['set', 'dbfile', '/var/db/fail2ban/fail2ban.sqlite3']
['set', 'dbmaxmatches', 10]
['set', 'dbpurgeage', '1d']
fail2ban-client start命令将尝试探测服务器实例,通过向服务器发送ping请求来等待服务器启动。
一旦服务器对这些请求做出响应,fail2ban-client将解析配置并向服务器发送相应的命令。

fail2ban-client reload命令告诉服务器停止所有实例,再次解析配置文件并将命令发送给服务器。

配置

在FreeBSD系统中,fail2ban的配置文件在/usr/local/etc/fail2ban/目录下,大致结构如下:
/usr/local/etc/fail2ban/
├── action.d                      此目录存放匹配后采取相应动作的文件
│   ├── dummy.conf
│   ├── hostsdeny.conf
│   ├── iptables.conf
│   ├── mail-whois.conf
│   ├── ......
│   └── shorewall.conf
├── fail2ban.conf                 fail2ban-server的配置文件,一般不做改动
├── fail2ban.d
├── filter.d                      存放过滤器配置文件
│   ├── apache-auth.conf
│   ├── apache-noscript.conf
│   ├── couriersmtp.conf
│   ├── postfix.conf
│   ├── proftpd.conf
│   ├── qmail.conf
│   ├── ......
│   ├── sshd.conf
│   └── vsftpd.conf
├── jail.conf                     jail配置文件
└── jail.d/                       此目录默认为空,建议将jail配置文件保存到此目录中,便于管理
每一个.conf文件都可以用一个.local文件覆盖。
fail2ban在加载配置文件时先读取.conf文件,然后读取.local文件,后面的设置覆盖掉前面的设置。
因此,.local文件不必包含.conf文件中的内容,只需要包含希望覆盖的设置。
当fail2ban升级时会覆盖掉.conf文件,因此,对于特殊配置,应写到.local文件中。

Jails

最重要的配置文件为jail.conf,其中包含了jail的声明。
默认情况下某些部分作为模板插入。
必须启用感兴趣的部分并适应本地配置。
以下是ssh-iptables部分的示例:
[ssh-iptables]
#enabled  = false
enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
#          mail-whois[name=SSH, dest=yourmail@mail.com]
#logpath  = /var/log/sshd.log
logpath  = /var/log/auth.log
maxretry = 5
jail选项:
名称 默认值 说明
filter jail用于检测匹配项的过滤器的名称。
过滤器的每一次匹配都会使jail内的计数器递增。
logpath /var/log/messages 提供给过滤器的日志文件的路径。
maxretry 3 触发IP禁止操作的匹配数(即计数器值)。
findtime 600 sec 如果在“findtime”秒内未找到匹配项,则计数器设置为零。
bantime 600 sec 禁止IP的持续时间(秒)。负数表示“permanent(永久)”禁令。

Filters

目录filter.d主要包含用于检测入侵尝试、密码失败等的正则表达式。
以下是filter.d//sshd.conf的示例,其中包含3个可能的正则表达式,以匹配日志文件的行:
failregex = Authentication failure for .* from 
            Failed [-/\w]+ for .* from 
            ROOT LOGIN REFUSED .* FROM 
            [iI](?:llegal|nvalid) user .* from 
在上面的示例中,默认正则表达式已更改为允许在一行中不存在用户,例如:
Jan 10 07:02:37 homebrou sshd[18419]: Failed password for root from 222.76.213.151 port 55236 ssh2

如果要创建自己的failregex表达式,应注意以下几点: 使用fail2ban-regex命令可以测试正则表达式:
# fail2ban-regex 'Jul 18 12:13:01 [1.2.3.4] authentication failed'     'authentication failed'

Running tests
=============

Use   failregex line : authentication failed
ERROR: No failure-id group in 'authentication failed'
执行错误,并返回“No failure-id group”错误。
# fail2ban-regex 'Jul 18 12:13:01 [1.2.3.4] authentication failed'     '\[<HOST>\] authentication failed'

Running tests
=============

Use   failregex line : \[<HOST>\] authentication failed
Use      single line : Jul 18 12:13:01 [1.2.3.4] authentication failed


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] \[<<HOST>\] authentication failed
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1] {^LN-BEG}(?:DAY )?MON Day %k:Minute:Second(?:\.Microseconds)?(?: ExYear)?
`-

Lines: 1 lines, 0 ignored, 1 matched, 0 missed
[processed in 0.02 sec]
执行成功,找到了主机1.2.3.4
# fail2ban-regex '18-07-2008 12:13:01 [1.2.3.4] authentication failed' '\[<HOST>\] authentication failed'

Running tests
=============

Use   failregex line : \[<HOST>\] authentication failed
Use      single line : 18-07-2008 12:13:01 [1.2.3.4] authentication failed


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] \[<HOST>\] authentication failed
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1] {^LN-BEG}Day(?P<_sep>[-/])Month(?P=_sep)(?:ExYear|ExYear2) %k:Minute:Second
`-

Lines: 1 lines, 0 ignored, 1 matched, 0 missed
[processed in 0.02 sec]
执行成功,找到了主机1.2.3.4
# fail2ban-regex '18-7-2008 12:13:01 [1.2.3.4] authentication failed'  '\[<HOST>\] authentication failed'

Running tests
=============

Use   failregex line : \[<HOST>\] authentication failed
Use      single line : 18-7-2008 12:13:01 [1.2.3.4] authentication failed


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] \[<HOST>\] authentication failed
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1] {^LN-BEG}Day(?P<_sep>[-/])Month(?P=_sep)(?:ExYear|ExYear2) %k:Minute:Second
`-

Lines: 1 lines, 0 ignored, 1 matched, 0 missed
[processed in 0.02 sec]
执行成功,找到了主机1.2.3.4
使用以下命令可以测试过滤器的执行结果:
# fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
也可以直接使用正则表达式来测试:
# fail2ban-regex /var/log/auth.log "Failed [-/\w]+ for .* from <HOST>"

Actions

目录action.d包含定义操作的不同脚本。
在执行Fail2ban时,这些动作会在定义明确的时刻执行:启动/停止监狱、禁止/取消主机备份等。

局限

反应时间

首先,fail2ban是一个日志解析器。在日志文件中写入内容之前,它无法执行任何操作。
许多syslog守护进程会对输出进行缓冲,这可能影响fail2ban的性能。因此最好禁用syslog守护进程的缓冲。
其次,很难评估反应时间。
fail2ban在检查要扫描的新日志之前会等待1秒。这可能会导致登录失败次数超过maxretry指定的次数。

本地用户进行DOS攻击的可能性

因为常规用户可以伪造syslog条目,例如:
logger -p auth.warning -t 'sshd[123]' 'Illegal user user1 from 1.2.3.4'
Fail2Ban不应在向没有任何信任级别的未知用户提供ssh/CGI/PHP服务的系统上运行。他们可能能够通过调用logger来阻止其他用户进行ssh和其他访问。
恶意用户还可以通过PHP的openlog()/syslog()向syslog写入。
chmod o-x /usr/bin/logger可以作为一个临时的解决方法。
支持身份验证的日志记录系统(例如journal)可能会在未来提供足够的解决方案。