Zulassen, dass node.js-Anwendungen auf Port 80 ausgeführt werden

9

Ich folge einer exemplarischen Vorgehensweise, die Sie durch das Einrichten des Knotens auf einem Ubuntu-Computer führt. Ich bin an dem Schritt angelangt, an dem Sie das System so konfigurieren, dass der Knoten auf Port 80 ausgeführt werden kann. Es wird (sowie einige andere Anleitungen, die ich mir angesehen habe) empfohlen, den folgenden Befehl auszuführen:

sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

Dies gibt den folgenden Fehler zurück:

Failed to set capabilities on file `/usr/local/bin/node' (Invalid argument)
The value of the capability argument is not permitted for a file. Or the file is not a regular (non-symlink) file

Irgendeine Idee, was diesen Fehler verursachen kann?

ThinkingInBits
quelle

Antworten:

11

Um diesen Fehler zu vermeiden, können Sie die ausführbare Datei ohne Symlink which nodewie folgt auflösen :

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

Der Befehl "which" zeigt den vollständigen Pfad der Shell-Befehle an.

Alejandro Silva
quelle
4

Herausgefunden. Es stellte sich jedoch heraus, dass ich den Knoten installiert und einen Sym-Link in / usr / bin / node erstellt habe, der auf einen anderen Sym-Link in / etc / alternatives / node verweist, der auf einen anderen Sym-Link in / usr / bin / nodejs verweist.

Das Ausführen des Befehls für / usr / bin / nodejs hat funktioniert.

ThinkingInBits
quelle
3

FWIW, eine andere Option ist die Verwendung von authbind. Authbind verwendet einen etwas anderen Mechanismus, um ähnliche Ziele wie CAP_NET_BIND_SERVICE zu erreichen. Das heißt, nicht privilegierte Apps können privilegierte Ports verwenden.

Von apt installieren:

sudo apt-get update && sudo apt-get install authbind

Angenommen, die gewünschte app.js wird unter dem nicht privilegierten Benutzer "user" ausgeführt und Sie möchten eine Bindung an Port 80 herstellen:

sudo touch /etc/authbind/byport/80
sudo chown user:user /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80

Führen Sie dann Ihre App folgendermaßen aus:

authbind node app.js

Wenn Sie stattdessen so etwas wie "für immer" verwenden möchten (im Wesentlichen Knoten-Apps dämonisieren), dann ist dies das Richtige:

authbind --deep forever app.js
Jeremy Davis
quelle
Nur Antwort, die es gelöst hat
Marc van Nieuwenhuijzen
Ein weiterer Artikel, der die authbind-Lösung für den Knoten medium.com/@steve.mu.dev/setup-authbind-on-mac-os-6aee72cb828 befürwortet
wird
Vielen Dank für die Bearbeitung, die meine Auslassung @brodybits behoben hat! :)
Jeremy Davis
1

Ein Grund, warum der setcapBefehl manchmal fehlschlägt, ist, dass bestimmte Dateisysteme ihn nicht unterstützen, wenn sie keine erweiterten Attribute unterstützen.

The filesystem must support attaching capabilities to an executable file, so that a process gains those capabilities when the file is executed.

http://man7.org/linux/man-pages/man7/capabilities.7.html

Dies gilt insbesondere für Docker. Docker verwendet die BTRFS- oder AUFS-Speicher-Backends, kann jedoch auch Benutzer-Overlays verwenden. Overlayfs unterstützt das Festlegen von Caps, BTRFS und AUFS (siehe unten) jedoch nicht.

https://github.com/moby/moby/issues/30557

Wenn Sie Images mit AUFS ausführen müssen, müssen Sie einen Kernel mit ausführen CONFIG_AUFS_XATTR=y.

Aus diesem Grund authbindist oft eine bessere Lösung.

EdH
quelle