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

260

J'installe mon premier Node.jsserveur sur un cloud Linux nodeet je suis assez nouveau dans les détails de Linux admin. (BTW Je n'essaie pas d'utiliser Apache en même temps.)

Tout est installé correctement, mais j'ai trouvé qu'à moins d'utiliser le root login, je ne suis pas en mesure d'écouter port 80avec le nœud. Cependant, je préfère 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 nœud afin qu'il soit sécurisé / en bac à sable?
  2. Permettez au port 80 d'être utilisé dans ces contraintes.
  3. Démarrez le nœud et exécutez-le automatiquement.
  4. Gérer les informations du journal envoyées à la console.
  5. Tout autre problème général de maintenance et de sécurité.

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

Merci

Robotbugs
la source

Réponses:

532

Port 80

Ce que je fais sur mes instances cloud, c'est que je redirige le port 80 vers 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 sur le port 80 seront mappées sur le port 3000.

Vous devez également modifier votre /etc/rc.localfichier et ajouter cette ligne moins le sudo. Cela ajoutera la redirection au démarrage de la machine. Vous n'avez pas besoin sudoen /etc/rc.localparce que les commandes fonctionnent comme il sont rootau démarrage du système.

Journaux

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

Lancer au démarrage

Ajouter votre script Node.js commencent à le fichier que vous avez modifié pour la redirection de port, /etc/rc.local. Cela exécutera votre script de lancement Node.js au démarrage du système.

Océan numérique et autres VPS

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

Daniel
la source
3
Merci pour cette réponse, gentil et précis.
Robotbugs
21
BTW, sur Ubuntu, c'est /etc/rc.local
kehers
12
Souvent, le drapeau "-i eth0" sera un problème pour les serveurs privés virtuels. Remplacez eth0 si nécessaire.
JHAWN
7
Si j'ajoute mon script de démarrage Node.js à /etc/rc.local, ne sera-t-il pas exécuté comme rootau démarrage du système? Cela irait à l'encontre de l'objectif de la redirection du port 80.
jamix
4
Notez que pour que la redirection de port fonctionne, le port de destination doit également être ouvert sur votre pare-feu. WRT démarrant une instance de nœud au démarrage, nous utilisons simplement les scripts init / les fichiers systemd des distributions qui vous permettent de spécifier un utilisateur.
bk138
116

Donner à l'utilisateur autorisé l'autorisation d'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'a pas la permission d'utiliser le port HTTP par défaut (80). Votre objectif est de pouvoir publier un site Web que les visiteurs peuvent utiliser en accédant à une URL facile à utiliser commehttp://ip:port/

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

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

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

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

Vérifiez ce lien de référence

Rencontrez Mehta
la source
9
C'est la meilleure réponse, la plus simple.
Kyle Chadha
2
Aussi, ajouté une réponse détaillée ici stackoverflow.com/questions/23281895/…
Rencontrez Mehta
1
Comment fonctionne un serveur Web comme NGINX sur le port 80? Fait-il quelque chose de similaire?
Eric Andrew Lewis
1
@EricAndrewLewis: Je dirai que cela dépend. Cette erreur apparaîtra lorsque vous exécutez le serveur en mode non root. Et si vous exécutez le serveur Nginx en tant qu'utilisateur root! En outre, si vous exécutez en tant qu'utilisateur normal et obtenez une erreur. Exécutez les commandes ci-dessus pour accorder des autorisations d'accès au port en toute sécurité. Voir
Rencontrez Mehta le
16

Supprimez les privilèges root après vous être connecté au port 80 (ou 443).

Cela permet au port 80/443 de rester protégé, tout en vous empêchant de servir les 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 à cette référence complète .

dégoûté
la source
9

Pour le port 80 (qui était la question d'origine), Daniel a tout à fait raison. J'ai récemment déménagé httpset j'ai dû passer iptablesà un proxy nginx léger gérant les certificats SSL. J'ai trouvé utile réponse avec un point essentiel par gabrielhpugliese sur la façon de gérer cela. Fondamentalement, je

J'espère que cela peut sauver quelqu'un d'autre de maux de tête. Je suis sûr qu'il y a une façon pure de faire ça, mais nginx a été rapide et cela a fonctionné.

Nick Benes
la source