介绍
任何暴露于互联网的服务容易受到恶意方的攻击。 如果您的服务需要身份验证,非法用户和漫游器将尝试通过重复尝试使用不同的凭据进行身份验证来破解您的系统。
一个常见的例子是SSH,这将是机器人攻击的主题,试图强力常见的帐户名称。 幸运的是,喜欢的fail2ban服务的建立是为了帮助我们缓解这些攻击。
Fail2ban通过动态更改防火墙规则来禁止尝试登录一定次数的地址失败。 在前面的指南中,我们讨论了如何获得的fail2ban起来,在Ubuntu 14.04上运行 。
在本指南中,我们将更深入地讨论fail2ban如何实际工作,以及如何使用此知识来修改或扩展此服务的行为。
基本概念
fail2ban背后的基本思想是监视公共服务的日志,以发现身份验证失败的模式。
当的fail2ban被配置为监测服务的日志,它着眼于已被配置特定于服务的过滤器 。 过滤器设计为通过使用复杂的正则表达式来识别该特定服务的认证失败。 它定义了这些正则表达式模式到一个名为变量failregex
。
幸运的是,fail2ban包括公共服务的过滤器文件。 当在服务的日志文件中的行的匹配failregex
在其过滤器,已定义的动作用于该服务执行。 该action
是可以根据管理员的喜好进行配置做很多不同的事情,一个变量。
默认的操作是通过修改禁止侵入主机/ IP地址iptables
防火墙规则。 您还可以扩大这个动作也发邮件给管理员用whois
攻击或触发该操作的日志行的报告。
你还可以修改动作目标为比通常的其他东西iptables
。 这可以是复杂的或简单的,因为它和许多不同的防火墙配置文件和通知选项可用。
默认情况下,当在10分钟内检测到三个身份验证失败时,将采取操作,默认禁用时间为10分钟。 默认配置文件的SSH部分中将覆盖触发禁止所需的认证失败次数的默认值,以允许在禁止发生之前发生6次失败。 这完全可以由管理员配置。
当使用默认的iptables
目标SSH交通, fail2ban
创建当服务开始了新的链条。 它向INPUT链添加一个新规则,该规则将所有指向端口22的TCP流量发送到新链。 在新链中,它插入返回到INPUT链的单个规则。
这只是让交通跳转到新的链,然后再跳回来。 这对开始时的流量没有影响。 但是,当IP达到认证失败的阈值时,会在新链路的顶部添加一条规则,以删除来自违规IP的流量。 这关心实际禁令。 当禁止期间过期时,将删除iptables规则。 当fail2ban服务退出时,将删除链和关联的规则。
探索Fail2ban服务设置
的fail2ban是通过各种位于下一个层次结构中的文件配置/etc/fail2ban/
目录。
该fail2ban.conf
文件配置的一些基本操作设置,如守护进程将记录信息的方式,插座和pid文件,它将使用。 然而,主配置发生在定义“jails”的文件中。
默认情况下,的fail2ban附带了一个jail.conf
文件。 然而,这可能是在更新覆盖,因此建议用户这个文件复制到jail.local
文件,并做出调整那里。
如果你已经有了一个jail.local
文件,现在打开它跟着一起:
sudo nano /etc/fail2ban/jail.local
如果你没有一个jail.local
文件已经,或者你打开的文件是空白的话,那么复制jail.conf
文件,然后打开新文件:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
我们将看看这里提供的选项,看看这个文件如何与系统上的其他配置文件交互。
默认部分
文件的第一部分将定义fail2ban策略的默认值。 这些选项可以在每个服务的配置部分中覆盖。
删除注释后,默认部分的整体看起来像这样:
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 600
findtime = 600
maxretry = 3
backend = auto
usedns = warn
destemail = root@localhost
sendername = Fail2Ban
banaction = iptables-multiport
mta = sendmail
protocol = tcp
chain = INPUT
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s", sendername="%(sendername)s"]
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"]
action = %(action_)s
让我们来看看这些实际意味着什么:
- ignoreip:该参数标识应当由禁止系统被忽略的IP地址。 默认情况下,这只是设置为忽略来自机器本身的流量,这是一个相当不错的设置。
- bantime:此参数设置禁令的长度,单位为秒。 默认值为600秒,或10分钟。
- findtime:此参数设置的fail2ban会注意寻找重复失败验证尝试时的窗口。 默认值设置为600秒(再次为10分钟),这意味着软件将统计最近10分钟内失败的尝试次数。
- maxretry:设置失败的尝试将在内部被容忍的数量
findtime
窗口禁令提起之前。 - 后端 :这个条目指定的fail2ban将监视日志文件。 的设定
auto
指的fail2ban会尝试pyinotify
,然后gamin
,然后轮询算法基于什么是可用的。 - usedns:定义反向DNS是否被用来帮助实施禁令。 将此设置为“no”将禁止IP本身而不是主机名。 “warn”设置将尝试使用反向DNS来查找主机名并禁止这种方式,但会记录活动进行审核。
- destemail:这是如果配置你的行动来邮件警报将发送通知邮件的地址。
- SENDERNAME:这将在从现场的电子邮件被用于生成通知电子邮件
- banaction:设置在达到阈值时,将要使用的操作。 实际上有位于文件的名称
/etc/fail2ban/action.d/
所谓iptables-multiport.conf
。 这种处理实际iptables
操纵禁止IP地址。 我们稍后会看这个。 - MTA:这是将用于发送通知邮件的邮件传输代理。
- 协议 :这是当IP禁令被实现,这将被丢弃的业务的类型。 这也是发送到新iptables链的流量类型。
- 链 :这是将一个跳转规则被配置为发送流量到的fail2ban漏斗链。
其余参数定义可以指定的不同操作。 他们传递我们上面定义的一些参数使用字符串插值,如下:
%(var_name)s
线以上将与内容被替换var_name
。 利用这一点,我们可以告诉大家, action
变量设置为action_
默认情况下(仅禁令,没有邮件警报)的定义。
这反过来,通过调用配置iptables-multiport
带有参数列表(服务名称,端口,协议和链)采取的措施需要执行这一禁令。 该__name__
取代有由以下部分标题中所指定的服务的名称。
服务特定部分
在默认部分下面,有特定服务的部分可用于覆盖默认设置。 这遵循仅修改偏离正常值的参数的惯例(约定优于配置)。
每个节头都指定为这样:
[service_name]
将读取并启用具有此行的任何部分:
enabled = true
在每个部分中,配置参数,包括应用于解析日志(减去文件扩展名)的过滤器文件和日志文件本身的位置。
牢记这一点,指定SSH服务操作的部分如下所示:
[SSH]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
这将启用此部分并将端口设置为“ssh”端口(端口22)。 它讲述的fail2ban来看看位于日志/var/log/auth.log
本节,并使用在定义的过滤机制来分析日志/etc/fail2ban/filters.d
在一个名为文件目录sshd.conf
。
所有的,它需要的信息其他部分都从定义的参数取[DEFAULT]
部分。 例如,操作将被设置为action_
将禁止使用有问题的IP地址iptables-multiport
banaction,它引用一个名为iptables-multiport.conf
中发现的/etc/fail2ban/action.d
。
正如你所看到的,在行动[DEFAULT]
部分应该是通用性和灵活性。 参数替换以及提供敏感默认值的参数的大量使用将使得在必要时可以容易地重写定义。
检查过滤器文件
为了了解我们的配置中发生了什么,我们需要了解过滤器和操作文件,这是大部分工作。
过滤器文件将确定fail2ban将在日志文件中查找的行,以识别有问题的特征。 操作文件实现所需的所有操作,从启动服务时构建防火墙结构,添加和删除规则,以及在服务停止时拆除防火墙结构。
让我们来看看我们的SSH服务在上面的配置中要求的过滤器文件:
sudo nano /etc/fail2ban/filter.d/sshd.conf
[INCLUDES]
before = common.conf
[Definition]
_daemon = sshd
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from <HOST>( via \S+)?\s*$
^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$
^%(__prefix_line)sFailed \S+ for .*? from <HOST>(?: port \d*)?(?: ssh\d*)?(: (ruser .*|(\S+ ID \S+ \(serial \d+\) CA )?\S+ %(__md5hex)s(, client user ".*", client host ".*")?))?\s*$
^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$
^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUsers\s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because listed in DenyUsers\s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because not in any group\s*$
^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because a group is listed in DenyGroups\s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because none of user's groups are listed in AllowGroups\s*$
ignoreregex =
这看起来很复杂。 这是因为它是相当复杂。 让我们分解一下。
在[INCLUDES]
节标题指定之前或此文件后,被读入其他过滤器文件。 在我们的例子中, common.conf
文件被读入并放置在该文件中的其他行之前。 这将设置一些我们将在我们的配置中使用的参数。
接下来,我们有一个[Definition]
部分定义为我们的过滤器匹配的实际规则。 首先,我们建立我们通过监控守护进程的名称_daemon
参数。
在那之后,我们通过实际failregex
定义,其中规定当日志文件的匹配行发现将触发模式。 这些是基于在用户未正确验证时可以抛出的不同错误和失败进行匹配的正则表达式。
像线的部分%(__prefix_line)s
将与在参数设置的值取代common.conf
,我们执行的文件。 这用于匹配操作系统在使用标准方法时写入日志文件的不同领先信息。 例如,从一些线条/var/log/auth.log
可能是这个样子:
May 6 18:18:52 localhost sshd[3534]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.79.130.213 May 6 18:18:54 localhost sshd[3534]: Failed password for invalid user phil from 101.79.130.213 port 38354 ssh2 May 6 18:18:54 localhost sshd[3534]: Received disconnect from 101.79.130.213: 11: Bye Bye [preauth]
红色部分是操作系统插入以提供更多上下文的标准模式。 之后,有很多不同的方法,iptables服务写入日志失败尝试。
我们在上面的前两行中看到两个单独的失败(PAM认证错误和密码错误)。 在过滤器中定义的正则表达式被设计为匹配任何可能的故障行。 您不应该调整任何这些行,但是您应该知道需要捕获所有的日志条目,表示未经授权的使用错误,您正试图保护的应用程序,如果你必须自己创建一个过滤器文件。
在底部,你可以看到一个ignoreregex
参数,这是目前的空白。 这可以用于排除通常匹配故障条件的更具体的模式,以防您在某些情况下想要为fail2ban否定失败触发器。 我们不会调整这个。
保存并在完成检查后关闭文件。
检查操作文件
现在,让我们来看看动作文件。 此文件负责设置防火墙,其结构允许轻松修改以禁止恶意主机,以及在必要时添加和删除这些主机。
您可能还记得,我们的SSH服务调用动作称为iptables-multiport
。 现在打开关联的文件:
sudo nano /etc/fail2ban/action.d/iptables-multiport.conf
删除注释后,此文件看起来像这样:
[INCLUDES]
before = iptables-blocktype.conf
[Definition]
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
actioncheck = iptables -n -L <chain> | grep -a 'fail2ban-<name>[ \t]'
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>
actionunban = iptables -D fail2ban-<name> -s <ip> -j <blocktype>
[Init]
name = default
port = ssh
protocol = tcp
chain = INPUT
该文件由采购另一种称为操作文件开始起飞iptables-blocktype.conf
简单地定义blocktype
的配置当客户端禁止将设置限制参数。 默认情况下, blocktype
被设置为拒绝报文和回复被禁止客户该端口不可达拒绝消息发送ping命令。 我们将在下面的禁令规则中使用它。
接下来,我们得到规则定义本身。 行动是相当简单的。 该actionstart
行动设立时的fail2ban服务启动iptables防火墙。 它创建一个新链,向该链添加一个规则以返回到调用链,然后在INPUT链的开头插入一个规则,将匹配正确协议和端口目的地的流量传递到新链。
它通过使用我们的传递的价值观做这action
,我们在我们的定义jail.local
文件。 该name
是从节头对各服务的chain
, protocol
和port
从采取action
线本身在该文件中。
你可能还记得,那些,反过来,被插在该文件中的其他位置设置其他参数添加到动作线。 您可能会认识到,fail2ban在其配置文件的各个部分之间传递和转换许多参数。
这里,由另一个文件设置的所有参数通过将参数名称包括在尖括号中来引用:
<param_name>
当我们向下移动到同伴actionstop
定义,我们可以看到,防火墙的命令只是实现逆转actionstart
命令。 我们删除当我们停止fail2ban服务时创建的防火墙结构。
所谓的另一个动作actioncheck
可确保正确的链条之前已经尝试添加禁止规则创建的。
接下来,我们得到的实际禁止规则,称为actionban
。 此规则通过向我们创建的链中添加新规则来工作。 该规则有问题的客户端的源IP地址(这个参数是从当授权日志读取匹配maxretry
达到极限)和研究机构的定义块blocktype
我们在采购的参数[INCLUDE]
部分在顶部文件。
该actionunban
规则简单地删除此规则。 当禁用时间过去时,这由fail2ban自动完成。
最后,我们得到的[Init]
部分。 这只是提供一些默认值,如果调用操作文件,而不传递所有适当的值。
Fail2ban服务如何处理配置文件以实施禁止
现在我们已经看到了细节,让我们来看看fail2ban启动时发生的过程。
加载初始配置文件
首先,主fail2ban.conf
文件被读取,以确定该主处理应根据操作的条件。 如果需要,它将创建套接字,pid和日志文件,并开始使用它们。
接下来的fail2ban读取jail.conf
详细的配置信息文件。 通过阅读它遵循这个,按字母顺序,在找到的所有文件jail.d
目录结束.conf
。 它增加了在这些文件中发现,其内部配置的设置,给了在描述的值新值偏好jail.conf
文件。
然后它搜索一个jail.local
文件并重复此过程,以适应新的值。 最后,它搜索jail.d
再次目录,读取期末按字母顺序排列的文件.local
。
这样,我们可以看到fail2ban有大量的文件,可以用来操作进程的最终行为。 在我们的例子中,我们只有一个jail.conf
文件和jail.local
文件。 在我们的jail.local
文件,我们只需要定义从不同的价值观jail.conf
文件。
fail2ban进程现在有一组加载到内存中的指令,表示它找到的所有文件的组合。
它会检查每一个部分,搜索enabled = true
指令。 如果它找到一个,它使用该部分下定义的参数来构建策略并决定需要什么操作。 未在该服务的部分中找到的任何参数使用的定义的参数[DEFAULT]
部分。
解析操作文件以确定启动操作
的fail2ban寻找一个action
指令要弄清楚什么动作脚本调用执行禁止/ unbanning政策。 如果没有找到,它会回到上面确定的默认操作。
操作指令由要读取的操作文件的名称以及传递这些文件所需的参数的键值字典组成。 这些值通常通过引用服务部分中配置的设置来替换参数。 “姓名”键通常是通过特殊的价值__name__
将被设置为节的标题的值可变。
的fail2ban然后使用此信息来发现的相关文件action.d
目录。 它首先会在结束相关的操作文件.conf
,然后修正与包含在随后的任何设置在那里发现的信息.local
文件中还发现action.d
目录。
它解析这些文件以确定它现在需要采取的操作。 它读取actionstart
值,看看应该采取设置环境的行动。 这通常包括创建防火墙结构以适应将来的禁止规则。
该文件中定义的操作使用从传递给它的参数, action
指令。 它将使用这些值动态创建适当的规则。 如果未设置某个变量,则可以查看操作文件中设置的默认值以填充空白。
解析过滤器文件以确定过滤规则
在该服务的参数jail.*
文件还包括日志文件的位置,以及应该用于检查文件(这是由所限定的轮询机制backend
参数)。 它还包括一个过滤器,应该用于确定日志中的行是否表示失败。
的fail2ban看在filter.d
目录中查找以结束匹配过滤器文件.conf
。 它读取此文件以定义可用于匹配违规行的模式。 然后查找结尾匹配过滤器文件.local
,看是否有默认的参数被覆盖。
它在读取服务的日志文件时使用这些文件中定义的正则表达式。 它试图各failregex
在定义行filter.d
文件与写入到该服务的日志文件中每新行。
如果正则表达式返回匹配,它会针对由定义的正则表达式的行ignoreregex
。 如果这也匹配,fail2ban忽略它。 如果该行的表达式匹配的failregex
但在不匹配的表达式ignoreregex
,内部计数器被增量导致线路和相关联的时间戳被针对事件创建的客户端。
作为时间的设置窗口findtime
在参数jail.*
达到文件(如由事件时间戳确定),内部计数器再次递减,而该事件不再被认为相关的禁止策略。
如果在一段时间内记录了其他身份验证失败,则每次尝试都会增加计数器。 如果计数器达到由设定的值maxretry
,的fail2ban机构禁止通过调用参数组态的时间窗口内actioncheck
如在定义的服务动作action.d/
为服务的文件。 这是确定是否actionstart
动作建立必要的结构。 然后,它调用actionban
行动,禁止违规客户端。 它还为此事件设置时间戳。
时的时间量已经过去,是由指定的bantime
参数,的fail2ban通过调用unbans客户actionunban
动作。
当的fail2ban服务停止时,它会通过调用推倒任何它所创建防火墙规则actionstop
行动。 这通常会删除包含fail2ban规则的链,并从INPUT链中删除导致流量跳转到该链的规则。
结论
希望现在,您对fail2ban如何操作有一个相当深入的了解。 该服务本身对于大多数用户来说是非常容易的,因为大多数困难的配置已经为您服务。
但是,当您偏离标准配置时,了解fail2ban函数以便以可预测的方式操作其行为是有帮助的。
要了解如何使用fail2ban保护其他服务,请查看这些链接: