Dobře, díky lidem, kteří upozornili na systém schopností a CAP_NET_BIND_SERVICE
schopnost. Pokud máte nedávné jádro, je skutečně možné použít toto ke spuštění služby jako non-root, ale svázat nízké porty. Krátká odpověď je, že ano:
setcap 'cap_net_bind_service=+ep' /path/to/program
A pak kdykoli program
se spustí poté, bude mít CAP_NET_BIND_SERVICE
schopnost. setcap
je v debian balíčku libcap2-bin
.
Nyní k upozorněním:
- Budete potřebovat alespoň jádro 2.6.24
- Toto nebude fungovat, pokud je vaším souborem skript. (tj. ke spuštění interpretu používá řádek #!). V tomto případě, pokud tomu dobře rozumím, byste museli tuto schopnost aplikovat na samotný spustitelný soubor tlumočníka, což je samozřejmě bezpečnostní noční můra, protože tuto schopnost bude mít jakýkoli program používající tento tlumočník. Nebyl jsem schopen najít žádný čistý a snadný způsob, jak tento problém vyřešit.
- Linux zakáže LD_LIBRARY_PATH na jakémkoli
program
který má zvýšená oprávnění jakosetcap
nebosuid
. Pokud tedy vášprogram
používá svůj vlastní.../lib/
, možná se budete muset podívat na jinou možnost, jako je přesměrování portů.
Zdroje:
- manuálovou stránku schopností(7). Pokud se chystáte používat funkce v produkčním prostředí, přečtěte si to dlouho a důkladně. Existuje několik opravdu složitých podrobností o tom, jak se schopnosti dědí v rámci volání exec(), které jsou podrobně popsány zde.
- manuálovou stránku setcap
- "Svázat porty pod 1024 bez root na GNU/Linux":Dokument, který mě jako první upozornil na
setcap
.
Poznámka:RHEL to poprvé přidalo ve verzi 6.
Můžete provést přesměrování portu. To je to, co dělám pro server zásad Silverlight běžící na Linuxu
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300
Standardním způsobem je nastavit je jako "setuid", aby se spustily jako root, a pak toto oprávnění root zahodí, jakmile se připojí k portu, ale ještě předtím, než k němu začnou přijímat připojení. Dobré příklady toho můžete vidět ve zdrojovém kódu pro Apache a INN. Bylo mi řečeno, že Lighttpd je dalším dobrým příkladem.
Dalším příkladem je Postfix, který používá více démonů, kteří komunikují prostřednictvím rour, a pouze jeden nebo dva z nich (které dělají velmi málo kromě přijímání nebo vysílání bajtů) běží jako root a ostatní běží s nižším oprávněním.