在操作Web服务器时,必须实施安全措施来保护您的站点和用户。使用防火墙策略保护您的网站和应用程序并使用密码身份验证限制对某些区域的访问是保护系统安全的一个很好的起点。但是,任何可公开访问的密码提示都可能会吸引恶意用户和机器人的暴力尝试。
设置fail2ban
可以帮助缓解此问题。当用户反复无法对服务进行身份验证(或从事其他可疑活动)时,fail2ban
可以通过动态修改正在运行的防火墙策略对违规IP地址发出临时禁止。每个fail2ban
“jail”通过检查由服务写入的日志来操作,以指示指示失败尝试的模式。使用附带的配置筛选器可以轻松设置fail2ban
去监视Apache日志。
在本指南中,我们将演示如何安装fail2ban
和配置它以监控Apache日志的入侵尝试。我们将使用Ubuntu 14.04服务器。
在开始之前,您应该使用非root帐户设置Ubuntu 14.04服务器。应为此帐户配置sudo
权限以发出管理命令。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
如果您对使用fail2ban
来保护Apache服务器感兴趣,您也可能已经设置并运行了服务器。如果没有,您可以使用apt
来通过Ubuntu的默认存储库安装Apache 。
通过键入以下命令更新本地包索引并安装:
sudo apt-get update
sudo apt-get install apache2
该fail2ban
服务对于保护登录入口点非常有用。为了使其对Apache安装有用,必须至少对服务器上的一部分内容实施密码身份验证。您可以按照本指南为Apache服务器配置密码保护。
一旦您的Apache服务器运行并启用了密码身份验证,您就可以继续安装fail2ban
(我们在此处包含另一个存储库重新获取,以防您在前面的步骤中已经设置了Apache):
sudo apt-get update
sudo apt-get install fail2ban
这将安装该软件。默认情况下,fail2ban
配置为仅禁止失败的SSH登录尝试。我们需要启用一些规则来配置它,以检查Apache日志中是否存在指示恶意活动的模式。
首先,我们需要调整fail2ban
确定要监视的应用程序日志的配置文件以及在发现违规条目时要采取的操作。已被提供的/etc/fail2ban/jail.conf
文件是该项操作的主要资源。
要进行修改,我们需要将此文件复制到/etc/fail2ban/jail.local
。如果程序包更新提供了新的默认文件,这将阻止我们的更改被覆盖:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
打开新复制的文件,以便我们可以设置Apache日志监控:
sudo nano /etc/fail2ban/jail.local
我们应该首先评估文件中设置的默认值,看看它们是否符合我们的需求。这些将[DEFAULT]
在文件中的部分下找到。这些项设置了一般策略,可以在特定的jails中覆盖每个策略。
要查看的第一个项目之一是不受fail2ban
策略约束的客户列表。这是由ignoreip
指令设置的。有时,最好将自己的IP地址或网络添加到例外列表中,以避免锁定自己。如果您能够维护shell访问权限,那么这不是Web服务器登录的问题,因为您始终可以手动撤消禁令。您可以将空格分隔的其他IP地址或网络添加到现有列表中:
[DEFAULT]
. . .
ignoreip = 127.0.0.1/8 your_home_IP
您可能想要调整的另一个项目是bantime
,它控制违规成员被禁止的秒数。理想的做法是将其设置为足够长的时间以破坏恶意行为者的努力,同时又足够短来允许合法用户纠正错误。默认情况下,此值设置为600秒(10分钟)。根据需要增加或减少此值:
[DEFAULT]
. . .
bantime = 3600
接下来的两个项目确定用于确定违规客户端的日志行的范围。findtime
以秒为指定的时间量和所述的maxretry
指令指示要在该时间内耐受尝试的数目。如果客户在findtime
设定的时间内进行多于maxretry
的尝试,则会被禁止:
[DEFAULT]
. . .
findtime = 3600 # These lines combine to ban clients that fail
maxretry = 6 # to authenticate 6 times within a half hour.
如果您希望在一个禁止发生时接收邮件,则可以启用电子邮件通知。为此,您必须首先在服务器上设置MTA,以便它可以发送电子邮件。要了解如何使用Postfix执行此任务,请按照本指南操作
设置好MTA后,您必须在/etc/fail2ban/jail.local
文件的[DEFAULT]
部分中调整一些其他设置。首先设置mta
指令。如果您按照上面的教程演示设置Postfix,请将此值更改为“mail”:
[DEFAULT]
. . .
mta = mail
您需要选择将发送通知的电子邮件地址。使用此值修改destemail
指令。该sendername
指令可用于修改通知电子邮件中的“发件人”字段:
[DEFAULT]
. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts
在fail2ban
说法中,当客户端认证失败过很多次“行动”的程序将会紧随其后。默认操作(被调用action_
)是简单地禁止有问题的端口的IP地址。但是,如果您设置了邮件,还可以使用其他两个预先制作的操作。
您可以使用该action_mw
操作禁止客户端,并通过有关违规地址的“whois”报告向您配置的帐户发送电子邮件通知。您也可以使用action_mwl
来进行同样的操作,但也包括触发禁令的违规日志行:
[DEFAULT]
. . .
action = %(action_mwl)s
现在您已经有了一些常规fail2ban
设置,我们可以专注于启用特定于Apache的jail,这些jail将监视我们的Web服务器日志以查找特定的行为模式。
配置文件中的每个jail都由一个包含方括号中的jail名称的标头标记(每个部分,但除了[DEFAULT]
部分表示特定的jail的配置)。默认情况下,仅限[ssh]
启用jail。
要为Apache登录尝试启用日志监视,我们将启用[apache]
jail。在此部分中编辑enabled
指令,使其显示为“true”:
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 6
. . .
如果您的Apache服务器正在写入默认日志位置(/var/log/apache/error.log
),则jail已配置为查找正确的位置。如果要登录到其他位置,请根据需要修改logpath
。此外,如果您希望为此特定jail设置不同的限制,请随意调整该maxretry
指令或为此jail 添加findtime
值:
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache/custom_log_location.log
maxretry = 3
findtime = 600
. . .
上述监狱将负责禁止基本身份验证失败。还有一些其他预配置的jails值得启用([apache-multiport]
jail是一个不需要的遗留jail)。
该 [apache-noscript]
jail是用来禁止客户端搜索的网站上的脚本来执行和利用。如果您不将PHP或任何其他语言与Web服务器结合使用,则可以启用此jail以禁止那些请求这些类型资源的人:
[apache-noscript]
enabled = true
. . .
该[apache-overflows]
jail是用来阻止谁试图要求特别长的和可疑的URL的客户。这些通常是尝试通过尝试触发缓冲区溢出来尝试利用Apache的迹象。如果您希望阻止这些类型的攻击,可以启用此jail:
[apache-overflows]
enabled = true
. . .
可以通过复制和粘贴[apache-overflows]
条目并稍微修改它来进行一些额外的检查。例如,您可以复制并粘贴该部分并修改jail名称并过滤apache-badbots
以停止一些已知的恶意bot请求模式:
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 2
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache*/*error.log
maxretry = 2
如果您不使用Apache来访问用户主目录中的Web内容,则可以再次复制并粘贴并将jail和过滤器名称更改为apache-nohome
:
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 2
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache*/*error.log
maxretry = 2
[apache-nohome]
enabled = true
port = http,https
filter = apache-nohome
logpath = /var/log/apache*/*error.log
maxretry = 2
最后,如果您使用Apache与PHP,您可能希望启用[php-url-fopen]
jail,它会阻止尝试将某些PHP行为用于恶意目的。您可能需要更改logpath
指令以指向正确的访问日志位置(在Ubuntu上,默认位置是/var/log/apache2/access.log
)。您可以使用类似于与其他jail中的错误日志匹配的模式:
[php-url-fopen]
enabled = true
port = http,https
filter = php-url-fopen
logpath = /var/log/apache*/*access.log
完成所需的修改后,保存并关闭文件。
要实施配置更改,您需要重新启动该fail2ban
服务。您可以通过键入以下内容来执
sudo service fail2ban restart
该服务应该重新启动,实现您配置的不同禁止策略。
您可以使用以下fail2ban-client
命令查看所有已启用的jail :
sudo fail2ban-client status
你应该看到你启用的所有jail的列表:
Status
|- Number of jail: 7
`- Jail list: php-url-fopen, apache-overflows, apache-noscript, ssh, apache-badbots, apache-nohome, apache
您可以看到fail2ban
已修改防火墙规则以创建禁止客户端的框架。即使没有以前的防火墙规则,您现在可以启用一个框架,允许fail2ban
通过将客户端添加到专用链来有选择地禁止客户端:
sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-apache
-N fail2ban-apache-badbots
-N fail2ban-apache-nohome
-N fail2ban-apache-noscript
-N fail2ban-apache-overflows
-N fail2ban-php-url-fopen
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-nohome
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-badbots
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-php-url-fopen
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-apache -j RETURN
-A fail2ban-apache-badbots -j RETURN
-A fail2ban-apache-nohome -j RETURN
-A fail2ban-apache-noscript -j RETURN
-A fail2ban-apache-overflows -j RETURN
-A fail2ban-php-url-fopen -j RETURN
-A fail2ban-ssh -j RETURN
如果您想查看任何一个监狱强制执行禁令的详细信息,可能再次使用fail2ban-client
更容易:
sudo fail2ban-client status apache
Status for the jail: apache
|- filter
| |- File list: /var/log/apache2/error.log
| |- Currently failed: 0
| `- Total failed: 0
`- action
|- Currently banned: 0
| `- IP list:
`- Total banned: 0
测试您的fail2ban
策略以确保它们按预期阻止流量非常重要。例如,对于Apache身份验证提示,您可以多次提供不正确的凭据。超过限制后,您应该被禁止,无法访问该网站。如果您设置了电子邮件通知,则应在您提供的电子邮件帐户中看到有关禁令的消息。
如果您使用该fail2ban-client
命令查看状态,您将看到您的IP地址被禁止访问该站点:
sudo fail2ban-client status apache
Status for the jail: apache
|- filter
| |- File list: /var/log/apache2/error.log
| |- Currently failed: 0
| `- Total failed: 12
`- action
|- Currently banned: 1
| `- IP list: 111.111.111.111
`- Total banned: 1
如果您对规则的运行感到满意,您可以使用fail2ban-client
通过键入以下内容手动取消禁用您的IP地址:
sudo fail2ban-client set apache unbanip 111.111.111.111
您现在应该可以再次尝试身份验证。
在最简单的情况下,设置fail2ban
来保护Apache服务器非常简单。但是,fail2ban
为构建适合您特定安全需求的策略提供了极大的灵活性。通过查看/etc/fail2ban/jail.local
文件中的变量和模式,以及它们在/etc/fail2ban/filter.d
和/etc/fail2ban/action.d
目录中所依赖的文件,您可以找到许多要根据需求进行调整和更改的部分。学习如何使用fail2ban
来保护服务器的基础知识可以轻松地为您提供极大的安全性。
更多Ubuntu教程请前往腾讯云+社区学习更多知识。
参考文献:《 How To Protect an Apache Server with Fail2Ban on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。