2010-12-11 12 views
46

Estamos utilizando Elmah como nuestro sistema de registro de errores para una aplicación que pronto comenzará a producirse. Es extremadamente útil, pero si entra en producción de esta manera, cualquier persona en el mundo acceda al registro de errores porque todo lo que tienen que hacer es visitar ourdomain.com/elmah.axd.Cómo proteger Elmah.axd?

Esto obviamente no es ideal. Originalmente tenía la intención de restringir el acceso a esa página solo a direcciones IP dentro de nuestra compañía, pero ahora nuestros administradores de sistemas dicen que eso no es posible. Entonces, pregunto ¿cómo puedo evitar el acceso a este recurso?

Nos ejecutando una aplicación ASP.NET MVC en IIS 6.

Respuesta

42

El escenario típico para asegurar elmah.axd está permitiendo solamente algún usuario autenticado para poder acceder a él. Pero si su sitio no usa ninguna autenticación, esto podría no ser aplicable.

Aquí es lo que te recomendaría:

  1. Desactivar completamente el controlador de elmah.axd en su sitio principal
  2. Configurar elmah para escribir los registros a alguna fuente de datos compartidos (como un archivo compartido, base de datos SQLite o incluso SQL Server)
  3. Configure un segundo sitio en IIS, probablemente en otra red o servidor, que solo tenga elmah instalado y que apunte a esta misma fuente de datos compartidos. Ahora siempre usaría el segundo sitio para leer los registros. Obviamente, el segundo sitio solo sería accesible para usted.

Si decide utilizar SQL Server, incluso podría leer los registros de múltiples aplicaciones que se ejecutan en múltiples servidores web en una granja desde una sola aplicación interna a la que solo puede acceder.

+3

esto es realmente una buena sugerencia ... pero toma tiempo configurarlo. Sería genial saber cómo restringir sin la implementación del segundo sitio, etc. –

+3

@Darin, ¿cómo se desactiva el acceso a elmah.axd? gracias – raklos

+3

Tengo una aplicación de administración separada, ambas usan la misma fuente de datos, pero cuando voy a elmah.axd para cada sitio, solo se muestran los errores que ocurrieron en ese sitio, ¿alguna idea? – raklos

15

Puede apuntar el manejador de http de elmah a otra url (por ejemplo, "Secure/elmah.axd") en web.config. Puede asegurar la url como cualquier otra página de asp.net en la configuración web.

<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> 

Estamos utilizando con éxito este enfoque en IIS7 utilizando proveedores de membresía de Active Directory, y funciona muy bien. No estoy seguro si funciona en IIS6 sin embargo.

+1

Debe cambiar la ruta de acceso = "Secure/elmah.axd" a path = "/ Secure/elmah.axd"; de lo contrario, uno puede evitar los permisos de seguridad con /something/Secure/elmah.axd – UpTheCreek

+0

Si agrego el código proporcionado, entonces cualquiera que esté registrado en nuestro sitio puede iniciar sesión fácilmente y ver el archivo de registro. ¿Cuál es la forma correcta de permitir que solo 1 usuario acceda a esto? Agregué '' ¡pero no funcionó! Ayúdame amablemente. – Wasim

+1

Use this m0sa

21

He encontrado que esto es más aceptable para aplicaciones MVC:

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

+0

Esto funcionó perfectamente en nuestro proyecto MVC ya que aprovecha cualquier autenticación personalizada que esté utilizando con MVC. En nuestro caso, agregamos las funciones a las que pertenece el usuario en FormsAuthenticationTicket y deserializamos esta información a través de un Global ActionFilter. Envolviendo a Elmah de esta manera, puedes otorgarle autorización a Elmah como cualquier otra acción del controlador. No necesita meterse con Web.config. ¡Bonito! –

+2

¡Por cierto, hay un paquete NuGet para eso! http://nuget.org/List/Packages/Elmah.MVC –

+1

@alexanderb: Parece que hay una versión actualizada que se encuentra aquí: http://www.beletsky.net/2011/08/latest-version-of-elmah- mvc-controller.html. Gracias por la excelente solución – Denys

9

Si está utilizando ASP.NET membresía, que es bastante fácil para restringir el acceso a la elmah.axd HttpHandler para los usuarios anónimos y sólo se permitir usuarios registrados en un grupo de "Administradores". Lo he hecho así:

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

Cualquiera que haya iniciado la sesión y miembro de la función "Administradores" se puede acceder a la página ahora.

+0

Eso no parece funcionar. Si agrega una carpeta ficticia (por ejemplo, navegue a /foo/elmah.axd), aún muestra la página. – NickG

3

Si su intención es la de desactivar los usuarios remotos accedan a él, basta con cambiar el valor de <security allowRemoteAccess="yes" /> a <security allowRemoteAccess="no" />

2

Solía ​​restricciones de IP de la configuración de IIS 7. De forma predeterminada, no puede simplemente aplicarlo en <location path="elmah.axd"> porque está bloqueado en el nivel de configuración principal. Como tal, creé una carpeta vacía "logs" y aplique restricciones en IIS a esta carpeta, luego modifiqué la ruta de ubicación para el archivo elmah.axd. ¡Eso es! Tiene acceso remoto al yourdomain.com/logs/elmah.axd, pero solo desde direcciones IP específicas.