Perché sudo è necessario per avviare un server web su un determinato ip: port?


9

Sto installando un server web basato su Python sulla mia casella Debian.

Impostare:

  • Il sistema operativo Debian è basato su VM, ma ho cambiato VirtualBox da NAT a Bridged.
  • IP della configurazione VM = 192.168.1.7(per la schermata di amministrazione del mio router o ifconfig).
  • Ho impostato con successo il port forwarding del mio router sia per ssh che per HTTP.
  • Ho impostato con successo il DNS dinamico del mio router usando dyndns.com.

Indipendentemente dal server web Python specifico che sto usando (Django, CherryPy, libreria standard), devo avviare il server web @ 192.168.1.7:80 sudo. In caso contrario, viene visualizzato un errore per non avere l'autorizzazione ad accedere alla porta. Nessuno dei tutorial del server web menziona la necessità di utilizzare sudoquando si specifica una porta ip:.

Domanda: perché devo utilizzare sudoper avviare questi server web? È un'indicazione che non dovrei usare 192.168.1.7? O che non sto impostando un file di configurazione correttamente da qualche parte?

Risposte:


11

Solo i processi con permessi di root possono ascoltare su porte privilegiate. Questa è una convenzione di sicurezza Unix standard.


È comune avviare server web usando sudo su 80? Oppure esiste un'altra strategia per utilizzare una porta> 1024 (ad esempio 8000, 8080)?
Begbie00,

@ Begbie00 Sì, è abbastanza comune eseguire server Web su porte più alte. Ma viene utilizzato principalmente per server Web non accessibili pubblicamente su Internet o in esecuzione su macchine in cui gli utenti non dispongono delle autorizzazioni di root. I server Web utilizzati per lo sviluppo e il test vengono eseguiti quasi esclusivamente su porte non privilegiate.
Šimon Tóth,

2
Sfortunatamente questa affermazione non è pienamente vera per i moderni sistemi unix. Vedi la mia risposta per i dettagli, ma Linux moderno, ad esempio, consente un controllo delle autorizzazioni più dettagliato grazie alle funzionalità. Inoltre Solaris dispone di un sistema di sicurezza a grana fine chiamato RBAC. Questi meccanismi consentono di assegnare autorizzazioni come l'associazione a porte privilegiate a utenti o programmi specifici.
SkyBeam,

14

È normale che agli utenti non privilegiati non sia consentito associare porte privilegiate (numeri di porta inferiori a 1024). Pertanto, un'applicazione che desidera associare alla porta 80, ad esempio, dovrà eseguire privilegi (di solito questo significa eseguire come root) per associarsi a questa porta.

Un approccio comune è quello di eseguire un piccolo processo "listener" con un utente privilegiato che accetta la connessione e quindi genera un processo non privilegiato per gestire la richiesta. I privilegi di rilascio per l'elaborazione della richiesta vengono eseguiti per motivi di sicurezza. Se qualcuno è in grado di sfruttare il processo che gestisce la richiesta, in genere consente a un intruso di eseguire comandi utilizzando gli stessi privilegi del processo di elaborazione. Pertanto, sarebbe male gestire l'intera richiesta utilizzando un processo privilegiato.

Tuttavia, per molte applicazioni è comune al giorno d'oggi eseguire come non root; ma tali processi ovviamente non possono legarsi a porte privilegiate in configurazione standard. Quindi server come Tomcat o JBoss erano soliti associarsi a porte alte come 8080, quindi non hanno bisogno di un ascoltatore privilegiato.

Naturalmente se esponete un tale processo a Internet probabilmente fornireste l'accesso sulla porta 80 poiché ogni browser proverebbe prima a connettersi alla porta 80 quando viene utilizzato il protocollo HTTP. Una soluzione comune per fornire ciò consiste nell'utilizzare un firewall o un traduttore di porte tra l'applicazione e Internet pubblico. Quindi le richieste colpiscono il firewall che richiede la porta 80 ma il firewall inoltra la richiesta ad un host interno sulla porta 8080. In questo modo il vero web server può operare su porte alte pur essendo pubblicamente disponibile sulla porta 80.

- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]

A volte questo reindirizzamento viene semplicemente eseguito utilizzando la iptablesregola NAT:

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

Ciò consente l'esecuzione di un'applicazione senza privilegi in ascolto sulla porta 8080 mentre tutte le richieste in arrivo per la porta 80 vengono semplicemente reindirizzate alla porta 8080.

Tuttavia, usando i moderni kernel Linux esiste un'altra possibilità: utilizzare le funzionalità.

setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary

Ciò consentirebbe binarydi collegarsi a porte privilegiate anche se avviato come da utente non root. Vedi man capabilitiesper maggiori dettagli.


Le funzionalità fanno parte di POSIX o sono solo specifiche di Linux?
Šimon Tóth,

@Let_Me_Be Come ho capito da en.wikipedia.org/wiki/Capability-based_security POSIX ha definito un concetto basato sulle capacità, ma è diverso da ciò che è stato implementato in Linux. Quindi penso che funzionalità Linux come CAP_NET_BIND_SERVICE siano solo specifiche di Linux.
SkyBeam,
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.