web-dev-qa-db-fra.com

Meilleures pratiques lors de l'exécution de Node.js avec le port 80 (Ubuntu / Linode)

Je configure mon premier serveur _Node.js_ sur un _cloud Linux node_ et je suis assez nouveau en ce qui concerne _Linux admin_. (BTW je n'essaie pas d'utiliser Apache en même temps.)

Tout est installé correctement, mais j'ai constaté que, sauf si j'utilise le _root login_, je ne parviens pas à écouter _port 80_ avec nœud. Cependant, je préférerais ne pas l'exécuter en tant que root pour des raisons de sécurité.

Quelle est la meilleure pratique pour:

  1. Définir de bonnes autorisations/utilisateur pour le noeud afin qu'il soit sécurisé/en bac à sable?
  2. Autorisez le port 80 à être utilisé dans ces contraintes.
  3. Démarrez le noeud et exécutez-le automatiquement.
  4. Gérer les informations du journal envoyées à la console.
  5. Tout autre problème d’entretien général et de sécurité.

Devrais-je transférer le trafic du port 80 vers un autre port d'écoute?

Merci

247
Robotbugs

Port 80

Ce que je fais sur mes instances de cloud, je redirige le port 80 sur le port 3000 avec cette commande:

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

Ensuite, je lance mon Node.js sur le port 3000. Les demandes du port 80 seront mappées sur le port 3000.

Vous devez également éditer votre fichier /etc/rc.local et ajouter cette ligne moins le Sudo. Cela ajoutera la redirection au démarrage de la machine. Vous n'avez pas besoin de Sudo dans /etc/rc.local parce que les commandes qui y sont exécutées sont exécutées en tant que root au démarrage du système.

Les journaux

Utilisez le module forever pour lancer votre Node.js avec. Il s'assurera qu'il redémarre s'il se bloque et redirigera les journaux de la console vers un fichier.

Lancer au démarrage

Ajoutez votre script de démarrage Node.js au fichier que vous avez modifié pour la redirection de port, /etc/rc.local. Cela lancera votre script de lancement Node.js au démarrage du système.

Digital Ocean & autres VPS

Cela s'applique non seulement à Linode, mais également à Digital Ocean, AWS EC2 et à d'autres fournisseurs de VPS. Cependant, sur les systèmes basés sur RedHat, /etc/rc.local est /ect/rc.d/local.

508
Daniel

Autoriser l'utilisateur sûr à utiliser le port 80

N'oubliez pas que nous ne voulons PAS exécuter vos applications en tant qu'utilisateur root, mais il y a un problème: votre utilisateur sécurisé n'est pas autorisé à utiliser le port HTTP par défaut (80). Votre objectif est de pouvoir publier un site Web que les visiteurs peuvent utiliser en sélectionnant une URL simple à utiliser, telle que http://ip:port/.

Malheureusement, sauf si vous vous connectez en tant que root, vous devrez normalement utiliser une URL telle que http://ip:port - où numéro de port> 1024.

Beaucoup de gens restent bloqués ici, mais la solution est simple. Il y a quelques options mais c'est celle que j'aime bien. Tapez les commandes suivantes:

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

Désormais, lorsque vous indiquez à une application Node que vous souhaitez qu'elle s'exécute sur le port 80, il ne se plaindra pas.

Vérifiez ceci lien de référence

108
Meet Mehta

Supprimez les privilèges root après avoir été lié au port 80 (ou 443).

Cela permet au port 80/443 de rester protégé, tout en vous empêchant de répondre aux demandes en tant que root:

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

Un exemple de travail complet utilisant la fonction ci-dessus:

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());
});

Voir plus de détails sur ceci référence complète .

13
slund

Pour le port 80 (qui était la question initiale), Daniel a parfaitement raison. Je suis récemment passé à https et je devais passer de iptables à un proxy nginx léger gérant les certificats SSL. J'ai trouvé un réponse utile avec un Gist par gabrielhpugliese sur la façon de gérer cela. Fondamentalement je

Espérons que cela puisse sauver quelqu'un d'autres maux de tête. Je suis sûr qu'il y a une manière pure de faire cela, mais nginx a été rapide et cela a fonctionné.

7
Nick Benes

Linode fournit-il un "mur avant" ou un pare-feu sur lequel vous devez ouvrir le port pour la machine? Peut-être que ce sera un bon endroit pour trouver une meilleure solution que le routage sur chaque machine? Lorsque je déploie un serveur sur Azure, je dois définir ce que l'on appelle des points de terminaison. Le point final contient le port public, le port privé (sur la machine) et le protocole (TCP/UDP). Ainsi, si vous exécutez une application sur le port 3000 sur le serveur, elle est accessible sur le port 80 et le routage est effectué par plate-forme, et non par machine. Je peux également définir des ACL sur des ordinateurs d'extrémité.

0