使用Fail2ban保护服务器
Zhongy0410
・19 分钟阅读
使用Fail2ban保护服务器
Fail2ban主要关注SSH攻击,它可以进一步配置为适用于使用日志文件的任何服务,尽管可能有所妥协,注释本指南所需的步骤需要root特权,请确保以root或sudo
前缀运行以下步骤,有关特权的详细信息,请参阅我们的用户和组指南,
小心Fail2ban应该与已经经过硬化的服务器一起使用,不应该用作安全防火墙规则的替代,
安装Fail2Ban
你可能还希望在开始之前检查保护你的服务器指南。
CentOS 7
确保你的系统是最新的,并安装EPEL存储库:
yum update && yum install epel-release
安装Fail2Ban :
yum install fail2ban
如果你另外想要电子邮件支持,请安装Sendmail ,使用Fail2Ban不是必须要有Sendmail:
yum install sendmail
启动并启用Fail2ban,如果需要,请启用Sendmail :
systemctl start fail2ban systemctl enable fail2ban systemctl start sendmail systemctl enable sendmail
注释
如果遇到"没有目录/var/run/fail2ban包含套接字文件/var/run/fail2ban/fail2ban.sock "的错误,请手动创建目录:
mkdir /var/run/fail2ban
Debian
确保你的系统是最新的:
apt-get update && apt-get upgrade -y
安装Fail2Ban :
apt-get install fail2ban
服务将自动启动。
(可选)如果你想要电子邮件支持,请安装Sendmail :
apt-get install sendmail-bin sendmail
注释
当前的Debian Jessie 的Sendmail版本有一个上游bug,这会导致安装sendmail-bin时出现下列错误,安装将挂起一分钟,然后完成。
Creating /etc/mail/sendmail.cf... ERROR: FEATURE() should be before MAILER() MAILER('local') must appear after FEATURE('always_add_domain') ERROR: FEATURE() should be before MAILER() MAILER('local') must appear after FEATURE('allmasquerade')
Fedora
更新你的系统:
dnf update
安装Fail2Ban :
dnf install fail2ban
(可选)如果你想要电子邮件支持,请安装Sendmail :
dnf install sendmail
启动并启用Fail2ban,如果需要,请启用Sendmail :
systemctl start fail2ban systemctl enable fail2ban systemctl start sendmail systemctl enable sendmail
UBUNTU
确保你的系统是最新的:
apt-get update && apt-get upgrade -y
安装Fail2Ban :
apt-get install fail2ban
服务将自动启动。
(可选)如果你想要电子邮件支持,请安装Sendmail :
apt-get install sendmail
允许通过UFW访问SSH,然后启用防火墙:
ufw allow ssh ufw enable
配置Fail2Ban
Fail2ban首先读取.conf配置文件,然后.local文件会覆盖任何设置,因此,对配置所做的所有更改都通常在.local文件中完成,要保留了.conf文件不动。
配置fail2ban.local
fail2ban.conf包含默认配置文件,默认设置将给你一个合理的工作设置,如果要进行任何更改,最好在单独的文件
fail2ban.local
中执行它,该文件重写fail2ban.conf
,将副本fail2ban.conf
重命名为fail2ban.local
。cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
在这里,你可以选择编辑
fail2ban.local
中的定义以匹配你所期望的配置,可以更改的值是:- loglevel :Fail2ban提供程序日志可设置为1(error),2(warn),3(info)或4(debug)的详细信息级别,
logtarget
:将操作记录到特定文件中,/var/log/fail2ban.log
的默认值将所有日志记录放入已定义的文件中,或者,你可以将该值更改为:STDOUT
:输出任何数据STDERR
:输出任何错误SYSLOG
:基于消息的日志记录FILE
:输出到文件
socket
:套接字文件的位置,pidfile
:PID文件的位置,
配置jail.local设置
默认情况下,jail.conf文件将为Debian和Ubuntu自动启用Fail2ban的,但是,不支持CentOS ,所有其他协议和配置(HTTP,FTP,等等)都被注释掉了,如果要更改此选项,请创建一个用于编辑的
jail.local
:cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
如果使用CentOS或Fedora,你将需要将
jail.local
中的backend
选项从auto改为systemd ,在Debian 8或Ubuntu 16.04上这不是必须的,即使两者都使用了systemd 。- /etc/fail2ban/jail.local
1 2 3 4 5 6 7
# "backend" specifies the backend used to get files modification. # Available options are "pyinotify", "gamin", "polling", "systemd" and "auto". # This option can be overridden in each jail as well. . . . backend = systemd
缺省情况下,在CentOS 7.中没有启用jail,例如,要启用SSH守护进程,请取消注释
jail.local
中的以下行:- /etc/fail2ban/jail.local
1 2
[sshd] enabled = true
白名单IP
若要忽略特定的IP,请将它们添加到ignoreip行,默认情况下,此命令不会禁止本地主机,如果通常使用单个IP地址,则可能有利于将它添加到忽略列表中:
- /etc/fail2ban/jail.local
1 2 3 4 5 6
[DEFAULT] # "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not # ban a host which matches an address in this list. Several addresses can be # defined using space separator. ignoreip = 127.0.0.1/8 123.45.67.89
如果你希望仅针对某些jail启用IP,则可以使用fail2ban-client命令完成这个操作,将JAIL
替换为你的监狱名称,并且123.45.67.89
与你想要白名单的IP一起使用。
fail2ban-client set JAIL addignoreip 123.45.67.89
禁止时间和重试总数
设置bantime
,findtime
和maxretry
以定义禁止的情况和时间长度:
- /etc/fail2ban/jail.local
1 2 3 4 5 6 7
# "bantime" is the number of seconds that a host is banned. bantime = 600 # A host is banned if it has generated "maxretry" during the last "findtime" # seconds. findtime = 600 maxretry = 3
bantime :屏蔽IP的时间长度(以秒为单位),如果设置为负数,则屏蔽为永久性,600的默认值设置为持续禁止IP10分钟时间 。
findtime :设置屏蔽之前登录尝试之间的时间长度,比如,如果将Fail2ban设置为在五次(5)失败后禁用一个IP,则将禁用一个IP ,这5次尝试必须在设置10分钟findtime限制内发生,
findtime
值应该是一组秒数。maxretry :在强制执行屏蔽之前,可以尝试从单个IP访问服务器的次数。 默认值设置为3.
电子邮件提示
要在fail2ban触发时接收电子邮件,请调整电子邮件设置:
destemail
:你希望接收电子邮件的电子邮件地址。sendername
:电子邮件显示的名称。sender
:Fail2ban将发送电子邮件的电子邮件地址。
注释如果不确定如何放置sender
,请运行sendmail -t user@email.com
命令,用你的电子邮件地址替换user@email.com
,检查电子邮件(如果需要,包括垃圾邮件文件夹),并且查看发件人电子邮件,此地址可用于上述配置,
你还需要调整action设置,它定义了在屏蔽阈值时发生的操作,默认情况下,%(action_)s
只禁止用户,%(action_mw)s
将禁止使用WhoIs报告发送电子邮件; 当%(action_mwl)s
将禁止使用WhoIs报告和日志文件中的所有相关行发送电子邮件,这也可以在监狱特定的基础上进行更改。
其他监狱配置
除了上述基本设置地址之外,jail.local
还包含许多常见服务(包括SSH )的各种监狱配置,默认情况下,仅启用SSH 。
平均监狱配置如下所示:
- /etc/fail2ban/jail.local
1 2 3 4 5 6 7
[ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 6
enabled
:确定过滤器是否已打开,port
:端口Fail2ban应该对服务进行引用,如果使用默认端口,则可以在这里放置服务名称,如果使用非传统端口,则应该是端口号,例如,如果将SSH端口移动到3456,则将用3456
替换ssh
,filter
:/etc/fail2ban/filter.d
中文件的名称,它包含用于正确解析日志文件的failregex信息,不需要包含.conf
后缀,logpath
:给出服务日志的位置,maxretry
:将覆盖已定义服务的全局maxretry
,还可以添加findtime
和bantime
,action
:如果默认操作不适用于jail,则可以添加为附加设置,可以在action.d
文件夹中找到其他操作,
注释jail也可以配置为放置在jail.d
目录中的单个.conf
文件,格式将保持不变,
Failregexs
尽管Fail2ban带有许多过滤器,但是,你可能需要进一步定制这些过滤器或创建自己的过滤器以满足你的需求,Fail2ban使用正则表达式(regex)来解析日志文件,查找尝试入侵和密码失败的实例。Fail2ban使用python扩展的正规表达式。
理解failregex如何工作的最好方法是编写一个,虽然我们不建议Fail2ban在大型网站上监视Wordpress的access.log,但是,它提供了一个易于理解的日志文件的实例。
为Fail2ban编写正规表达式
导航到网站的
access.log
(通常位于/var/www/example.com/logs/access.log
)查找失败的登录尝试,它将类似于:- /var/www/example. com/logs/access.log
1
123.45.67.89 - - [01/Oct/2015:12:46:34 -0400] "POST /wp-login.php HTTP/1.1" 200 1906 "http://example.com/wp-login.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0"
请注意,你只需要跟踪
200
:- /var/www/example. com/logs/access.log
1
123.45.67.89 - - [01/Oct/2015:12:46:34 -0400] "POST /wp-login.php HTTP/1.1" 200
失败尝试产生的IP地址总是被定义为,后面几个字符是不变的,可以作为文字输入:
- - [
前面的
[
表示正方括号的读取方式。下一节,登录尝试的日期,可以使用正规表达式表达式以分组表达式的形式写入,在本示例中,第一个部分
01
可以写成(d{2})
: 括号将表达式分组,而且d
查找任何数字数字,{2}
注意到表达式在一行,换句话说,月的日期中查找两位数字。到目前为止,你应该拥有:
- - [(d{2})
然后将以正向斜杠调用下面的斜杠,后面跟着w{3},查找一系列3 alpha数字字符(即,A-Z, a-z,0-9,任何大小写),以下正斜杠也应该是文字:
- - [(d{2})/w{3}/
年份的部分应该类似于日,但是,不需要捕获组,并且对四个连续字符(还有一个冒号):
- - [(d{2})/w{3}/d{4}:
下一个序列是组成时间的两个数字序列,因为我们将月份的日期定义为捕获组(括号)中的两个数字,所以可以使用
1
(因为它是第一个捕获组)对它进行反向引用,同样,冒号将是文字:- - [(d{2})/w{3}/d{4}:1:1:1
如果你不希望使用引用,也可以将它编写为:
- - [d{2}/w{3}/d{4}:d{2}:d{2}:d{2}
应该以类似于年份的方式编写
-0400
段,并使用附加的文本-
:-d{4}
最后,可以关闭方括号(先用反斜杠转义),并用文字字符串完成其余部分:- - [(d{2})/w{3}/d{4}:1:1:1 -d{4}] "POST /wp-login.php HTTP/1.1" 200
或者:
- - [d{2}/w{3}/d{4}:d{2}:d{2}:d{2} -d{4}] "POST /wp-login.php HTTP/1.1" 200
应用Failregex
创建failregex之后,需要将它添加到过滤器中。
导航到Fail2ban目录的
filter.d
:cd /etc/fail2ban/filter.d
创建一个名为
wordpress.conf
的文件,并添加你的failregex :- /etc/fail2ban/filter.d/wordpress.conf
1 2 3 4 5 6 7 8
# Fail2Ban filter for WordPress # # [Definition] failregex = - - [(d{2})/w{3}/d{4}:1:1:1 -d{4}] "POST /wp-login.php HTTP/1.1" 200 ignoreregex =
保存并退出。
将WordPress部分添加到
jail.local
:- /etc/fail2ban/jail.local
1 2 3 4 5
[wordpress] enabled = true filter = wordpress logpath = /var/www/html/andromeda/logs/access.log port = 80,443
这将使用默认的禁止和电子邮件操作,其他操作可以通过添加
action =
行来定义。保存并退出,然后重新启动Fail2ban 。
使用Fail2ban客户端
Fail2ban提供一个命令fail2ban-client
,可用于从以下位置运行Fail2ban :
fail2ban-client COMMAND
start
:启动Fail2ban服务器和jail ,reload
:重新加载Fail2ban文件的配置,reload JAIL
:用Fail2ban jail的名字替换JAIL
; 这将重新载入监狱,stop
:终止服务器,status
:将显示服务器的状态,并启用jail ,status JAIL
:将显示监狱的状态,包括任何当前被禁止的IPs ,
例如,要检查Fail2Ban是否正在运行以及SSHd jail是否已启用,请运行:
fail2ban-client status
输出应该是:
Status
|- Number of jail: 1
`- Jail list: sshd
有关fail2ban-client
命令的其他信息,请参见Fail2ban wiki 。