GNU/Linux >> Znalost Linux >  >> Linux

Existuje způsob, jak se procesy, které nejsou rootem, vázat na privilegované porty v Linuxu?

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:

  1. Budete potřebovat alespoň jádro 2.6.24
  2. 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.
  3. Linux zakáže LD_LIBRARY_PATH na jakémkoli program který má zvýšená oprávnění jako setcap nebo suid . 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.


Linux
  1. Linux – nástroj pro měření kvality entropie?

  2. Existuje grafické uživatelské rozhraní C++ gdb pro Linux?

  3. Proč neexistuje rozhraní DirectX API pro Linux?

  1. Existuje způsob, jak zlepšit výkon linuxových trubek?

  2. Služby Linuxu:existuje grafické uživatelské rozhraní pro služby?

  3. Existuje způsob, jak zajistit, aby souborové systémy ext v Linuxu využívaly méně místa pro sebe?

  1. 30 Cvičení procesů Linuxu pro systémové správce

  2. Existuje způsob, jak zkontrolovat aktuální rpath v Linuxu?

  3. Existuje alternativa pro JTS TestBuilder na Linuxu?