Řešení 1:
To je samozřejmě možné. Stačí zadat binární kód CAP_NET_BIND_SERVICE.
sudo setcap cap_net_bind_service=ep some-binary
V Linuxu byly věci, které může root dělat, rozděleny do sady schopností. CAP_NET_BIND_SERVICE je schopnost vázat se na porty <=1024.
Pravděpodobně je dokonce možné použít AppArmor, SELinux nebo jiný bezpečnostní modul Linux (LSM) k udělení přístupu programu, aby svázal konkrétně tento jeden port, ale myslím, že by to byla ztráta času. Zabezpečení ve skutečnosti není založeno na číslech portů do té míry, jako tomu bylo v dávné minulosti.
Zde je skript pro OSX pro předávání portů 80 a 443 na neprivilegované porty:
echo "
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -
Řešení 2:
Dalším způsobem, jak přimět démona, aby odpovídal na požadavky z nižšího čísla portu, je použít iptables nebo podobné k přesměrování portu s nižším číslem na port s vyšším číslem, na kterém váš démon naslouchá:
sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080
Nahraďte 80 portem, který chcete vystavit, a 8080 portem pro naslouchání vaší aplikaci.
Řešení 3:
Myslím, že existuje způsob, jak to udělat, ale nejsem si 100% jistý, zda by to fungovalo.
jedná se o vazbu portu, který vyžaduje root, nikoli o to, že jej aplikace používá, takže níže uvedená metoda může fungovat, ale v první řadě musíte mít přístup sudo.
Nejprve spustíte proces jako uživatel root pomocí sudo myApp
, jakmile je port vázán, můžete přepnout vlastníka procesu na neprivilegovaného uživatele.
Řešení 4:
Matně si vzpomínám na knihovnu nazvanou „authbind“, která dělá to, co potřebujete, tím, že zabalí systémové volání bind() (prostřednictvím knihovny LD_PRELOAD), a pokud je požadován privilegovaný port, vytvoří kořenový program setuid, který obdrží kopii deskriptor souboru, poté ověří, že aplikace je skutečně oprávněna navázat vazbu na port, provede bind() a ukončí se.
Nejste si jisti stavem projektu, ale metoda by měla být v případě potřeby poměrně jednoduchá (re)implementace.