it-swarm-eu.dev

Umožňuje uživateli nechat poslouchat port pod 1024

Musím dovolit, aby uživatel (jiný než root) provozoval server naslouchající na portu 80.

Existuje nějaký způsob, jak to udělat?

65
peoro

setcap 'cap_net_bind_service=+ep' /path/to/program

to bude fungovat pro specifické procesy. Chcete-li však konkrétnímu uživateli umožnit vazbu na porty pod 1024, musíte jej přidat do sudoerů.

Podívejte se na toto diskuze pro více.

53
Rohan Monga

(Některé z těchto metod byly zmíněny v jiných odpovědích; dávám několik možností v hrubém pořadí preferencí.)

Nízký port můžete přesměrovat na vysoký port a poslouchat na vysokém portu.

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080

Po spuštění naslouchání na privilegovaném portu můžete spustit server jako root a upustit oprávnění. Nejdříve raději než kódování sami, spusťte svůj server z obálky, který tuto úlohu provede za vás. Pokud váš server spustí jednu instanci na připojení, spusťte ji z inetd (nebo podobného programu, jako je xinetd ). Pro inetd použijte řádek jako je tento v /etc/inetd.conf:

http  stream  tcp  nowait  username:groupname  /path/to/server/executable  argv[0] argv[1]…

Pokud váš server poslouchá v jedné instanci, spusťte jej z programu, jako je authbind . Buď vytvořte prázdný soubor /etc/authbind/byport/80 a učinit jej spustitelným pro uživatele provozujícího server; nebo vytvořit /etc/authbind/byuid/1234, kde 1234 je UID provozující server, obsahující řádek 0.0.0.0/0:80,80.

Pokud je spustitelný soubor serveru uložen v souborovém systému, který podporuje funkce, můžete mu dát cap_net_bind_serviceschopnost . Dejte si pozor, že funkce jsou stále relativně nové a stále mají několik uzlů .

setcap cap_net_bind_service=ep /path/to/server/executable

Authbind , @Gilles ji již zmínil, ale rád bych ji trochu rozšířil.

Má pohodlné řízení přístupu (podrobnosti v manuálové stránce): můžete filtrovat přístup podle portu, adresy rozhraní, uid, rozsahu adresy nebo portu a jejich kombinace.

Má velmi užitečný parametr --depth:

- hloubka úrovně

Způsobí, že program Authbind ovlivní programy, které jsou hluboko v grafu volajícího. Výchozí hodnota je 1.

"Hladiny hluboké" znamená, když skript (nebo program) spustí další skript, který sestoupí na úroveň. Takže pokud máte --depth 5, Znamená to, že na úrovni 1 (nebo je to 0?) Až 5 máte povolení k vázání, zatímco na úrovni 6 a dále nemáte. Je to užitečné, pokud chcete mít přístup ke skriptu, ale ne k programům, které běží s vědomím nebo bez něj.


Pro ilustraci byste mohli mít něco podobného: z důvodu bezpečnosti máte uživatele Java, který má spustit pouze Java a chcete mu poskytnout přístup k portu) 80:

echo > /etc/authbind/byport/80
chown root:Java /etc/authbind/byport/80
chmod 710 /etc/authbind/byport/80

Vytvořil jsem ../byport/80 file, Vzhledem ke skupině uživatelů Java (každý uživatel má svou vlastní skupinu), a učinil jsem jej spustitelným po skupině, což znamená, že je spustitelný Java uživatel. Pokud dáváte přístup prostřednictvím portu, musí soubor spustit uživatel, který by měl mít přístup, takže jsme to udělali.

To by stačilo pro průměrného Joea, ale protože víte, jak používat parametr --depth, Spustíte (jako uživatel Java) authbind --depth [depth] my_web_app's_start_script Počínaje --depth 1 a propracovávejte se, dokud nenajdete nejmenší hloubku, která to funguje a používá.

Podrobnosti si přečtěte na manuálové stránce .

4

Krátká odpověď je, že to není možné záměrně.

Dlouhou odpovědí je, že ve světech s otevřeným zdrojovým kódem si mnoho lidí hraje s designem a přichází s alternativními metodami. Obecně je všeobecně uznávanou praxí, že by to nemělo být možné. Skutečnost, že se pokoušíte pravděpodobně znamená, že ve vašem systému máte další konstrukční chybu a měli byste znovu zvážit celou vaši architekturu systému s ohledem na osvědčené postupy * a bezpečnostní dopady.

Jeden program pro autorizaci přístupu k nízkým portům bez oprávnění root je authbind . selinux a grsecurity také poskytují rámce pro takové doladěné autentizace.

A konečně, pokud chcete, aby konkrétní uživatelé spouštěli konkrétní programy jako root a co skutečně potřebujete, je pouze umožnit uživateli restartovat Apache nebo něco podobného, ​​Sudo je váš přítel!

4
Caleb

Můžete použít netcat nebo xinetd nebo iptables port forwarding, nebo použít Apache jako front-end proxy a spustit proces na non-privilegovaný port.

3
jamespo

Vyzkoušel jsem metodu iptables PREROUTING REDIRECT, ale zjistil jsem, že ovlivňuje také předávané pakety. To znamená, že pokud stroj také předává pakety mezi rozhraními (např. Pokud funguje jako přístupový bod Wi-Fi připojený k síti Ethernet), pak pravidlo iptables také zachytí připojení připojených klientů k internetovým cílům a přesměruje je na stroj. To jsem nechtěl - jen jsem chtěl přesměrovat spojení, která byla směrována na samotný stroj.

Jednou z možností je použít TCP předávání portů. Například pomocí socat:

socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080

Nevýhodou této metody je však to, že aplikace, která poslouchá na portu 8080, potom nezná zdrojovou adresu příchozích připojení (např. Pro protokolování nebo jiné identifikační účely).

1
Craig McQueen