如何保护Elmah.axd安全?

48

我们正在使用 Elmah 作为即将投入生产的应用程序的错误日志记录系统。它非常有用,但是如果像这样投入生产,任何人都可以访问错误日志,因为他们只需访问ourdomain.com/elmah.axd

显然这不是理想的情况。我最初打算仅将访问权限限制为公司内部的 IP 地址,但现在我们的系统管理员表示这是不可能的。因此,我在这里询问如何防止访问此资源?

我们正在运行一个基于 ASP.NET MVC 的应用程序,并使用 IIS 6。

7个回答

44

保护 elmah.axd 的典型场景是仅允许某些经过身份验证的用户能够访问它。但如果您的网站根本不使用任何身份验证,这可能不适用。

下面是我推荐的做法:

  1. 完全禁用主站点上的 elmah.axd 处理程序
  2. elmah 配置为将日志写入某个共享数据源(如共享文件、SQLite 数据库甚至是 SQL Server)
  3. 在 IIS 中配置第二个站点,可能在另一个网络或服务器上,该站点仅安装了 elmah 并指向相同的共享数据源。现在你将始终使用第二个站点来读取日志。显然,第二个站点只对您可见。

如果您决定使用 SQL Server,您甚至可以从单个内部应用程序中读取运行在多个 Web 服务器上的多个应用程序的日志,该应用程序只能由您访问。


3
这其实是一个非常好的建议...但是设立需要时间。如果不需要部署第二个网站等,了解如何进行限制将是很棒的。 - Alexander Beletsky
3
我有一个单独的管理应用程序,两个网站都使用同样的数据源,但是当我对每个网站的elmah.axd进行访问时,它只显示在该网站上发生的错误 - 有什么想法吗? - raklos
2
我们如何配置 elmah 以从多个应用程序中读取日志? - camelCaseWarrior

21

这在我们的MVC项目中完美地运作,因为它利用了您在MVC中使用的任何自定义身份验证。在我们的情况下,我们将用户所属的角色添加到FormsAuthenticationTicket中,并通过全局ActionFilter反序列化此信息。通过这种方式包装Elmah,您可以像任何其他控制器操作一样授予Elmah授权。您不需要干扰Web.config。很好! - Germán
1
@alexanderb:看起来这里有更新的版本:http://www.beletsky.net/2011/08/latest-version-of-elmah-mvc-controller.html。感谢您提供的出色解决方案。 - Denys

16
您可以在web.config中将elmah http处理程序指向另一个URL(例如“Secure/elmah.axd”)。您可以像保护ASP.NET页面一样在web config中保护此URL。
<httpHandlers>
  ...
  <add verb="POST,GET,HEAD" path="/Secure/elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
</httpHandlers>
<location path="Secure" > <!-- secure the host.com/Secure path -->
  <system.web>
    <authorization>
      <deny users="?" />
      <!-- Or anything else... -->
    </authorization>
  </system.web>
</location>

我们在使用活动目录成员资格提供程序时,在IIS7上成功地采用了这种方法,并且效果很好。但我不确定它在IIS6上是否有效。


1
你需要将 path="Secure/elmah.axd" 改为 path="/Secure/elmah.axd",否则某些人可以通过 /something/Secure/elmah.axd 绕过安全权限。 - UpTheCreek
如果我添加您提供的代码,那么任何在我们网站注册的人都可以轻松登录并查看日志文件。正确的方法是什么,以允许只有一个用户访问它?我已经添加了<allow users="UserName" />,但它没有起作用!请帮帮我。 - Wasim
1
使用此代码:<allow users="UserName" /><deny users="*" /> - m0sa

9
如果您正在使用ASP.NET Membership,那么限制匿名用户访问elmah.axd HttpHandler并仅允许“管理员”组中已登录的用户访问就很容易。我是这样做的:
<configuration>
  ...
  <location path="elmah.axd">
    <system.web>
      <authorization>
        <allow roles="Administrators"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>
</configuration>

现在,任何已登录并且是“管理员”角色成员的人都可以访问该页面。


似乎不起作用。如果添加一个虚构的文件夹(例如导航到/foo/elmah.axd),它仍然显示页面。 - NickG


3

如果你的意图是禁止远程用户访问,只需将<security allowRemoteAccess="yes" />的值更改为<security allowRemoteAccess="no" />


2
我使用了IIS 7配置中的IP限制。默认情况下,您不能简单地在<location path="elmah.axd">中应用它,因为它被锁定在父级配置层面上。因此,我创建了一个空文件夹"logs",并在IIS中对该文件夹应用了限制,然后修改了elmah.axd文件的位置路径。这就是全部内容!您可以远程访问yourdomain.com/logs/elmah.axd,但只能从特定的IP地址访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接