Best practice durante l'esecuzione di Node.js con porta 80 (Ubuntu / Linode) [chiuso]


260

Sto configurando il mio primo Node.jsserver su un cloud Linux nodee sono abbastanza nuovo nei dettagli di Linux admin. (A proposito, non sto cercando di usare Apache contemporaneamente.)

Tutto è installato correttamente, ma ho scoperto che a meno che non utilizzi il root login, non sono in grado di ascoltare port 80con il nodo. Tuttavia preferirei non eseguirlo come root per motivi di sicurezza.

Qual è la migliore pratica per:

  1. Impostare buone autorizzazioni / utente per nodo in modo che sia sicuro / sandbox?
  2. Consentire l'utilizzo della porta 80 all'interno di questi vincoli.
  3. Avvia nodo ed eseguilo automaticamente.
  4. Gestire le informazioni del registro inviate alla console.
  5. Qualsiasi altro problema generale di manutenzione e sicurezza.

Devo inoltrare il traffico della porta 80 a una porta di ascolto diversa?

Grazie

Risposte:


532

Porta 80

Quello che faccio sulle mie istanze cloud è il reindirizzamento dalla porta 80 alla porta 3000 con questo comando:

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

Quindi avvio Node.js sulla porta 3000. Le richieste sulla porta 80 verranno mappate sulla porta 3000.

Dovresti anche modificare il tuo /etc/rc.localfile e aggiungere quella riga meno il sudo. Ciò aggiungerà il reindirizzamento all'avvio della macchina. Non è necessario sudoin /etc/rc.localquanto i comandi non vengono eseguiti come rootquando il sistema si avvia.

logs

Usa il modulo forever per avviare Node.js con. Si assicurerà che si riavvii in caso di arresto anomalo e reindirizzerà i log della console su un file.

Avvio all'avvio

Aggiungi il tuo Node.js iniziano script per il file è stato modificato per il reindirizzamento della porta, /etc/rc.local. Ciò eseguirà lo script di avvio di Node.js all'avvio del sistema.

Digital Ocean e altri VPS

Questo non vale solo per Linode, ma anche Digital Ocean, AWS EC2 e altri provider VPS. Tuttavia, su sistemi basati su RedHat /etc/rc.localè /ect/rc.d/local.


3
Grazie per la risposta, gentile e al punto.
Robotbugs,

21
A proposito, su Ubuntu è /etc/rc.local
kehers

12
Spesso il flag "-i eth0" sarà un problema per i server privati ​​virtuali. Sostituire eth0 secondo necessità.
JHAWN,

7
Se aggiungo il mio script di avvio Node.js /etc/rc.local, non verrà eseguito come rootall'avvio del sistema? Ciò vanificherebbe lo scopo del reindirizzamento della porta 80.
Jamix,

4
Affinché il reindirizzamento della porta funzioni, anche la porta di destinazione deve essere attiva sul firewall. WRT che avvia un'istanza del nodo all'avvio, utilizziamo semplicemente gli script di script / file systemd delle distribuzioni che consentono di specificare un utente.
bk138,

116

Autorizza l'utente sicuro a utilizzare la porta 80

Ricorda, NON vogliamo eseguire le tue applicazioni come utente root, ma c'è un intoppo: il tuo utente sicuro non ha i permessi per usare la porta HTTP predefinita (80). Il tuo obiettivo è quello di essere in grado di pubblicare un sito Web che i visitatori possono utilizzare navigando verso un URL facile da usare comehttp://ip:port/

Sfortunatamente, a meno che non accediate come root, dovrete normalmente usare un URL come http://ip:port- dove numero di porta> 1024.

Molte persone rimangono bloccate qui, ma la soluzione è semplice. Ci sono alcune opzioni, ma questa è quella che mi piace. Digita i seguenti comandi:

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

Ora, quando dici a un'applicazione Node che vuoi che venga eseguita sulla porta 80, non si lamenterà.

Controlla questo link di riferimento


9
Questa è la risposta migliore e più semplice.
Kyle Chadha,

2
Inoltre, ho aggiunto una risposta dettagliata qui stackoverflow.com/questions/23281895/…
Meet Mehta,

1
Come funziona un server web come NGINX sulla porta 80? Fa qualcosa di simile?
Eric Andrew Lewis,

1
@EricAndrewLewis: dirò che dipende. Questo errore verrà visualizzato quando si esegue il server in modalità non root. Che cosa succede se si esegue il server Nginx come utente root! Inoltre, se in esecuzione come utente normale e viene visualizzato un errore. Eseguire i comandi sopra per fornire autorizzazioni sicure per accedere alla porta. Fare riferimento anche a stackoverflow.com/questions/31369480/…
Meet Mehta

16

Rilascia i privilegi di root dopo aver eseguito il binding alla porta 80 (o 443).

Ciò consente alla porta 80/443 di rimanere protetta, impedendo comunque di servire le richieste come root:

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

Un esempio completo di funzionamento che utilizza la funzione sopra:

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

Vedi maggiori dettagli a questo riferimento completo .


9

Per la porta 80 (che era la domanda originale), Daniel ha esattamente ragione. Di recente mi sono trasferito httpse ho dovuto passare da iptablesun proxy nginx leggero a gestire i certificati SSL. Ho trovato un utile risposta insieme a una sostanza da gabrielhpugliese su come gestire questo. Fondamentalmente io

Spero che possa salvare qualcun altro un po 'di mal di testa. Sono sicuro che esiste un modo puro di fare questo, ma nginx è stato rapido e ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.