Cargar o no cargar archivos. ¡Ese es el dilema!

el

En cualquier momento en la vida de un programador, administrador de sistemas o especialista en seguridad, se llega a este dilema, aceptar o no que los clientes finales suban archivos a tus servidores. Bien sea porque esto va a mejorar los procesos, permitirá a los usuarios autogestionarse, facilitará las operaciones, en fin, existen muchas razones por las cuales los negocios desean darle esta facilidad a los usuarios finales. Lo que no deben olvidar las empresas es que allá afuera, además de los usuarios “normales”, también existen los usuarios maliciosos, que siempre estan en la búsqueda de una oportunidad de echarle mano a los datos, robarse la información o peor aún, destruirte tu centro de datos.

¿Hacerlo o no?

Teniendo presente las amenazas que se abren al permitir que los usuarios carguen archivos a tus servidores y sabiendo que no todos los usuarios son corderitos, la respuesta definitiva a la interrogante es SI. Un gran y rotundo sí, si las ventajas que esta funcionalidad le va a brindar al negocio supera con creces los factores de riesgo que supone habilitar dichas funcionalidades. La idea es hacerlo de forma segura.

¿Como lo hacemos?

Para permitir que los usuarios finales puedan cargar archivos de forma correcta, se deben tratar a todos los usuarios como maliciosos, y no permitirles la interacción directa con los archivos cargados, si los usuarios necesitan interactuar con los archivos deben hacerlo de forma indirecta. La idea es crear varias capas de protección.

Crear nombres de archivos nuevos.

No permita que los usuarios sepan el nombre del archivo tal cual como será almacenado, una vez que el usuario cargue el archivo, cambiele el nombre a un nombre que sea difícil de adivinar, para esto, puede usar alguna función de hashing y agregarle un estampado de tiempo para evitar posibles duplicados. Tampoco permita que los usuarios utilicen caracteres potencialmente peligrosos en los campos de entrada, como por ejemplo: “;”, “:”, “>”, “<”, “/” ,”\”, “*”, “%”, “$”, Se debe permitir un solo punto para separar el nombre de la extensión. Si posteriormente se requiere que el usuario interactúe con el archivo, utilice una tabla de equivalencias.

Limite el nombre de los archivos.

Los archivos no deberían tener más de 255 caracteres y tampoco deberían estar vacíos.

Almacenar los archivos en una ubicación diferente a tu aplicación.

Esta recomendación parece obvia, pero a estas alturas, todavía existe mucha gente que almacena los archivos en la misma ubicación que su aplicación, incluso dentro de la carpeta de ejecutables. Guardando los archivos cargados por los usuarios en ubicaciones distintas a la de la aplicación, permite aplicarles varios controles adicionales.

Aplique un control fuerte de permisología.

Los archivos cargados deberían tener solo privilegio de lectura. JAMÁS!!!! y nunca privilegios de ejecución. Los archivos una vez que son cargados al servidor pasan a ser propiedad del usuario Web de nuestra aplicación, dicho usuario solo debe tener privilegios de lectura y no de ejecución. Incluso al estar en una ubicación distinta, la carpeta donde sean alojados, tampoco debería tener privilegios de ejecución.

Verifique el tamaño de los archivos y limite la cantidad de archivos que pueden ser cargados por usuario.

Comprobar el tamaño de los archivos y la cantidad de archivos es vital, puede ser posible que sea víctima de un ataque de denegación de servicios por consumo de la capacidad de almacenamiento. Aunque la recomendación número 2 va en la línea de evitar este tipo de ataques.

Monitoree la capacidad de almacenamiento.

Esta recomendación se desprende de la tercera. Pero además de eso, se requiere que se establezca una política de ¿que hacer cuando el espacio se llene? Se va a mover a un area distinta, se depura, se compacta, se agrega más espacio.

Limpie los archivos de metadatos.

Ya hemos visto que varios tipos de archivos pueden contener “metadatos” y se pueden introducir amenazas a través de los mismos. Se deben aplicar mecanismos de limpieza de metadatos antes de guardar los archivos en nuestros servidores.

No confíe en los nombres y extensiones de los archivos.

El pensar que los archivos de imagenes JPG o PDF, no son peligrosos es cosa de niños, cualquier archivo, puede contener código malicioso. Use programas que validan el contenido y que le garanticen que una foto en verdad es una foto.

Utilice programas antivirus y antimalware.

Las ubicaciones que se utilicen para almacenar los documentos cargados por los usuarios deben ser revisadas constantemente por antivirus y antimalwares, lo ideal es que el análisis se realice antes de guardar el archivo.

Monitoree cambios en los privilegios de las carpetas y archivos.

Se debe implementar algún mecanismo que permita monitorear cambios en las permisologías de los archivos y las carpetas que los almacenan. De ocurrir algún cambio, se debería disparar una alarma de forma inmediata.

Solo acepte que los usuarios carguen archivos, si estan autenticados.

De esta forma podrá saber que usuario cargó cualquier archivo. La autenticación debería ser lo suficientemente robusta, como para evitar suplantación de identidad o robo de sesiones.

Evite la carga de archivos comprimidos.

Aplique técnicas que permitan protegerse del CSRF Cross Site Request Forgery.

Para realizar la carga, utilice el método POST, en vez de PUT o GET.

 

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s