Vraag Bind naar poorten van minder dan 1024 zonder root-toegang [dupliceren]


Deze vraag heeft hier al een antwoord:

Ik zou graag applicaties draaien waar ik aan werk, die zich bindt aan poortnummers van minder dan 1000 zonder root-toegang.

Ik gebruik Linux Mint en heb root-toegang om het in te stellen. Ik zou het liefst willen kunnen doen over SSH.

Ook blij hoor als het niet mogelijk is of ik zou het niet moeten doen, als dat het geval is.

EDIT: meestal gebruik ik hogere poortnummers voor ontwikkeling, maar Flash verwacht een socketbeleid op poort 843. Momenteel moet ik de app als root uitvoeren en daarom kan ik deze niet uitvoeren vanuit mijn Makefile, een PITA .


42
2018-05-10 10:41


oorsprong


Het is niet mogelijk en je zou het niet moeten doen :) (en als je het moet doen, suexec en drop privileges na binding) - Tzarium
@Tzarium - Waardeer dat rechte antwoord, hoewel niet wat ik wilde horen :) Zal helaas worden gemarkeerd als snel geaccepteerd. - tarn
@Tzarium Het is niet alleen mogelijk, maar eenvoudig als uw systeem de bestandssystemen ondersteunt. Zie @ joeforker's setcapantwoord hieronder. - Gerald Combs
Authbind is ook een goed antwoord (van Simon hieronder). Dit is heel goed mogelijk, op verschillende manieren ... - Shane Madden♦
duplicaten: serverfault.com/questions/84360/...  serverfault.com/questions/182413/...  serverfault.com/questions/133415/...  serverfault.com/questions/245374/...  stackoverflow.com/questions/413807/...  stackoverflow.com/questions/2444591 - joeforker


antwoorden:


Een andere manier om je daemon te laten reageren op verzoeken van een lager poortnummer is om iptables of iets dergelijks te gebruiken om een ​​lager genummerde poort om te leiden naar de hoger genummerde poort waarnaar je daemon luistert:

sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080

Vervang 80 door de poort bloot te stellen en 8080 met de luisteraarpoort van uw toepassing.


36
2018-05-10 11:15



Ok, dat klinkt als een werkbare workaround. Ik zal daarnaar kijken, bedankt. - tarn
Dat is wat ik eerder heb gedaan en het werkt prima: iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 843 -j REDIRECT --to-port 8430 (dit leidt inkomende verbindingen op poort 843 om naar poort 8430) - Andrew Lambert
In tegenstelling tot setcap, kan elk programma, niet alleen het programma dat u hebt aangewezen, naar de niet-bevoorrechte poort luisteren. - joeforker


Natuurlijk is dit mogelijk. U hoeft alleen het binaire bestand CAP_NET_BIND_SERVICE te geven.

sudo setcap cap_net_bind_service=ep some-binary

In Linux zijn de dingen die root kunnen doen opgedeeld in een reeks mogelijkheden. CAP_NET_BIND_SERVICE is de mogelijkheid om te binden aan poorten <= 1024.

Het is waarschijnlijk zelfs mogelijk om AppArmor, SELinux of een andere Linux-beveiligingsmodule (LSM) te gebruiken om het programma toegang te verlenen om die ene poort specifiek te binden, maar ik denk dat dit een verspilling van tijd zou zijn. Beveiliging is niet echt gebaseerd op poortnummers in de mate dat het in het verre verleden was.

Hier is een script voor OSX om poorten 80 en 443 door te sturen naar niet-bevoorrechte poorten:

echo " 
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -

35
2018-05-10 15:37



Geweldig, dit is het antwoord dat ik wilde. Zal dat vanavond proberen. Bedankt. - tarn
Een beetje extra info over waarom dit is de enige benadering die werkt: kneuro.net/cgi-bin/lxr/http/source/net/ipv4/... . PROT_SOCK= 1024, en snum is de beoogde poort. - BMDan
Voor bonuspunten: bekijk AccessFS voor een echte hersenkraker. - BMDan
authbind werkt ook en maakt controle per poort en gebruiker / groep mogelijk, maar vergeet niet in te stellen /etc/authbind/byports dienovereenkomstig (veel mensen lijken te installeren authbind verwacht dan gewoon dat het out-of-the-box werkt). - Jason C
is er een vergelijkbare benadering op osx? - svassr


Ik denk dat er een manier is om het te doen, maar ik ben niet 100% zeker of dit zou werken.

het is de binding van de poort die root vereist, niet de applicatie die er gebruik van maakt, dus de onderstaande methode kan werken, maar je moet sudo-toegang in de eerste plaats hebben.

Eerst start je je proces als rootgebruiker sudo myApp, zodra de poort is gebonden, kunt u de eigenaar van het proces naar een niet-bevoorrechte gebruiker schakelen.


8
2018-05-10 10:47



Hiermee wordt de toepassing als root uitgevoerd en kan het systeem mogelijk worden blootgesteld aan beveiligingsrisico's. Werkt, maar de iptables-omleiding is veiliger. - HampusLi
Dit is de manier waarop bijna alle daemons werken; root start hen (init), ze openen de benodigde poorten en maken vervolgens hun UID / GID mogelijk voor een onbevoegde gebruiker. - Chris S


Ik herinner me een bibliotheek met de naam "authbind" die doet wat je nodig hebt, door de bind () systeemaanroep (via een LD_PRELOAD-bibliotheek) in te pakken en, als een geprivilegieerde poort wordt gevraagd, een setuid root-programma uit te brengen dat een kopie ontvangt van de bestandsbeschrijver en verifieert vervolgens of de toepassing inderdaad is toegestaan ​​om aan de poort te binden, voert de bind () en exits uit.

Niet zeker over de projectstatus, maar de methode moet redelijk eenvoudig zijn om (opnieuw) te implementeren als dat nodig is.


6
2018-05-10 12:24



Ik zou zeggen dat authbind verouderd is op Linux in vergelijking met mogelijkheden of AppArmor / SELinux / andere Linux-beveiligingsmodules. - joeforker