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:
- Sie benötigen mindestens einen 2.6.24-Kernel
- 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.
- Linux deaktiviert LD_LIBRARY_PATH auf allen
program
das über erhöhte Privilegien wiesetcap
verfügt odersuid
. Wenn also Ihrprogram
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.