GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Gibt es eine Möglichkeit für Nicht-Root-Prozesse, sich an privilegierte Ports unter Linux zu binden?

Okay, vielen Dank an die Leute, die auf das Fähigkeitensystem und CAP_NET_BIND_SERVICE hingewiesen haben Fähigkeit. Wenn Sie einen neueren Kernel haben, ist es tatsächlich möglich, diesen zu verwenden, um einen Dienst als Nicht-Root zu starten, aber niedrige Ports zu binden. Die kurze Antwort lautet:

setcap 'cap_net_bind_service=+ep' /path/to/program

Und dann jederzeit program ausgeführt wird, danach hat es den CAP_NET_BIND_SERVICE Fähigkeit. setcap befindet sich im Debian-Paket libcap2-bin .

Nun zu den Vorbehalten:

  1. Sie benötigen mindestens einen 2.6.24-Kernel
  2. Dies funktioniert nicht, wenn Ihre Datei ein Skript ist. (dh verwendet eine #!-Zeile, um einen Interpreter zu starten). In diesem Fall müssten Sie, soweit ich weiß, die Fähigkeit auf die ausführbare Interpreterdatei selbst anwenden, was natürlich ein Sicherheitsalbtraum ist, da jedes Programm, das diesen Interpreter verwendet, die Fähigkeit haben wird. Ich konnte keinen sauberen, einfachen Weg finden, dieses Problem zu umgehen.
  3. Linux deaktiviert LD_LIBRARY_PATH auf allen program das über erhöhte Privilegien wie setcap verfügt oder suid . Wenn also Ihr program verwendet einen eigenen .../lib/ , müssen Sie sich möglicherweise nach einer anderen Option wie Portweiterleitung umsehen.

Ressourcen:

  • capabilities(7) Manpage. Lesen Sie dies lange und gründlich, wenn Sie Funktionen in einer Produktionsumgebung verwenden möchten. Es gibt einige wirklich knifflige Details darüber, wie Fähigkeiten über exec()-Aufrufe vererbt werden, die hier detailliert beschrieben werden.
  • setcap-Manpage
  • "Binde Ports unter 1024 ohne Root auf GNU/Linux":Das Dokument, das mich zuerst auf setcap hingewiesen hat .

Hinweis:RHEL hat dies erstmals in v6 hinzugefügt.


Du kannst eine Portumleitung machen. Dies ist, was ich für einen Silverlight-Richtlinienserver mache, der auf einem Linux-Rechner läuft

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300

Der Standardweg besteht darin, sie "setuid" zu machen, damit sie als Root starten, und dann werfen sie dieses Root-Privileg weg, sobald sie an den Port gebunden sind, aber bevor sie anfangen, Verbindungen zu ihm zu akzeptieren. Gute Beispiele dafür finden Sie im Quellcode für Apache und INN. Mir wurde gesagt, dass Lighttpd ein weiteres gutes Beispiel ist.

Ein weiteres Beispiel ist Postfix, das mehrere Daemons verwendet, die über Pipes kommunizieren, und nur einer oder zwei von ihnen (die sehr wenig tun, außer Bytes zu akzeptieren oder auszugeben) als Root ausgeführt werden und der Rest mit niedrigeren Rechten ausgeführt wird.


Linux
  1. Gibt es eine Möglichkeit, die Leistung von Linux-Pipes zu verbessern?

  2. Gibt es einen eigenständigen Flash Player für Linux?

  3. Linux-Dienste:Gibt es eine GUI für Dienste?

  4. Gibt es eine Möglichkeit, Ext-Dateisysteme dazu zu bringen, in Linux weniger Speicherplatz für sich selbst zu belegen?

  5. Gibt es eine Möglichkeit, in Linux nicht mehr für jede Kleinigkeit 'sudo' schreiben zu müssen?

So suchen Sie unter Linux nach Listening Ports (Ports in use)

Wie man sich unter Linux auf schlechtes Wetter vorbereitet

Gibt es einen OneDrive-Client für Linux?

40 Nützliche Beispiele für Linux-PS-Befehle für angehende SysAdmins

Befehle für das Prozessmanagement in Linux

Gibt es ein WinSCP-Äquivalent für Linux?