专栏首页云计算教程系列如何在Ubuntu 14.04上使用Fail2Ban保护Apache服务器
原创

如何在Ubuntu 14.04上使用Fail2Ban保护Apache服务器

介绍

在操作Web服务器时,必须实施安全措施来保护您的站点和用户。使用防火墙策略保护您的网站和应用程序并使用密码身份验证限制对某些区域的访问是保护系统安全的一个很好的起点。但是,任何可公开访问的密码提示都可能会吸引恶意用户和机器人的暴力尝试。

设置fail2ban可以帮助缓解此问题。当用户反复无法对服务进行身份验证(或从事其他可疑活动)时,fail2ban可以通过动态修改正在运行的防火墙策略对违规IP地址发出临时禁止。每个fail2ban“jail”通过检查由服务写入的日志来操作,以指示指示失败尝试的模式。使用附带的配置筛选器可以轻松设置fail2ban去监视Apache日志。

在本指南中,我们将演示如何安装fail2ban和配置它以监控Apache日志的入侵尝试。我们将使用Ubuntu 14.04服务器。

先决条件

在开始之前,您应该使用非root帐户设置Ubuntu 14.04服务器。应为此帐户配置sudo权限以发出管理命令。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

安装Apache并配置密码验证

如果您对使用fail2ban来保护Apache服务器感兴趣,您也可能已经设置并运行了服务器。如果没有,您可以使用apt来通过Ubuntu的默认存储库安装Apache 。

通过键入以下命令更新本地包索引并安装:

sudo apt-get update
sudo apt-get install apache2

fail2ban服务对于保护登录入口点非常有用。为了使其对Apache安装有用,必须至少对服务器上的一部分内容实施密码身份验证。您可以按照本指南为Apache服务器配置密码保护。

安装Fail2Ban

一旦您的Apache服务器运行并启用了密码身份验证,您就可以继续安装fail2ban(我们在此处包含另一个存储库重新获取,以防您在前面的步骤中已经设置了Apache):

sudo apt-get update
sudo apt-get install fail2ban

这将安装该软件。默认情况下,fail2ban配置为仅禁止失败的SSH登录尝试。我们需要启用一些规则来配置它,以检查Apache日志中是否存在指示恶意活动的模式。

调整Fail2Ban中的常规设置

首先,我们需要调整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日志

现在您已经有了一些常规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

完成所需的修改后,保存并关闭文件。

实现Apache Jails

要实施配置更改,您需要重新启动该fail2ban服务。您可以通过键入以下内容来执

sudo service fail2ban restart

该服务应该重新启动,实现您配置的不同禁止策略。

获取有关启用的Jails的信息

您可以使用以下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策略

测试您的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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在CentOS 6上安装DavMail

    如果您的工作场所或学校使用Microsoft Exchange发送电子邮件,您可能希望从不支持Exchange协议的电子邮件客户端访问您的Exchange电子邮...

    丰一川
  • 如何用Molecule测试Ansible角色

    Ansible中的单元测试是确保角色按预期运行的关键。通过允许您指定针对不同环境测试角色的方案,Molecule使此过程更容易。使用Ansible,Molecu...

    丰一川
  • 如何在Debian 9上为用户目录设置vsftpd

    FTP是文件传输协议的缩写,是一种曾经广泛用于在客户端和服务器之间移动文件的网络协议。它已被更快,更安全,更方便的文件传输方式所取代。很多休闲互联网用户希望直接...

    丰一川
  • apache开启重写模式

    现在的好多的框架都使用有路由机制,但是如果在apache下,没有开启重写模式,服务器不会读取路由

    lin_zone
  • Nginx配置Thinkphp

    苦咖啡
  • Java进阶(一)Annotation(注解)

    Annotation是Java5开始引入的特性。它提供了一种安全的类似于注释和Java doc的机制。实事上,Annotation已经被广泛用于各种Java框架...

    Jason Guo
  • cuda编程知识普及

    本帖经过多方整理,大多来自各路书籍《GPGPU编程技术》《cuda高性能》 1 grid 和 block都可以用三元向量来表示: grid的数组元素是bloc...

    用户1154259
  • ES6 学习笔记之对象的拓展

    ES6 简洁方法后与一些面向对象的高级语言(如C++)差不多,函数名+参数+花括号。另外注意简洁写法的属性名是按字符串解析的。方法的属性名可以是一些关键字,由于...

    我与梦想有个约会
  • Java注解Annotation

    @Retention:保留时间,可选值SOURCE(源码)、CLASS(编译时)、RUNTIME(运行时);默认为CLASS,SOURCE大都为Mark Ann...

    用户1205080
  • 小程序添加激励视频广告演示代码详解

    这里官方没有给任何dome,所以很多对js不熟悉的朋友很迷惑,但是仔细看看官方文档,其实写的很详细了,下面我直接展示我得dome

    许坏

扫码关注云+社区

领取腾讯云代金券