Best Practices beim Ausführen von Node.js mit Port 80 (Ubuntu / Linode) [geschlossen]

260

Ich richte meinen ersten Node.jsServer auf einem ein cloud Linux nodeund bin ziemlich neu in den Details von Linux admin. (Übrigens versuche ich nicht, Apache gleichzeitig zu verwenden.)

Alles ist korrekt installiert, aber ich habe festgestellt, dass ich mit node root loginnicht abhören kann , wenn ich das nicht verwende port 80. Ich würde es jedoch aus Sicherheitsgründen lieber nicht als root ausführen.

Was ist die beste Vorgehensweise, um:

  1. Gute Berechtigungen / Benutzer für Knoten festlegen, damit dieser sicher / sandboxed ist?
  2. Ermöglichen Sie die Verwendung von Port 80 innerhalb dieser Einschränkungen.
  3. Starten Sie den Knoten und führen Sie ihn automatisch aus.
  4. Behandeln Sie an die Konsole gesendete Protokollinformationen.
  5. Alle anderen allgemeinen Wartungs- und Sicherheitsbedenken.

Sollte ich den Verkehr von Port 80 an einen anderen Überwachungsport weiterleiten?

Vielen Dank

Robotbugs
quelle

Antworten:

531

Port 80

Auf meinen Cloud-Instanzen leite ich Port 80 mit diesem Befehl auf Port 3000 um:

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

Dann starte ich meine Node.js auf Port 3000. Anfragen an Port 80 werden Port 3000 zugeordnet.

Sie sollten auch Ihre /etc/rc.localDatei bearbeiten und diese Zeile abzüglich der hinzufügen sudo. Dadurch wird die Umleitung hinzugefügt, wenn der Computer hochfährt. Sie brauchen nicht sudoin , /etc/rc.localweil die Befehle gibt es laufen , wie rootwenn das System startet.

Protokolle

Verwenden Sie das Modul forever , um Ihre Node.js mit zu starten. Es stellt sicher, dass es neu gestartet wird, falls es jemals abstürzt, und leitet Konsolenprotokolle in eine Datei um.

Beim Booten starten

Fügen Sie Ihr Node.js-Startskript zu der Datei hinzu, die Sie für die Portumleitung bearbeitet haben /etc/rc.local. Dadurch wird das Startskript von Node.j ausgeführt, wenn das System gestartet wird.

Digital Ocean & andere VPS

Dies gilt nicht nur für Linode, sondern auch für Digital Ocean, AWS EC2 und andere VPS-Anbieter. Auf RedHat-basierten Systemen /etc/rc.localist dies jedoch der Fall /ect/rc.d/local.

Daniel
quelle
3
Danke für diese Antwort, nett und auf den Punkt.
Robotbugs
21
Übrigens, unter Ubuntu ist es /etc/rc.local
kehers
12
Häufig ist das Flag "-i eth0" ein Problem für virtuelle private Server. Ersetzen Sie eth0 nach Bedarf.
JHAWN
7
Wenn ich mein Startskript Node.js hinzufüge /etc/rc.local, wird es dann nicht wie rootbeim Systemstart ausgeführt ? Das würde den Zweck der Port 80-Umleitung zunichte machen.
Jamix
4
Beachten Sie, dass der Zielport auch in Ihrer Firewall geöffnet sein muss, damit die Portumleitung funktioniert. Beim Starten einer Knoteninstanz beim Booten verwenden wir einfach die Init-Skripte / Systemd-Dateien der Distributionen, mit denen Sie einen Benutzer angeben können.
bk138
116

Geben Sie dem sicheren Benutzer die Erlaubnis, Port 80 zu verwenden

Denken Sie daran, dass wir Ihre Anwendungen NICHT als Root-Benutzer ausführen möchten, aber es gibt ein Problem: Ihr sicherer Benutzer hat keine Berechtigung zur Verwendung des Standard-HTTP-Ports (80). Ihr Ziel ist es, eine Website zu veröffentlichen, die Besucher verwenden können, indem Sie zu einer benutzerfreundlichen URL wie navigierenhttp://ip:port/

Wenn Sie sich nicht als root anmelden, müssen Sie normalerweise eine URL wie http://ip:port- verwenden, wobei Portnummer> 1024.

Viele Leute stecken hier fest, aber die Lösung ist einfach. Es gibt ein paar Optionen, aber diese ist die, die ich mag. Geben Sie die folgenden Befehle ein:

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

Wenn Sie einer Knotenanwendung mitteilen, dass sie auf Port 80 ausgeführt werden soll, wird sie sich nicht beschweren.

Überprüfen Sie diesen Referenzlink

Treffen Sie Mehta
quelle
9
Dies ist die bessere und einfachere Antwort.
Kyle Chadha
2
Außerdem wurde hier eine detaillierte Antwort hinzugefügt. Stackoverflow.com/questions/23281895/…
Treffen Sie Mehta
1
Wie läuft ein Webserver wie NGINX auf Port 80? Tut es etwas Ähnliches?
Eric Andrew Lewis
1
@ EricAndrewLewis: Ich werde sagen, es kommt darauf an. Dieser Fehler wird angezeigt, wenn Sie den Server im Nicht-Root-Modus ausführen. Was ist, wenn Sie den Nginx-Server als Root-Benutzer ausführen? Auch wenn es als normaler Benutzer ausgeführt wird und Fehler angezeigt werden. Führen Sie die obigen Befehle aus, um sichere Berechtigungen für den Zugriff auf den Port zu erteilen. Siehe auch stackoverflow.com/questions/31369480/...
Treffen Mehta
16

Löschen Sie Root-Berechtigungen, nachdem Sie an Port 80 (oder 443) gebunden haben.

Auf diese Weise bleibt Port 80/443 geschützt, ohne dass Sie Anforderungen als Root bereitstellen können:

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

Ein voll funktionsfähiges Beispiel mit der obigen Funktion:

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

Weitere Details finden Sie in dieser vollständigen Referenz .

Slund
quelle
9

Für Port 80 (was die ursprüngliche Frage war) ist Daniel genau richtig. Ich bin kürzlich zu einem Light Nginx Proxy gewechselt httpsund musste von diesem wechseln iptables, der die SSL-Zertifikate verwaltet. Ich fand eine nützliche Antwort zusammen mit einem Kern von gabrielhpugliese, wie man damit umgeht . Grundsätzlich ich

Hoffentlich kann das jemand anderem Kopfschmerzen ersparen. Ich bin mir sicher, dass es einen reinen Knoten gibt, aber Nginx war schnell und es hat funktioniert.

Nick Benes
quelle