run node instalar actualizar linux node.js security web-applications configuration

linux - instalar - node port



Prácticas recomendadas al ejecutar Node.js con el puerto 80(Ubuntu/Linode) (5)

Puerto 80

Lo que hago en mis instancias de 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 para el puerto 80 se asignarán al puerto 3000.

También debe editar su archivo /etc/rc.local y agregar esa línea menos el sudo . Eso agregará la redirección cuando la máquina arranque. No necesita sudo en /etc/rc.local porque los comandos se ejecutan como root cuando se inicia el sistema.

Troncos

Usa el módulo de forever para lanzar tu Node.js con. Se asegurará de que se reinicie si alguna vez se bloquea y redirigirá los registros de la consola a un archivo.

Lanzar en el arranque

Agregue su script de inicio Node.js al archivo que editó para la redirección de puertos, /etc/rc.local . Eso ejecutará su script de inicio Node.js cuando se inicie el sistema.

Digital Ocean 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 sistemas basados ​​en RedHat /etc/rc.local es /ect/rc.d/local .

Estoy configurando mi primer servidor Node.js en un cloud Linux node y soy bastante nuevo en los detalles del Linux admin 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 en el port 80 con el nodo. Sin embargo, prefiero no ejecutarlo como root por razones de seguridad.

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

  1. ¿Establecer buenos permisos / usuario para el nodo de modo que sea seguro / de espacio aislado?
  2. Permitir el uso del puerto 80 dentro de estas restricciones.
  3. Poner en marcha el nodo y ejecutarlo automáticamente.
  4. Manejar la información de registro enviada a la consola.
  5. Cualquier otra preocupación general de mantenimiento y seguridad.

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

Gracias


¿Linode proporciona algún "muro frontal" o firewall donde debe abrir el puerto para la máquina? Tal vez sea un buen lugar para encontrar una mejor solución que enrutar en cada máquina. Cuando estoy implementando un servidor en Azure, debo definir los llamados puntos finales. El punto final contiene un puerto público, un puerto privado (en la máquina) y un protocolo (TCP / UDP). Entonces, si está ejecutando la aplicación en el puerto 3000 en el servidor, se puede acceder al mismo en el puerto 80 y el enrutamiento se realiza por plataforma, no por máquina. También puedo establecer ACL en los puntos finales.


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 como http://ip:port/

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

Mucha gente se queda estancada aquí, pero la solución es fácil. Hay algunas opciones pero esta es la que 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á.

Compruebe este enlace de referencia


Para el puerto 80 (que era la pregunta original), Daniel tiene toda la razón. Recientemente me https a https y tuve que cambiar de iptables a un proxy nginx ligero que administra los certificados SSL. Encontré una answer útil junto con una gabrielhpugliese de gabrielhpugliese sobre cómo manejar eso. Básicamente yo

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


Quitar privilegios de raíz después de enlazar al puerto 80 (o 443).

Esto permite que el puerto 80/443 permanezca protegido, a la vez que impide que se atiendan las solicitudes como root:

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

Un ejemplo de trabajo completo utilizando 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 .