Asegurar su aplicación Node.js

A

De forma predeterminada, Node.js es bastante seguro por sí mismo. Aunque, definitivamente hay cosas de las que debes tener cuidado. Si su aplicación web Node comienza a volverse cada vez más popular, por ejemplo, tendrá que pensar cada vez más en la seguridad para asegurarse de mantener seguros los datos de sus usuarios.

Después de ver algunas preguntas sobre la seguridad de Node.js en la web en las últimas semanas, pensé que sería útil escribir una guía breve sobre lo que puede hacer para proteger sus aplicaciones.

Muchas, si no todas, las sugerencias aquí son realmente fáciles de seguir e implementar, y en su mayoría son específicas de Node o sus módulos. Por lo tanto, no cubriré cosas como el cifrado o la autenticación de usuario, que está un poco fuera del alcance de este artículo. Muchos de los consejos aquí se centrarán en los marcos web de Node, ya que suelen ser los más vulnerables a los ataques.

No ejecute código con Sudo

Esto sucede mucho más de lo que cree y es peligroso. Dado que otorga permisos de root, ejecutar código con sudo puede hacer que desaparezcan problemas molestos, como escribir en un directorio que el usuario no posee. Pero esa es solo la salida más fácil, y estos atajos plantean un lío de otros problemas que no debe ignorar.

En su lugar, encuentre la causa raíz del problema y descubra una manera de solucionarlo sin comprometer todo el sistema.

Entonces, por ejemplo, si necesita abrir el puerto 80 para un servicio web pero no puede porque no está ejecutando bajo root, debería usar un proxy como Nginx para reenviar las solicitudes desde el puerto 80 a cualquier otro puerto en el que se esté ejecutando su servicio.

Si se ejecuta bajo root y los atacantes se apoderan de su aplicación, pueden hacer lo que quieran con su sistema y sus datos. Este es el peor de los casos del que está tratando de protegerse.

Evitar eval cueste lo que cueste

De acuerdo, lo admito, a veces puede ser tentador hacer que su código sea más dinámico al permitirle ejecutar JavaScript arbitrario usando eval, pero créame, esta es una mala idea.

Algunas personas incluso intentan usarlo cuando se les da pereza analizar la entrada del usuario. Después de todo, el motor JavaScript V8 es realmente bueno para analizar cosas como operaciones matemáticas simples, por lo que sería tentador usar eso para su ventaja:

var result = eval('(13 + (2 * 23.249) / 0.981)');
// result = 60.398572884811415

Hay demasiadas formas en que esto puede volver a morderlo. A menos que sea un experto y sepa cómo protegerse de todos los diferentes tipos de JavaScript malicioso código, simplemente manténgase alejado de esto.

Aquí hay un ejemplo simple del exploit:

var userInput = req.body.userInput;    // User entered 'process.exit()'
var answer = eval(userInput);          // App quits here

La ejecución de este código cerrará su aplicación, provocando una denegación de servicio (DOS) a sus usuarios.

Agregar / quitar encabezados HTTP

Hay bastantes encabezados HTTP que pueden ayudarte y perjudicarte. Usar los correctos de la manera correcta es la parte complicada.

Express, por defecto, agrega el X-Powered-By: Express header, que realmente no hace más que decirles a los atacantes potenciales qué marco web está utilizando y, por lo tanto, cómo explotarlo en función de las vulnerabilidades conocidas públicamente. Cuanta más información tengan sobre su pila de tecnología, más formas podrán atacarla.

Ahí es donde Yelmo entra en juego. Helmet es un pequeño módulo para Node que ayuda a proteger las aplicaciones Express / Connect al agregar / eliminar varios encabezados HTTP.

Puedes hacer cualquier cosa desde habilitar HSTS para prevenir ataques de click-jacking. Estas son cosas que requieren poco o ningún trabajo de su parte, pero pueden marcar una gran diferencia. Entonces, si está creando una aplicación Express, esto debería ser una obviedad (y realmente, para cualquier servicio web, debe hacerlo).

Utilice utilidades de escaneo como Retire.js

No todos los programadores son expertos en seguridad y, si bien debe hacer todo lo posible para mantenerse actualizado sobre exploits comunes como XSS o inyección SQL, es difícil conocerlos todos.

Para compensar esto, debería intentar usar herramientas como Retire.js, que analiza su aplicación Node en busca de dependencias que contengan vulnerabilidades.

Por ejemplo, Ember.js tiene una vulnerabilidad XSS específica en algunas versiones diferentes (CVE-2014-0046), todos los cuales son verificados por Retire.js. Cuando ejecutas retire en el directorio de su proyecto, comparará paquetes en node_modules a un repositorio público de vulnerabilidades e informarle cuáles de sus dependencias son inseguras.

Hay demasiadas vulnerabilidades en muchos de estos paquetes para que las revise usted mismo, por lo que es mejor dejar que una herramienta como esta lo haga por usted.

Puede hacer que esto sea parte de su flujo de trabajo fácilmente integrándolo con Grunt o Gulp, gracias a los plugins proporcionados. Los detalles están en el archivo README.

Otra opción es ejecutarlo en un prepublish comando, que se ejecutaría antes de que npm envíe su paquete al repositorio. Simplemente agregue algo como esto a su package.json:

{
  "name": "myProject",
  "version": "0.0.1",
  "scripts": {
    "prepublish": "retire",
  }
}

Tenga cuidado con el child_process Módulo

Me gusta eval, utilizando spawn y exec desde el child_process El módulo puede ser realmente útil, pero también muy peligroso. Cualquier entrada del usuario que ingrese a estos comandos podría significar que su sistema se vea comprometido con bastante rapidez (¡especialmente si está ejecutando su aplicación con sudo!).

Por ejemplo, Magia de la imagen es una herramienta de línea de comandos muy popular para mostrar, convertir y editar imágenes. Con tantas aplicaciones web que usan imágenes en estos días, Image Magick se usa a menudo en segundo plano para cosas como recortar y cambiar el tamaño. Para usar esta herramienta con Node, es posible que vea un código como este:

child = child_process.exec('convert ' + imageFilename + ' ' + imageFilename + '.bmp', ['-depth', '24'], function(err, stdout, stderr) {
    console.log('Done');
});

Esto puede parecer inofensivo, pero con un diseño cuidadosamente elaborado imageFilename, puede ejecutar cualquier código que desee en el shell.

exec solo debe usarse si no depende de la entrada del usuario o si los argumentos están muy desinfectados. Aún mejor, busque en npm una biblioteca que envuelva la herramienta de línea de comandos. Por lo general, se crean con este tipo de seguridad en mente, o al menos tienen más ojos en el código para verificar si hay problemas. Para Image Magick, hay algunos módulos disponibles, como gm.

Comprender las vulnerabilidades

Muchas vulnerabilidades en las aplicaciones web se aplican a todos los servicios, independientemente del lenguaje de programación y el marco utilizado. Sin embargo, la forma en que ataca esos servicios puede diferir según la pila de tecnología que esté utilizando. Para defenderse mejor, realmente necesita aprender cómo funcionan estos exploits.

Suerte para ti, OWASP publica una lista de los 10 principales riesgos para las aplicaciones web. Revíselos y luego haga un análisis exhaustivo de su sitio web para ver si alguno de ellos se aplica a usted.

Aún mejor, echa un vistazo nodeCabra, que es un sitio web desplegable creado por OWASP destinado a enseñarle cómo identificar estos riesgos en aplicaciones de node específicamente. No hay mejor manera de aprender estos conceptos que hacerlo usted mismo.

los tutorial proporcionado lo guiará a través de todos los riesgos, mostrando ejemplos específicos de cómo explotar y defenderse de las vulnerabilidades. Por ejemplo, aquí hay un video proporcionado por OWASP que muestra cómo inyectar JavaScript usando un formulario web:

Más información

La seguridad de los nodes es un tema importante, por lo que no sería razonable intentar cubrirlo todo aquí. Si está interesado en obtener más detalles, le sugiero que lea algunos recursos más, como estos:

Conclusión

Con demasiada frecuencia, la seguridad de una aplicación es una idea posterior del desarrollo y el diseño. Ya es bastante difícil hacer que su código funcione correctamente, y mucho menos hacer que sea seguro para sus usuarios.

Afortunadamente, no eres el único que está pasando por estos problemas, por lo que eso significa que hay muchas herramientas y recursos creados por otros para ayudarte a proteger tus aplicaciones de forma rápida y sencilla. Solo tómate el tiempo para buscar NPM, hacer preguntas en foros o incluso contratar a un experto. ¡Definitivamente vale la pena el tiempo y el dinero!

¿De qué otras formas protege sus aplicaciones de Node? ¡Háznoslo saber en los comentarios!

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad