GNU/Linux >> Znalost Linux >  >> Linux

Povolit procesu bez oprávnění root navázat se na port 80 a 443?

Nejsem si jistý, na co odkazují ostatní odpovědi a komentáře zde. To je možné poměrně snadno. Existují dvě možnosti, obě umožňují přístup k portům s nízkým číslem, aniž byste museli povýšit proces na root:

Možnost 1:Použijte 03 pro udělení přístupu k portu s nízkým číslem procesu:

Díky tomu můžete udělit trvalý přístup ke konkrétnímu binárnímu souboru pro připojení k portům s nízkým číslem prostřednictvím 10 příkaz:

sudo setcap CAP_NET_BIND_SERVICE=+eip /path/to/binary

Další podrobnosti o části e/i/p viz 28 .

Poté 33 se bude moci vázat na porty s nízkým číslem. Všimněte si, že musíte použít 47 na samotném binárním souboru spíše než na symbolický odkaz.

Možnost 2:Použijte 50 pro udělení jednorázového přístupu s jemnějším ovládáním uživatelů/skupin/portů:

62 (man page) nástroj existuje přesně pro toto.

  1. Nainstalujte 79 pomocí vašeho oblíbeného správce balíčků.

  2. Nakonfigurujte jej tak, aby uděloval přístup k příslušným portům, např. povolit 80 a 443 od všech uživatelů a skupin:

    sudo touch /etc/authbind/byport/80
    sudo touch /etc/authbind/byport/443
    sudo chmod 777 /etc/authbind/byport/80
    sudo chmod 777 /etc/authbind/byport/443
    
  3. Nyní spusťte příkaz pomocí 82 (volitelně s uvedením 99 nebo jiné argumenty, viz manuálová stránka):

    authbind --deep /path/to/binary command line args
    

    Např.

    authbind --deep java -jar SomeServer.jar
    

Oba výše uvedené mají své klady a zápory. Možnost 1 uděluje důvěru binárně ale neposkytuje žádnou kontrolu nad přístupem na port. Možnost 2 uděluje důvěru uživateli/skupině a poskytuje kontrolu nad přístupem přes port, ale starší verze podporovaly pouze IPv4 (protože jsem to původně napsal, byly vydány novější verze s podporou IPv6).


Dale Hagglund je na místě. Takže řeknu totéž, ale jiným způsobem, s některými specifiky a příklady. ☺

Správná věc ve světě Unixu a Linuxu je:

  • mít malý, jednoduchý, snadno auditovatelný program, který běží jako superuživatel a váže naslouchací soket;
  • mít další malý, jednoduchý, snadno auditovatelný program, který zruší oprávnění vytvořená prvním programem;
  • máte maso ze služby v samostatné třetině spustit pod účtem, který není superuživatelem a zřetězeně načíst druhý program, přičemž se očekává, že jednoduše zdědí popisovač otevřeného souboru pro soket.

Máte špatnou představu o tom, kde je vysoké riziko. Vysoké riziko je ve čtení ze sítě a jednání na základě přečteného ne v jednoduchých úkonech otevření soketu, jeho připojení k portu a volání 100 . Právě ta část služby, která provádí skutečnou komunikaci, představuje vysoké riziko. Části, které se otevírají, 115 a 123 a dokonce (do určité míry) část, která 132 , nepředstavují vysoké riziko a mohou být provozovány pod záštitou superuživatele. Nepoužívají a nejednají podle nich (s výjimkou zdrojových IP adres v 141 case) data, která jsou v síti pod kontrolou nedůvěryhodných cizích lidí.

Existuje mnoho způsobů, jak toho dosáhnout.

155

Jak říká Dale Hagglund, starý "síťový superserver" 164 dělá tohle. Účet, pod kterým je proces služby spuštěn, je jedním ze sloupců v 179 . Neodděluje naslouchací část a část o zrušení oprávnění do dvou samostatných programů, malých a snadno auditovatelných, ale odděluje hlavní servisní kód do samostatného programu, 183 ed v procesu služby, který vytvoří s otevřeným deskriptorem souboru pro soket.

Obtížnost auditování není tak velký problém, protože člověk musí auditovat pouze jeden program. 198 Hlavním problémem aplikace není tolik auditování, ale spíše to, že ve srovnání s novějšími nástroji neposkytuje jednoduché jemnozrnné řízení runtime služeb.

UCSPI-TCP a daemontools

Balíčky UCSPI-TCP a daemontools Daniela J. Bernsteina byly navrženy tak, aby to dokázaly ve spojení. Alternativně lze použít do značné míry ekvivalentní sadu nástrojů daemontools-encore od Bruce Guentera.

Program pro otevření deskriptoru souboru soketu a navázání na privilegovaný místní port je 209 , od UCSPI-TCP. Dělá to jak 218 a 220 .

231 pak vytvoří buď servisní program, který sám zruší práva roota (protože obsluhovaný protokol vyžaduje začít jako superuživatel a pak se "přihlásit", jako je tomu například u FTP nebo SSH démona) nebo 244 což je samostatný malý a snadno auditovatelný program, který pouze zruší oprávnění a poté zřetězí zatížení do vlastního servisního programu (jehož žádná část tedy nikdy neběží s oprávněními superuživatele, jako je tomu například u 258 ).

Služba 268 skript by tedy byl například (tento pro dummyidentd pro poskytování služby null IDENT):

#!/bin/sh -e
exec 2>&1
exec \
tcpserver 0 113 \
setuidgid nobody \
dummyidentd.pl

nosh

Můj nosh balíček je k tomu navržen. Má malý 270 užitečnost, stejně jako ostatní. Jeden malý rozdíl je v tom, že je použitelný s 282 služby typu „LISTEN_FDS“ a také služby UCSPI-TCP, takže tradiční 291 program je nahrazen dvěma samostatnými programy:306 a 319 .

Opět se jednoúčelové utility spawnují a řetězově se navzájem načítají. Jednou ze zajímavých zvláštností návrhu je, že po 323 lze zrušit oprávnění superuživatele ale ještě před 337 . Zde je 341 skript pro 359 to skutečně dělá přesně to:

#!/bin/nosh
fdmove -c 2 1
clearenv --keep-path --keep-locale
envdir env/
softlimit -m 70000000
tcp-socket-listen --combine4and6 --backlog 2 ::0 smtp
setuidgid qmaild
sh -c 'exec \
tcp-socket-accept -v -l "${LOCAL:-0}" -c "${MAXSMTPD:-1}" \
ucspi-socket-rules-check \
qmail-smtpd \
'

Programy, které běží pod záštitou superuživatele, jsou malé nástroje pro řetězové načítání agnostických služeb 367 , 374 , 385 , 395 , 405 a 416 . Tím, že 423 je spuštěn, je soket otevřený a navázaný na 432 port a proces již nemá oprávnění superuživatele.

s6, s6-networking a execline

Síťové balíčky Laurenta Bercota s6 a s6 byly navrženy tak, aby to dokázaly ve spojení. Příkazy jsou strukturálně velmi podobné příkazům 443 a UCSPI-TCP.

459 skripty by byly téměř stejné, s výjimkou nahrazení 462 pro 471 a 484 pro 495 . Můžete se však také rozhodnout, že současně využijete sadu nástrojů execline od M. Bercota.

Zde je příklad služby FTP, lehce upravené oproti originálu Wayna Marshalla, která používá execline, s6, s6-networking a program FTP serveru z publicfile:

#!/command/execlineb -PW
multisubstitute {
    define CONLIMIT 41
    define FTP_ARCHIVE "/var/public/ftp"
}
fdmove -c 2 1
s6-envuidgid pubftp 
s6-softlimit -o25 -d250000 
s6-tcpserver -vDRH -l0 -b50 -c ${CONLIMIT} -B '220 Features: a p .' 0 21 
ftpd ${FTP_ARCHIVE}

ipsvd

Gerrit Pape's ipsvd je další sada nástrojů, která běží na stejném principu jako ucspi-tcp a s6-networking. Nástroje jsou 506 a 514 tentokrát, ale dělají to samé a vysoce rizikový kód, který provádí čtení, zpracování a zápis věcí odesílaných přes síť nedůvěryhodnými klienty, je stále v samostatném programu.

Zde je příklad spuštění 529 od M. Pape v 532 skript:

#!/bin/sh
exec 2>&1
cd /public/10.0.5.4
exec \
chpst -m300000 -Uwwwuser \
tcpsvd -v 10.0.5.4 443 sslio -v -unobody -//etc/fnord/jail -C./cert.pem \
fnord

540

557 , nový systém dohledu a inicializace služeb, který lze nalézt v některých distribucích Linuxu, je určen k tomu, co 564 může udělat. Nepoužívá však sadu malých samostatných programů. Je třeba provést audit 574 v celém rozsahu, bohužel.

S 588 jeden vytvoří konfigurační soubory pro definování soketu, který 594 poslouchá dál a službu, která 605 začíná. Soubor "jednotky" služby má nastavení, která umožňují velkou kontrolu nad procesem služby, včetně toho, pod jakým uživatelem běží.

S tímto uživatelem nastaveným na jiného než superuživatele 617 provede veškerou práci při otevření soketu, jeho navázání na port a volání 629 (a v případě potřeby 633 ) v procesu č. 1 jako superuživatel a proces služby, který vytvoří, běží bez oprávnění superuživatele.


Mám trochu jiný přístup. Chtěl jsem použít port 80 pro server node.js. Nemohl jsem to udělat, protože Node.js byl nainstalován pro uživatele bez sudo. Zkoušel jsem používat symlinky, ale nefungovalo mi to.

Pak jsem se dozvěděl, že mohu předávat spojení z jednoho portu na druhý. Spustil jsem tedy server na portu 3000 a nastavil port forward z portu 80 na port 3000.

Tento odkaz poskytuje skutečné příkazy, které lze k tomu použít. Zde jsou příkazy -

localhost/loopback

646

externí

653

Použil jsem druhý příkaz a fungoval pro mě. Takže si myslím, že toto je střední cesta pro to, aby uživatel neměl přístup k nižším portům přímo, ale aby jim přístup umožnil pomocí přesměrování portů.


Linux
  1. Jak otevřít port 80 a 443 ve FirewallD

  2. Nainstalujte SoftHSM a přistupujte k němu prostřednictvím programu Java

  3. Ssh – Jak zrušit běžící proces a přiřadit jej k novému prostředí obrazovky?

  1. Proč není CD program?

  2. Linux – Blokovat síťový přístup procesu?

  3. UNIX / Linux:Jak crontab ověřuje přístup na základě souborů cron.allow a cron.deny

  1. Jak povolit SFTP a zakázat SSH?

  2. sledovat konkrétní IP a port

  3. Proč by poskytovatel hostingu nepovolil SSL přes port 443?