介绍雷莫 - 一个简单的方法来保护不安全的在线应用程序与ModSecurity

介绍Remo - 一个简单的方法来保护不安全的在线应用程序与ModSecurity

假设您的Apache网络服务器上有一个令人讨厌的应用程序,这个应用程序已经由营销部门的一些急救人员安装,您不能修补或删除它。 也许这是一个资源问题,缺乏专门知识,缺乏源代码,甚至是由于政治原因。 因此,您需要保护它而不Touch它。 有ModSecurity,但他们说这只是专家。 一个简单的替代方法是Remo ,一种采用白名单方式的ModSecurity图形规则编辑器。 它具有锁定应用程序所需的全部功能。

为了本教程,我们将使用一个非常简单的测试应用程序。 一个这么丑陋,即使你的营销部门也不愿意这样做。 但嘿,这只是一个教程。

<?php
  echo '<pre>';
  echo $_POST['command'];
  echo '<hr />';
  system($_POST['command'], $retval); # needed for 'ls' commands
  echo '</pre>';
  echo '<hr />Return value: ' . $retval;
  echo '<hr />';
  echo '<form action="ls.php" method="post">';
  echo '<input type="text" name="command" value="' . $_POST['command'] . '" />';
  echo '<button>submit</button>';
  echo '</form>';
?>
ls.php: A little script you better remove from your site while you can.

直接执行以命令形式发布的任何shell命令,使得ls.php在任何Web服务器上都是不受欢迎的客户端,或者是一个完美的测试用例来尝试Remo,以保护您免受此脚本的危害。 那么雷莫那么? 在remo.netnea.com上,您将了解到,这是一种简单的方式来配置ModSecurity,而不会成为安全向导。 第二个问题是,Remo是白名单规则,而大多数人使用的是具有黑名单的方式的ModSecurity。 黑名单意味着你告诉ModSecurity有关所有知道攻击的一切。 白名单相反:它确保你的应用程序只能获得输入,你真的想要它得到。 所以ls.php只会得到ls命令作为其命令参数,此外,你将确保在参数中没有使用反引号和分号的脏技巧。 简而言之:Remo帮助在服务器上进行输入验证,而不用Touch应用程序。

安装

您可以在首页的在线演示中给雷莫。 当你想尝试Remo而不先安装它时,那个工作很好。 安装也不是很困难,即使没有配件包准备到目前为止。 确保在下载之前安装了ruby,irb和ruby-sqlite3绑定。

我在Ubuntu测试箱上做了以下工作: 它也适用于Debian:

aptitude install ruby irb libsqlite3-ruby1.8

对于Remo,您可以下载一个版本或拍摄最新的subversion树的快照。 雷莫下载页面告诉您哪些树已通过所有单元测试。 假设我们下载并安装了一个版本。 转到下载页面并获取0.2.0 beta版本。 解压缩tarball并启动WEBrick rails服务器。 从命令行可以归结为:

wget http://remo.netnea.com/files/remo-0.2.0.tar.gz
tar xvzf remo-0.2.0.tar.gz
cd remo-0.2.0
ruby script/server
direct browser to http://localhost:3000/main/index

你应该得到这样的东西:

Remo as it looks after the installation.

我们在这里有点匆忙,因为这个教程是简短的。 所以我只会告诉你必须的东西才能使测试应用程序安全。 指导手中的种类。 你有很多时间自己去探索雷莫。

保护应用程序

删除窗口中的所有默认请求并创建一个新的请求。

Adding a new request to Remo.

单击单击以编辑文本,然后输入应用程序路径的路径: /ls.php ,然后将http方法更改为POST。 打开请求的详细信息,并使用post参数旁边的p *按钮添加一个新的后置参数。 点击名称( 点击编辑 )并进行命令 。 这是我们的示例应用程序ls.php提交的参数

名称的右侧是参数的值域。 这是雷莫的核心部分。 在这里,您可以定义参数可接受的值。 记住,这是白名单:我们正在定义什么是可接受的。 有几个预定义的值,但是在这种情况下我们必须使用Custom 。 如果打开命令参数的详细信息,则会显示一个名为Custom regex的字段。 这是当值域为Custom时,Remo会查找正则表达式。 我将使用ls [0-9a-zA-Z- \ x20 _。] {0,64} 。 这是命令ls后跟一个可选的字符组,由数字,字母,连字符,空格字符下划线和点组成。 没有分号,没有斜杠,没有反驳,没有德国变音符,没有unicode专长:这是你的服务器,你不想在这里没有胡说。

Protection for ls.php is on its way with the definition of the POST  parameter command.

不满足此条件的请求将失败。 Apache的失败请求的默认行为将是返回HTTP状态代码501:方法未实现 。 但是让我们很好:作为状态代码(失败的域匹配),您输入302为http重定向,并在位置(失败的域匹配)下输入您的公司的URL,如http://www.netnea.com 。 所以没有提供正确参数的人将被重定向到您公司的网站。 实际上,您可以通过点击可选项和下面的方式使参数强制,也可以为失败的强制条件设置特殊行为。 但在我们的例子中,参数不一定是强制性的。

如果你想知道这个正则表达式参数将如何变成一个ModSecurity规则,那么看看下面的图形:

This is how a Remo parameter configuration is translated to a ModSecurity rule.

它描述了如何将Remo参数转换为ModSecurity规则,以及在评估过程中会发生什么。 它归结为:每个http请求参数与Remo中定义的值域匹配,如果不适合,则整个请求被拒绝访问。

把它付诸实践

就这样说,让我们生成ModSecurity规则集。 单击工具栏中的生成按钮并保存您将获得的文件。 这是ModSecurity规则语言中的规则文件。 拿这个文件并保存在Apache可以找到的地方。 通过了解Remo如何使用ModSecurity,这是值得一看的。 那么您必须确保在您的网络服务器上启用ModSecurity。 Remo生成ModSecurity 2规则集,因为已经对1.9和2.0之间的配置语言进行了重大更新和扩展,而Remo需要这些新功能。 如果您的发行版不提供ModSecurity软件包,您可以从http://www.modsecurity.org获取大部分软件包 。 否则你可以随时自己编译。 这不是太麻烦了

最好将规则文件包含到您的apache配置中,如下所示:

	
<IfModule mod_security2.c>
	Include /etc/apache2/rulefile.conf
</IfModule>

然后重新加载你的apache并给它一个镜头(我在演示中使用命令行工具Curl ,但你的浏览器将会很好):

curl --data "command=ls -l" http://localhost/ls.php
-rw-r--r--  1 sam    staff     353 Feb  7 13:05 index.html
-rw-r--r--  1 sam    staff     248 Apr 23 05:35 ls.php
...

所以这仍然有效。 滥用ls.php怎么样?

curl --data "command=ls -l; cat /etc/passwd" http://localhost/ls.php
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://www.netnea.com">here</a>.</p>
<hr>
<address>Apache/2.2.3 (Debian) PHP/5.2.0-8 Server at railsmachine Port 80</address>
</body></html>

得到攻击者! 在配置文件中定义了一个审核日志。 默认情况下是/var/log/apache2/modsec_audit.log 。 在本例中将会如下所示:

...
--2957a220-H--
Message: Access denied with redirection to http://www.netnea.com using status 302 (phase 2).
Match of "rx ^(ls\\x20[0-9a-zA-Z-_.]{0,64})$" against "ARGS:command" required. [id "1"]
[msg "Postparameter command failed validity check. Value domain: Custom."] [severity "ERROR"]
Action: Intercepted (phase 2)
...

在进入生产模式之前,请确保该日志不会增长太多。 实际上,当您完成设置后,您可能需要禁用太多的日志记录。 默认情况下,日志文件由Remo配置完成请求日志记录以进行调试。 这包括一切,甚至密码。 完成测试后,您应该将规则文件中的SecAuditLogParts参数设置为更准确的值。 ABHZ是一个选项。 这样它只记录http头和ModSecurity审计摘要。

所以这是对雷莫的快速概述。 在Remo网站上还有更多的内容。 ModSecurity.org有很好的文档,可以告诉你有关配置语言的一切。 此外,还有一个核心规则集,可以帮助您在不需要时间的情况下为您的应用程序建模。 核心规则集始终是一个好的开始,因为它将以很少的努力捕获90%的攻击。

雷莫远未成熟,但它已经准备好使用并给出了一个有用的用户群,它可以开发成一个有趣的工具来保护网络应用程序。 您的应用程序不需要像本教程中使用的那样简单。 更大的应用程序与几十个URL和大量的参数也很好地工作。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏