My favorites | Sign in
Project Home Downloads Wiki Issues Source
Search
for
SecuringErrorLogPages  
How to securely the error log pages from unauthorized users
Phase-Deploy, Featured
Updated Jan 16, 2012 by jamesdri...@gmail.com

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 srober...@gmail.com, Mar 3, 2010

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

Comment by ninesand...@gmail.com, 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 doggy.hu...@gmail.com, 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 rahul....@gmail.com, 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 nag...@gmail.com, Yesterday (27 hours ago)

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

Comment by nag...@gmail.com, Yesterday (27 hours ago)

Sign in to add a comment
Powered by Google Project Hosting