Mejores prácticas al ejecutar Node.js con el puerto 80 (Ubuntu / Linode) [cerrado]

260

Estoy configurando mi primer Node.jsservidor en cloud Linux nodeay soy bastante nuevo en los detalles de Linux admin. (Por cierto, no estoy tratando de usar Apache al mismo tiempo).

Todo está instalado correctamente, pero descubrí que a menos que use el root login, no puedo escuchar port 80con el nodo. Sin embargo, preferiría no ejecutarlo como root por razones de seguridad.

¿Cuál es la mejor práctica para:

  1. ¿Establecer buenos permisos / usuario para el nodo para que sea seguro / sandboxed?
  2. Permita que el puerto 80 se use dentro de estas restricciones.
  3. Inicie el nodo y ejecútelo automáticamente.
  4. Manejar la información de registro enviada a la consola.
  5. Cualquier otro problema general de mantenimiento y seguridad.

¿Debo reenviar el tráfico del puerto 80 a un puerto de escucha diferente?

Gracias

Robotbugs
fuente

Respuestas:

532

Puerto 80

Lo que hago en mis instancias en la nube es redirigir el puerto 80 al puerto 3000 con este comando:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

Luego lanzo mi Node.js en el puerto 3000. Las solicitudes al puerto 80 se asignarán al puerto 3000.

También debe editar su /etc/rc.localarchivo y agregar esa línea menos el sudo. Eso agregará la redirección cuando la máquina se inicie. No es necesario sudoen /etc/rc.localdebido a que los comandos no se ejecutan como rootcuando el sistema arranca.

Registros

Use el módulo forever para iniciar su Node.js con. Se asegurará de que se reinicie si alguna vez falla y redirigirá los registros de la consola a un archivo.

Lanzar en el arranque

Agregar sus Node.js empezar secuencia de comandos para el archivo que ha editado para la redirección de puertos, /etc/rc.local. Eso ejecutará el script de inicio de Node.js cuando se inicie el sistema.

Océano digital y otros VPS

Esto no solo se aplica a Linode, sino también a Digital Ocean, AWS EC2 y otros proveedores de VPS. Sin embargo, en los sistemas basados ​​en RedHat /etc/rc.locales /ect/rc.d/local.

Daniel
fuente
3
Gracias por esa respuesta, agradable y al grano.
Robotbugs
21
Por cierto, en Ubuntu, es /etc/rc.local
kehers
12
A menudo, el indicador "-i eth0" será un problema para los servidores privados virtuales. Reemplace eth0 según sea necesario.
JHAWN
77
Si agrego mi script de inicio Node.js /etc/rc.local, ¿no se ejecutará como rooten el arranque del sistema? Eso anularía el propósito de la redirección del puerto 80.
jamix
44
Tenga en cuenta que para que la redirección del puerto funcione, el puerto de destino también debe estar activado en su firewall. WRT inicia una instancia de nodo en el arranque, simplemente utilizamos los scripts de inicio / archivos systemd de las distribuciones que le permiten especificar un usuario.
bk138
116

Dar permiso de usuario seguro para usar el puerto 80

Recuerde, NO queremos ejecutar sus aplicaciones como usuario root, pero hay un problema: su usuario seguro no tiene permiso para usar el puerto HTTP predeterminado (80). Su objetivo es poder publicar un sitio web que los visitantes puedan usar navegando a una URL fácil de usar comohttp://ip:port/

Desafortunadamente, a menos que inicie sesión como root, normalmente tendrá que usar una URL como http://ip:port, donde el número de puerto> 1024.

Muchas personas se quedan atrapadas aquí, pero la solución es fácil. Hay algunas opciones, pero esta es la que más me gusta. Escriba los siguientes comandos:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Ahora, cuando le dice a una aplicación Node que desea que se ejecute en el puerto 80, no se quejará.

Revise este enlace de referencia

Conoce a mehta
fuente
9
Esta es la respuesta mejor y más simple.
Kyle Chadha
2
Además, se agregó una respuesta detallada aquí stackoverflow.com/questions/23281895/…
Conoce a Mehta el
1
¿Cómo funciona un servidor web como NGINX en el puerto 80? ¿Hace algo similar?
Eric Andrew Lewis
1
@EricAndrewLewis: Diré que depende. Este error aparecerá cuando esté ejecutando el servidor en modo no root. ¡Qué pasa si está ejecutando el servidor Nginx como usuario root! Además, si se ejecuta como usuario normal y obtiene un error. Ejecute los comandos anteriores para otorgar permisos seguros para acceder al puerto. También consulte stackoverflow.com/questions/31369480/…
Meet Mehta
16

Descarte los privilegios de root después de vincularse al puerto 80 (o 443).

Esto permite que el puerto 80/443 permanezca protegido, al tiempo que le impide servir solicitudes como root:

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

Un ejemplo de trabajo completo con la función anterior:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

Ver más detalles en esta referencia completa .

Slund
fuente
9

Para el puerto 80 (que era la pregunta original), Daniel tiene toda la razón. Recientemente me mudé httpsy tuve que cambiarme iptablesa un proxy nginx ligero que administra los certificados SSL. He encontrado una utilidad respuesta junto con un GIST por gabrielhpugliese sobre cómo manejar eso. Básicamente yo

Esperemos que eso pueda salvar a alguien más de algunos dolores de cabeza. Estoy seguro de que hay una forma de nodos de hacer esto, pero nginx fue rápido y funcionó.

Nick Benes
fuente