My favorites | Sign in
Project Home Downloads Wiki Issues Source
Search
for
SecuringErrorLogPages  
How to protect the error log pages from unauthorized access
Phase-Deploy, Featured
Updated Aug 13, 2013 by azizatif

Securing Error Log Pages

You can secure ELMAH's display or feeds in two ways:

  • Enabling or disabling remote access
  • Granting or denying access via ASP.NET authorization

Both of these are discussed in the sub-sections that follow.

Why is this so important? See ASP.NET session hijacking with Google and ELMAH.

Enabling or Disabling Remote Access

ELMAH provides a configuration section and a setting to enable or disable remote access to the error log display and feeds. When disabled (the default), only local access to the error log display and feeds is allowed. The snippet below shows how to enable remote access:

<elmah>  
    <security allowRemoteAccess="1" />  
</elmah>  

Remote access is enabled when the value of the allowRemoteAccess attribute is either 1, yes, true or on. Otherwise it is disabled. Local access is always available.

Note: Make sure you have declared the expected configuration sections in order to apply the above configuration. See Declaring configuration sections for more.

Granting or Denying Access via ASP.NET Authorization

If you must enable remote access, it is paramount that you also secure access to only authorized users. You can do this using ASP.NET's built-in authorization mechanism.

Different locations in a web site can be secured with different authorization rules. Suppose your web application is deployed at http://www.example.com/ and ELMAH is configured to respond to elmah.axd. You can secure http://www.example.com/elmah.axd from unauthorized users by adding a location element to your configuration as follows:

<location path="elmah.axd">  
    <system.web>
        <httpHandlers>
            <add verb="POST,GET,HEAD" 
                 path="elmah.axd" 
                 type="Elmah.ErrorLogPageFactory, Elmah" />
        </httpHandlers>
        <authorization>
            <deny users="*" />  
        </authorization>  
    </system.web>
    <system.webServer>
        <handlers>
            <add name="ELMAH" 
                 verb="POST,GET,HEAD"
                 path="elmah.axd" 
                 type="Elmah.ErrorLogPageFactory, Elmah"
                 preCondition="integratedMode" />
        </handlers>
    </system.webServer>
</location>  

There are three important things to note here:

  1. The handler registrations need to be moved under the location tag. Having them outside does not secure access sufficiently.
  2. The location element's path attribute carries the same value as the path attribute of the handler registrations. Unfortunately, it has to be repeated so if you change one, the others must be updated to match.
  3. The authorization element is where the authorization rules go and where you will want to selectively grant access.

The configuration example above denies access to all users, but that is a good starting point. You will probably want to add rules that allow access to only specific users and/or roles. For example, you might have a role for administrators and developers called admin and dev, respectively. To allow users that are members of either role, you could configure the authorization section above as follows:

<authorization>  
    <allow roles="admin" />  
    <allow roles="dev" />  
    <deny users="*" />  
</authorization>  

Further Information

For more information, see also:

Comment by [email protected], Mar 3, 2010

This also assumes you have <authentication mode="Windows" /> Using "None" won't work.

Comment by [email protected], Mar 29, 2010

The stackoverflow link is a good one, I came here with the same question.

I still don't see how to secure the rss feed though. Isn't denying access via .NET Authrization moot if someone can guess your rss URL and subscribe to it?

Comment by [email protected], May 16, 2011

Hi azizatif,

The <location path="elmah.axd"> is not safe at all. Anyone who can bypass the location restriction by prepend path before the almah.axd.

For example, Anyone can request elmah.axd by http://xxxx.xxx/a/b/c/d/elmah.axd that can by pass the <location path="elmah.axd"> limitiations!!

-Will

Comment by [email protected], Jul 10, 2011

I think a better way of implementing this would be to set up elmah as : <add verb="POST,GET,HEAD" path="/admin/elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />

This ensures that elmah.axd is available only under the 'admin' folder and nowhere else. After that it simply becomes a case of securing a resource which can be done using roles or user accounts. A sample of what we did is given below:

<location path="admin/elmah.axd">

<system.web>
<authorization>
<allow users="User1"/> <allow users="User2"/>
<deny users="*"/>
</authorization>
</system.web>
</location>

Comment by dirkwatkins, Jan 4, 2012

@rahul's idea is awesome. I changed my implementation to only handle it under the admin folder too. Thanks!

Comment by [email protected], Feb 12, 2012

@rahul's idea is very bad! Call the "url"/"anything"/admin/elmah.axd ...

Comment by psinke, Sep 17, 2012

Best way we've implemented this is, create a second website, point Elmah to the same database wher e you log errors from the first site, and IPSEC protect the second website to only allow certain Ipaddresses to access. Turn off remoteaccess to Elmah on the first website.

Comment by [email protected], Aug 12, 2013

Summary:

How to securely the error log pages from unauthorized users

Not to nit-pick, but the use of grammar here is in need of some improvement. A better way to say what you are trying to say would be:

How to protect the error log pages from unauthorized access.

Comment by [email protected], Jun 30, 2014

Where do we place the Authorize config section ?

Comment by [email protected], Mar 17, 2015

This also assumes you have <authentication mode="Windows" /> Using "None" won't work. http://wdfshare.blogspot.com

Powered by Google Project Hosting