如何保护 Elmah.axd?

Posted

技术标签:

【中文标题】如何保护 Elmah.axd?【英文标题】:How to secure Elmah.axd? 【发布时间】:2011-05-23 21:53:50 【问题描述】:

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

这显然不理想。我原本打算只对我们公司内的 IP 地址访问该页面,但现在我们的系统管理员说这是不可能的。所以我在这里问我怎样才能阻止访问这个资源?

我们在 IIS 6 上运行 ASP.NET MVC 应用程序。

【问题讨论】:

【参考方案1】:

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

以下是我的建议:

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

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

【讨论】:

这实际上是一个非常好的建议.. 但设置需要时间。很高兴知道如何在不部署第二个站点等的情况下进行限制。 我有一个单独的管理应用程序,两者都使用相同的数据源,但是当我为每个站点访问 elmah.axd 时,它只显示该站点上发生的错误 - 有什么想法吗? 我们如何配置 elmah 以读取来自多个应用程序的日志?【参考方案2】:

我发现这对于 MVC 应用程序来说是最可以接受的:

http://www.beletsky.net/2011/03/integrating-elmah-to-aspnet-mvc-in.html

【讨论】:

这在我们的 MVC 项目中完美运行,因为它利用了您在 MVC 中使用的任何自定义身份验证。在我们的例子中,我们将用户所属的角色添加到 FormsAuthenticationTicket 中,并通过 Global ActionFilter 反序列化此信息。以这种方式包装 Elmah,您可以像任何其他控制器操作一样授予 Elmah 授权。您不需要弄乱 Web.config。不错! @alexanderb:看起来这里有更新版本:beletsky.net/2011/08/…。感谢您的出色解决方案【参考方案3】:

您可以将 elmah http 处理程序指向 web.config 中的另一个 URL(例如“Secure/elmah.axd”)。您可以像 Web 配置中的任何其他 asp.net 页面一样保护 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 上使用 Active Directory 成员资格提供程序成功地使用了这种方法,并且效果很好。我不确定它是否适用于 IIS6。

【讨论】:

您需要将 path="Secure/elmah.axd" 更改为 path="/Secure/elmah.axd" 否则可以使用 /something/Secure/elmah.axd 绕过安全权限 如果我添加您给定的代码,那么在我们网站上注册的任何人都可以轻松登录并查看日志文件。只允许 1 个用户访问它的正确方法是什么?我添加了&lt;allow users="UserName" /&gt;,但它不起作用!请帮助我。 使用这个 【参考方案4】:

如果您使用 ASP.NET 成员资格,很容易限制匿名用户对 elmah.axd HttpHandler 的访问,并且只允许“管理员”组中的登录用户。我是这样做的:

<configuration>
  ...
  <location path="elmah.axd">
    <system.web>
      <authorization>
        <allow roles="Administrators"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>
</configuration>

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

【讨论】:

这似乎不起作用。如果您添加一个虚构的文件夹(例如导航到 /foo/elmah.axd),它仍然会显示该页面。【参考方案5】:

这里有一些有用的链接:

Securely Implement ELMAH For Plug And Play Error Logging Securing Error Log Pages

【讨论】:

【参考方案6】:

如果您打算禁止远程用户访问它,只需将&lt;security allowRemoteAccess="yes" /&gt; 的值更改为&lt;security allowRemoteAccess="no" /&gt;

【讨论】:

【参考方案7】:

我使用了 IIS 7 配置中的 IP 限制。默认情况下,您不能简单地将其应用到&lt;location path="elmah.axd"&gt;,因为它已锁定在父配置级别。因此,我创建了一个空文件夹 "logs" 并在 IIS 中对该文件夹应用了限制,然后修改了 elmah.axd 文件的位置路径。而已!您可以远程访问yourdomain.com/logs/elmah.axd,但只能通过特定 IP。

【讨论】:

以上是关于如何保护 Elmah.axd?的主要内容,如果未能解决你的问题,请参考以下文章

当我浏览 http://localhost:8004/elmah.axd 时,它会生成 404 错误

ASP.NET MVC - Elmah 不工作并为 elmah.axd 返回 404 页面

导航到“/elmah.axd”时会抛出“缺少根元素”错误

针对 elmah.axd 的请求总是失败并返回 500 - 内部服务器错误。为啥? :-(

在 Apache 上运行 ASP.net MVC 时无法访问 elmah.axd

Elmah 不适用于 asp.net mvc