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.
-
Nainstalujte
79
pomocí vašeho oblíbeného správce balíčků. -
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
-
Nyní spusťte příkaz pomocí
82
(volitelně s uvedením99
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ů.