Come posso aprire la porta 80 in modo che un processo non root possa legarsi ad essa?


46

Voglio eseguire un server Web sul mio Mac come processo non root. Normalmente solo i processi di root possono collegarsi alla porta 80 (o a qualsiasi porta inferiore a 1024).

Posso aprire specificamente la porta 80 in modo che i processi non root possano ascoltarla?



più come domanda unix.stackexchange.com , non è vero?
Filip Bartuzi,

1
perché unix se è su un sistema macos?
nhed

Risposte:


28

Questo è difficile da eseguire in base alla progettazione e, a meno che non si disponga dell'accesso root alla propria macchina, nessuna delle seguenti funzioni funzionerà in quanto richiedono il root per configurare le modifiche. Una volta modificato, tuttavia, i programmi userspace avranno accesso senza root.

Esistono due modi comuni per ottenere questo risultato e quale scegli dipenderà dal motivo per cui stai cercando di aggirare la restrizione:

Puntare la porta 80 su un'altra porta, ad esempio 8080

Riconfigurando la macchina per passare tutto il traffico della porta 80 alla porta 8080 o qualsiasi porta di propria scelta, è possibile consentire ai server dello spazio utente di ricevere le porte dei privilegi di root nell'area a cui hanno accesso.

Il processo è semplice:

Passaggio 1: visualizza le regole del firewall correnti.

sudo ipfw show

Passaggio 2: aggiungere la regola di port forwarding (da 80 a 8080)

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

Se si desidera rimuovere le regole del firewall eseguite:

sudo ipfw flush

( fonte )

Si tratta di una modifica temporanea, che verrà ripristinata al riavvio o svuotata come indicato nell'ultima riga.

È possibile rendere permanente la modifica oppure aggiungere il comando come riga di avvio prima di avviare il server, che è probabilmente più sicuro dal punto di vista della sicurezza.

Usa Authbind

Authbind è stato progettato specificamente per consentire a un programma di accedere a porte di livello inferiore senza dargli accesso root completo.

C'è una porta MacOSX:

https://github.com/Castaglia/MacOSX-authbind

Tuttavia, potrebbe essere limitato al traffico IPv4, quindi potrebbe essere necessario effettuare ulteriori accertamenti per scoprire se soddisfa le tue esigenze


AMI MacOSX-authbind ... Ti consente, ad esempio, di eseguire un server Web sulla porta 80, come "amministratore regolare". cioè nel tuo launchd .plist... ` "ProgramArguments": [ "path/to/authbind", "/usr/bin/php", "-c", "/www/.router.ini", "-S", "0.0.0.0:80", "-t", "/www", "/www/.router.php"]Woohoo!
alex gray,

13
OS X Yosemite rimuove ipfw. Questa sintesi descrive una soluzione alternativa che utilizza pf.
lyschoening,

Si noti che il reindirizzamento del traffico alla porta non privilegiata può essere insicuro se ci si trova in un ambiente condiviso; un altro processo può essere associato a quella porta prima che il programma lo faccia o se il programma sblocca la porta anche momentaneamente per un riavvio rapido.
Lie Ryan,

authbind è davvero un'ottima soluzione, grazie!
favo

7

È possibile utilizzare ncatper inoltrare il traffico da un server Web in esecuzione su un'altra porta:

sudo ncat -l -p 80 -c ' ncat -l -p 1234'

Questo inoltrerà il traffico sulla porta 80 a localhost: 1234. Questo è un po 'un kludge, tuttavia, non lo userei da nessuna parte oltre i test rapidi e sicuramente non in produzione.

Si noti che ciò non consentirà a un processo non root di collegarsi ad esso, ma selezionando una porta a cui il processo può collegarsi, 1234 in questo esempio, sembrerà che sia associato alla porta 80. Questo sta facendo l'equivalente di inoltro della porta 80 alla porta 1234 con un firewall, ma su base molto più temporanea.


2
Questa è una buona soluzione. NB. ncatviene fornito con il nmapquale può essere installato tramite porte Mac con sudo port install nmap. MacPorts stesso può essere installato da macports.org/install.php .
William Denniss,

Questo mi dà solo un errore: indirizzo già in uso errori.
Matt Joiner,

Lo stesso qui - non ha funzionato. Questo ha funzionato: unix.stackexchange.com/a/187038
Sebastian J.

2

Puoi anche usare ssh per eseguire il port forwarding. Quindi, se hai un server in esecuzione su 8080, puoi inoltrare il traffico dalla porta 80. Ecco uno script che uso, che interrompe l'apache nativo se è in esecuzione e inoltra il traffico:

forward8080to80.command:

echo "You may close this terminal and the forwarding will continue."
echo "To stop, kill the ssh process found by `sudo lsof -i ':80' | grep LISTEN`"
sudo apachectl stop
sudo ssh user@127.0.0.1 -L 80:127.0.0.1:8080

Il port forwarding SSH può avere prestazioni piuttosto basse e le funzionalità di sicurezza non hanno molto senso in un ambiente locale-> locale. Meglio usare il port forwarding integrato di osx o qualcosa come ncat.
Shayne,

-3

Quello che dovresti essere in grado di fare è aprire la porta 80 sul tuo router e puntarla all'indirizzo IP locale del tuo server web. Quindi, sul tuo Mac, abilita la Condivisione Web dal pannello Preferenze di Sistema> Condivisione delle preferenze e punta sulla directory di tua scelta. Questo ha funzionato per me in passato fino al passaggio al server 10.6.


1
Sto cercando questo come soluzione per la mia macchina di sviluppo. Dal momento che devo lavorare in luoghi in cui non ho il controllo del router, questa soluzione non potrebbe funzionare per me. Ho il sospetto che dovrebbe funzionare se stai configurando un server e per qualche motivo non ha accesso come root.
Avner,

Quindi, per essere chiari, stai provando a configurare un server web su diversi siti client, ma non hai accesso alla porta aperta 80? Come aprirai la porta sul router se non hai accesso? Sto capendo correttamente o sto andando lontano dalla base?
Matt Love

Sto solo cercando di utilizzare la porta 80 sulla mia macchina di sviluppo non su un server di produzione. Mi schierò comunque su Heroku.
Avner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.