Procedimientos de seguridad básicos para aplicaciones Web

Actualización: noviembre 2007

El tema de la creación de una aplicación Web segura es muy amplio ya que requiere realizar un estudio para comprender los puntos vulnerables de la seguridad. También es necesario familiarizarse con las posibilidades de seguridad que ofrecen Windows, .NET Framework y ASP.NET. Finalmente, resulta vital entender cómo utilizar estas funciones de seguridad para contrarrestar las amenazas.

Aunque no se tenga mucha experiencia en seguridad, existen unas medidas básicas que se deberían adoptar para proteger cualquier aplicación Web. La lista siguiente proporciona pautas de seguridad mínima que se aplican a todas las aplicaciones Web y que se deberían seguir:

  • Recomendaciones generales de seguridad para aplicaciones Web

  • Ejecutar aplicaciones con privilegios mínimos

  • Conocer a los usuarios

  • Protegerse contra entradas malintencionadas

  • Tener acceso seguro a bases de datos

  • Crear mensajes de error seguros

  • Mantener segura la información confidencial

  • Usar cookies de forma segura

  • Protegerse contra amenazas de denegación de servicio

    Nota:

    Para obtener unas directrices completas y detalladas sobre seguridad que le ayudarán a diseñar, desarrollar, configurar e implementar aplicaciones Web ASP.NET más seguras, vea los módulos de seguridad que se proporcionan en Microsoft Patterns and Practices.

Recomendaciones generales de seguridad para aplicaciones Web

No obstante, incluso los métodos de seguridad de aplicaciones más elaborados pueden verse comprometidos si un usuario malintencionado logra obtener acceso a los equipos usando medios simples. Siga estas instrucciones:

  • Realice copias de seguridad con asiduidad y guárdelas en lugar seguro.

  • Mantenga el equipo del servidor en un lugar físico seguro, de forma que los usuarios no autorizados no puedan tener acceso a él, apagarlo o llevárselo.

  • Utilice el sistema de archivos NTFS de Windows, no el FAT32. NTFS ofrece mucha más seguridad que el FAT32. Para obtener información detallada, vea la documentación de Windows.

  • Proteja el equipo del servidor Web y todos los demás equipos de la misma red con contraseñas rigurosas.

  • Proteja los servicios IIS. Para obtener una información más detallada, visite el sitio Web de Microsoft TechNet Security Center.

  • Cierre los puertos que no se utilicen y desactive los servicios no usados.

  • Ejecute un programa antivirus que supervise el tráfico entrante y saliente.

  • Establezca y haga respetar una política que prohíba a los usuarios tener sus contraseñas escritas en una ubicación fácil de localizar.

  • Use un firewall. Para conocer las recomendaciones, vea el artículo en inglés Microsoft Firewall Guidelines en el sitio Web sobre seguridad de Microsoft.

  • Instale las últimas revisiones de seguridad de Microsoft y otros proveedores. Por ejemplo, para obtener una lista con los últimos boletines de seguridad para todos los productos Microsoft, consulte Microsoft TechNet Security Center. Otros fabricantes tienen sitios parecidos.

  • Use las funciones de registro de eventos de Windows y examine los registros con frecuencia para detectar actividades sospechosas. Esto incluye los intentos repetidos de iniciar una sesión en el sistema o la existencia de un número extremadamente alto de solicitudes en el servidor Web.

Ejecutar aplicaciones con privilegios mínimos

Cuando la aplicación se ejecuta, lo hace en un contexto que tiene privilegios específicos en el equipo local y posiblemente en equipos remotos. Para obtener información sobre cómo configurar identidad de aplicaciones, vea Configurar la identidad de procesos en ASP.NET. Para ejecutar con privilegios mínimos, siga estas instrucciones:

  • No ejecute la aplicación con la identidad de un usuario de sistema (administrador).

  • Ejecute la aplicación en el contexto de un usuario con los mínimos privilegios factibles.

  • Establezca permisos (Listas de control de acceso, o ACL) en todos los recursos requeridos por la aplicación y utilice la configuración menos permisiva posible. Por ejemplo, si resulta viable en la aplicación, establezca que los archivos sean de sólo lectura. Para obtener una lista de los permisos ACL mínimos requeridos para la identidad de su aplicación ASP.NET, vea Listas de control de acceso (ACL) necesarias para ASP.NET.

  • Mantenga los archivos de la aplicación Web en una carpeta ubicada debajo de la raíz de la aplicación. No dé a los usuarios la opción de especificar una ruta que permita tener acceso a ningún archivo de la aplicación. Esto ayudará a evitar que los usuarios obtengan acceso a la raíz del servidor.

Conocer a los usuarios

En muchas aplicaciones, los usuarios tienen acceso al sitio de forma anónima (sin tener que proporcionar las credenciales). Si es el caso, la aplicación obtiene acceso a recursos al ejecutarse en el contexto de un usuario predefinido. De forma predeterminada, este contexto es el usuario ASPNET local (en Windows 2000 o Windows XP) o el usuario NETWORK SERVICE (en Windows Server 2003) del equipo del servidor Web. Para restringir el acceso únicamente a los usuarios que se hayan autenticado, siga estas instrucciones:

  • Si la aplicación pertenece a una intranet, configúrela para usar la seguridad integrada de Windows. De este modo, las credenciales de inicio de sesión de los usuarios se pueden usar para obtener acceso a los recursos. Para obtener más información, vea Suplantación de ASP.NET.

  • Si precisa recabar credenciales del usuario, utilice una de las estrategias de autenticación de ASP.NET. Para obtener un ejemplo, vea Administrar usuarios mediante suscripciones.

Protegerse contra entradas malintencionadas

Como regla general, nunca se debe dar por sentado que la entrada proveniente de los usuarios es segura. A los usuarios malintencionados les resulta fácil enviar información potencialmente peligrosa desde el cliente a la aplicación. Para protegerse contra las entradas malintencionadas, siga estas instrucciones:

  • En las páginas Web ASP.NET, filtre la entrada de los usuarios para comprobar si existen etiquetas HTML, que pueden contener un script. Para obtener información detallada, vea Cómo: Proteger una aplicación Web frente a ataques mediante secuencias de comandos aplicando codificación HTML a las cadenas.

  • Nunca repita (muestre) entrada de los usuarios sin filtrar. Antes de mostrar información que no sea de confianza, codifique los elementos HTML para convertir cualquier script potencialmente peligroso en cadenas visibles, pero no ejecutables.

  • No almacene nunca información proporcionada por el usuario sin filtrar en una base de datos.

  • Si desea aceptar algún elemento de código HTML de un usuario, fíltrelo manualmente. En el filtro, defina explícitamente lo que aceptará. No cree un filtro que intente eliminar cualquier entrada malintencionada, ya que es muy difícil anticipar todas las posibilidades.

  • No dé por sentado que la información obtenida del encabezado de solicitud HTTP (en el objeto HttpRequest) es segura. Proteja las cadenas de consulta, cookies, etc. Tenga en cuenta que la información que el explorador envía al servidor (información del agente de usuario) puede ser suplantada, en caso de que resulte importante para la aplicación en cuestión.

  • Si es posible, no almacene información confidencial en un lugar accesible desde el explorador, como campos ocultos o cookies. Por ejemplo, no almacene una contraseña en una cookie.

    Nota:

    El estado de vista se almacena en un campo oculto en un formato codificado que, de forma predeterminada, incluye un código de autenticación de mensajes (MAC) para que la página pueda determinar si se ha manipulado el estado de vista. Si la información confidencial se almacena en estado de vista, cifre estableciendo la propiedad ViewStateEncryptionMode de la página en true.

Tener acceso seguro a bases de datos

Normalmente, las bases de datos tienen sus propios sistemas de seguridad. Un aspecto importante de una aplicación Web protegida es diseñar un modo de que ésta pueda tener acceso a la base de datos de forma segura. Siga estas instrucciones:

  • Use el sistema de seguridad inherente de la base de datos para limitar quién puede tener acceso a los recursos de dicha base. La estrategia exacta dependerá de la base de datos y de la aplicación:

    • Si resulta viable en la aplicación, use la seguridad integrada de forma que sólo los usuarios autenticados mediante Windows puedan tener acceso a la base de datos. La seguridad integrada es más segura que pasar las credenciales explícitas a la base de datos.

    • Si la aplicación utiliza el acceso anónimo, cree un único usuario con permisos muy limitados, y haga que las consultas se ejecuten conectándose como dicho usuario.

  • No cree instrucciones SQL concatenando cadenas que contengan información aportada por los usuarios. En su lugar, cree una consulta parametrizada y use la entrada del usuario para establecer los valores de los parámetros.

  • Si debe almacenar un nombre de usuario y su contraseña en algún lugar para utilizarlos como las credenciales de inicio de sesión de la base de datos, almacénelos en el archivo Web.config y asegure el archivo con configuración protegida. Para obtener información detallada, vea Cifrar información de configuración mediante una configuración protegida.

Para obtener más información sobre cómo tener acceso a los datos de forma segura, vea Proteger el acceso a datos y Proteger aplicaciones de ADO.NET.

Crear mensajes de error seguros

Si no se es cuidadoso, un usuario malintencionado puede deducir información importante sobre la aplicación a partir de los mensajes de error que ésta muestra. Siga estas instrucciones:

  • No escriba mensajes de error que presenten información que pudiera resultar útil a los usuarios malintencionados, como un nombre de usuario.

  • Configure la aplicación para que no muestre errores detallados a los usuarios. Si desea mostrar mensajes de error detallados para la depuración, determine primero si quien los recibirá es un usuario local con respecto al servidor Web. Para obtener información detallada, vea Cómo: Mostrar mensajes de error seguros.

  • Utilice el elemento de configuración customErrors para controlar quién ve las excepciones desde el servidor.

  • Cree un sistema de administración de errores personalizado para las situaciones que sean propensas a los errores, como el acceso a las bases de datos. Para obtener más información, vea Control de errores en aplicaciones y páginas ASP.NET.

Mantener segura la información confidencial

Información confidencial es toda aquella información que se desea conservar privada. Un ejemplo de información confidencial es una contraseña o una clave cifrada. Si un usuario malintencionado consigue llegar a la información confidencial, los datos protegidos se verán expuestos. Siga estas instrucciones:

  • Si la aplicación transmite información confidencial entre el explorador y el servidor, plantéese utilizar el protocolo SSL (Secure Sockets Layer). Para obtener detalles sobre cómo asegurar un sitio con SSL, vea el artículo Q307267 en inglés, "HOW TO: Secure XML Web Services with Secure Socket Layer in Windows 2000" en Microsoft Knowledge Base en el sitio https://support.microsoft.com.

  • Utilice configuración protegida para proteger la información confidencial en archivos de configuración como los archivos Web.config o Machine.config. Para obtener más información, vea Cifrar información de configuración mediante una configuración protegida.

  • Si debe almacenar información confidencial, no lo haga en una página Web, ni siquiera en un formato que piense que la gente no podrá verlo (por ejemplo, código del servidor).

  • Utilice los algoritmos de cifrado de alta seguridad proporcionados en el espacio de nombres System.Security.Cryptography.

Usar cookies de forma segura

Las cookies constituyen un modo útil de almacenar la información específica disponible sobre los usuarios. Sin embargo, como se envían al explorador del equipo, son vulnerables a la suplantación u otros usos malintencionados. Siga estas instrucciones:

  • No almacene información vital en cookies. Por ejemplo, no almacene, ni siquiera temporalmente, la contraseña de un usuario en una cookie. Como norma, no guarde nada en una cookie que, si se produce una suplantación, pueda comprometer el funcionamiento de su aplicación. En lugar de eso, guarde en la cookie una referencia a la ubicación del servidor en la que se encuentra la información.

  • Establezca el período de tiempo mínimo posible para la fecha de expiración de las cookies. Si es posible, evite las cookies permanentes.

  • Plantéese cifrar la información que contienen las cookies.

  • Considere establecer las propiedades Secure y HttpOnly de las cookies como true.

Protegerse contra amenazas de denegación de servicio

Un modo indirecto en el que un usuario malintencionado puede comprometer una aplicación es haciendo que ésta no esté disponible. El usuario malintencionado puede mantener la aplicación demasiado ocupada como para que pueda servir a otros usuarios, o si puede simplemente bloquearla. Siga estas instrucciones:

  • Use un control de errores (por ejemplo, try-catch). Incluya un bloque final en el que se liberen los recursos si se produce un error.

  • Configure los servicios IIS para utilizar la regulación de procesos, que evita que una aplicación use una cantidad desproporcionada del tiempo de la CPU.

  • Compruebe los límites de tamaño de la entrada del usuario antes de usarla o almacenarla.

  • Incluya límites de tamaño para las consultas a las bases de datos. Por ejemplo, antes de mostrar los resultados de las consultas en una página Web ASP.NET, asegúrese de que no hay un número excesivo de registros.

  • Establezca un límite de tamaño para las cargas de archivos, si éstas forman parte de la aplicación. Puede establecer un límite en el archivo Web.config usando sintaxis como la siguiente, donde el valor maxRequestLength está en kilobytes:

    <configuration>
       <system.web>
            <httpRuntime maxRequestLength="4096" />
       </system.web>
    </configuration>
    

    Asimismo puede utilizar la propiedad RequestLengthDiskThreshold para reducir la sobrecarga de memoria de grandes cargas y devoluciones de formularios.

Vea también

Conceptos

Información general sobre las amenazas para la seguridad de las aplicaciones Web