setcap 'cap_net_bind_service=+ep' /path/to/program
Dies funktioniert für bestimmte Prozesse. Aber um einem bestimmten Benutzer zu erlauben, sich an Ports unter 1024 zu binden, müssen Sie ihn zu sudoers hinzufügen.
Weitere Informationen finden Sie in dieser Diskussion.
(Einige dieser Methoden wurden in anderen Antworten erwähnt; ich gebe mehrere Möglichkeiten in grober Reihenfolge der Präferenz.)
Sie können den Low-Port auf einen High-Port umleiten und den High-Port abhören.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080
Sie können Ihren Server mit Root- und Drop-Privilegien starten, nachdem er mit dem Abhören des privilegierten Ports begonnen hat. Anstatt das selbst zu programmieren, starten Sie Ihren Server vorzugsweise von einem Wrapper aus, der die Arbeit für Sie erledigt. Wenn Ihr Server eine Instanz pro Verbindung startet, starten Sie sie ab inetd
(oder ein ähnliches Programm wie xinetd
). Für inetd
, verwenden Sie eine Zeile wie diese in /etc/inetd.conf
:
http stream tcp nowait username:groupname /path/to/server/executable argv[0] argv[1]…
Wenn Ihr Server in einer einzigen Instanz lauscht, starten Sie ihn von einem Programm wie authbind
. Erstellen Sie entweder eine leere Datei /etc/authbind/byport/80
und ihn für den Benutzer ausführbar machen, der den Server betreibt; oder erstellen Sie /etc/authbind/byuid/1234
, wobei 1234 die UID ist, auf der der Server läuft, die die Zeile 0.0.0.0/0:80,80
enthält .
Wenn Ihre ausführbare Serverdatei auf einem Dateisystem gespeichert ist, das Capabilities unterstützt, können Sie ihr den cap_net_bind_service
geben Fähigkeit. Beachten Sie, dass die Funktionen noch relativ neu sind und noch ein paar Macken haben.
setcap cap_net_bind_service=ep /path/to/server/executable
Die kurze Antwort lautet, dass dies konstruktionsbedingt nicht möglich ist.
Die lange Antwort lautet, dass es in den Open-Source-Welten viele Leute gibt, die mit dem Design spielen und alternative Methoden entwickeln. Im Allgemeinen ist es allgemein anerkannte Praxis, dass dies nicht möglich sein sollte. Die Tatsache, dass Sie es versuchen, bedeutet wahrscheinlich, dass Sie einen weiteren Designfehler in Ihrem System haben und Ihre gesamte Systemarchitektur im Hinblick auf *nix Best Practices und Auswirkungen auf die Sicherheit überdenken sollten.
Ein Programm zum Autorisieren des Nicht-Root-Zugriffs auf niedrige Ports ist jedoch authbind. Sowohl selinux als auch grsecurity bieten auch Frameworks für solche fein abgestimmten Authentifizierungen.
Und schließlich, wenn Sie möchten, dass bestimmte Benutzer bestimmte Programme als root ausführen, und was Sie wirklich brauchen, ist, einem Benutzer zu erlauben, Apache oder ähnliches neu zu starten, sudo
ist dein Freund!