Verwenden von su - (user) zum Öffnen eines privilegierten Ports funktioniert nicht

2

Daher wollte ich einen Node-Server auf Port 80 ausführen, aber ich wollte nicht den gesamten Prozess mit Root-Berechtigungen ausführen. Aus Sicherheitsgründen hielt ich dies für das Beste.

Also dachte ich, eine gute Lösung wäre, als root zu verwenden:

su - (myuser) -c 'Node Forever Script ausführen'

Ich erhalte jedoch EACCESS-Fehler, aber es ist in Ordnung, das Skript direkt als root auszuführen. Ich höre, wie andere dasselbe tun und für sie arbeiten. Kann es sein, dass ich etwas anderes mache?

Gibt es eine bessere Strategie, um dies zu tun, den Port für Root-Berechtigungen zu öffnen und dann die Root-Berechtigungen zu löschen, sobald die Anwendung ausgeführt wird?

iQ.
quelle
Welches Betriebssystem verwenden Sie? (Ich kann sehen, dass es ein Unix ist, aber welches?).
Strg-Alt-Delor

Antworten:

3

Ja, das kann man. Sehen Sie sich diesen Blog-Beitrag an, der besser erklärt, als ich kann.

https://thomashunter.name/blog/drop-root-privileges-in-node-js/

Ich kopiere den entsprechenden Code hierher, falls der Blog nicht mehr verfügbar ist

app.listen(80, 'localhost', null, function() {
  // Listening
  try {
    console.log('Old User ID: ' + process.getuid() + ', Old Group ID: ' + process.getgid());
    process.setgid('users');
    process.setuid('tlhunter');
    console.log('New User ID: ' + process.getuid() + ', New Group ID: ' + process.getgid());
  } catch (err) {
    console.log('Cowardly refusing to keep the process alive as root.');
    process.exit(1);
  }
});
johnshen64
quelle
+1 für den Link Obwohl ich den obigen Code möglicherweise nicht verwende, hat der Link mich auf das Tool 'authbind' hingewiesen. Werde das also später testen und sehen, wie es geht.
iQ.
2

su - <user>wechselt zu, <user>bevor Sie etwas anderes tun, sodass der NodeJS-Server als Benutzer gestartet wird und keine Ahnung hat, wie Root den suBefehl ausführt. Da Benutzer keine privilegierten Ports verwenden dürfen, wird dies niemals funktionieren.

Es gibt zwei Möglichkeiten, dies zu umgehen, die ich mir auf Anhieb vorstellen kann:

  1. Verwenden einer Dateifunktion , mit der nicht privilegierte Benutzer privilegierte Ports öffnen können. Obwohl sie in diesem Fall im Allgemeinen nicht mit Skripten arbeiten, sollten sie dies tun, da Sie, soweit ich weiß, den Server mit starten node <filename>. (Korrigieren Sie mich, wenn ich falsch liege.)

  2. Verwenden eines Reverse-Proxys wie NGINX , der als Root vor dem Anwendungsserver ausgeführt wird. In diesem Fall stellen Benutzer eine direkte Verbindung zu NGINX her, das dann die Verbindungen zum Anwendungsserver weiterleitet. Sie können jedoch leichter mehrere Server / Instanzen ausführen und NGINX-Cache-Ressourcen verwenden. Dies ist in der Regel der bevorzugte Ansatz für die Bereitstellung von Anwendungsservern.

kyrias
quelle
0

Wenn Sie Gnu / Linux verwenden, können Sie Funktionen verwenden, um der Anwendung die Möglichkeit zu geben, privilegierte Ports zu öffnen, und keine anderen Funktionen (root bietet alle Funktionen).

Eine sehr grundlegende Einführung finden Sie hier: https://unix.stackexchange.com/questions/101263/was-ist-die-verschiedene- Wege-zum- Festlegen-der- Dateiberechtigungen-etc- on- gnu- linux

[edit:] Die GNU / Linux-Fähigkeit, nach der Sie suchen, ist cap_net_bind_service. Verwenden Sie unter Solaris PRIV_NET_PRIVADDR. Ausführlichere Informationen finden Sie unter man-Funktionen (7) (Linux) oder man-Berechtigungen (5) (Solaris).

Strg-Alt-Delor
quelle