Sebbene 80 e 443 siano porte di sistema, in che modo la maggior parte dei server Web è comunque in grado di collegarsi ad esse?


18

L'esecuzione di un servizio Web che si collega alla porta 80 di solito non richiede privilegi sudoer. Poiché le porte 80/443 sono porte di sistema, il che significa che possono essere utilizzate solo da utenti privilegiati, come mai quei servizi sono ancora in grado di collegarsi a queste porte?



1
"di solito non richiede i privilegi di sudoer" non è corretto.
tedder42,

Risposte:


29

Esistono sostanzialmente due approcci diversi:

  1. Inizialmente avvia l'esecuzione come root, esegui il bind alla porta privilegiata e quindi passa a un utente non privilegiato.

  2. inetd o xinetd viene eseguito con privilegi e inoltra le richieste al server Web in esecuzione senza privilegi.


3
Su Linux puoi anche applicare la funzionalità CAP_NET_BIND_SERVICE al programma oppure puoi usare iptables per reindirizzare una porta di sistema su una porta normale.
Zan Lynx,

10
e solo per chiarire l'OP: il motivo per cui l'opzione n. 1 funziona perché quando i processi rilasciano i privilegi, sono autorizzati a conservare i descrittori di file aperti, anche se non potrebbero aprirli una seconda volta.
Strugee,

C'è anche Authbind .
Boris the Spider

5

Poiché le porte 80/443 sono porte di sistema, ciò significa che possono essere utilizzate solo da utenti privilegiati

Penso che tu abbia sbagliato. Chiunque può usare queste porte. Associarsi a loro è un'operazione privilegiata.

La logica qui è che alcuni utenti Joe non dovrebbero essere in grado di scrivere un server Web dannoso e quindi creare un host su cui non ha diritti amministrativi. Naturalmente questo è un modello piuttosto debole, di solito nulla impedisce a Joe di mettere il proprio computer in rete e potrebbe avere diritti amministrativi su qualsiasi macchina a cui abbia accesso fisico.

Farò una dimostrazione con netcat.

Come utente normale, non posso associare alla porta 80:

$ nc -l -p 80
Can't grab 0.0.0.0:80 with bind : Permission denied

Posso associare alla porta 8080:

$ nc -l -p 8080

Nel frattempo in un altro terminale, posso collegarmi alla porta 80 e inviare alcuni dati, e vederli apparire alla fine del server che ho appena avviato:

$ nc 127.0.0.1 8080 <<<"Hello world"

Se voglio associare alla porta 80, devo essere root:

$ sudo nc -l -p 80

Oppure posso assegnare la CAP_NET_BIND_SERVICEfunzionalità al ncbinario:

$ cp `which nc` .
$ sudo setcap 'cap_net_bind_service=+ep' ./nc
$ ./nc -l -p 80

Un'altra opzione è quella di scrivere il programma del server in modo tale che dopo averlo chiamato listen()abbandoni i privilegi di root. Questa è una soluzione abbastanza comune e la vedrai con la maggior parte dei demoni. Apache, ad esempio, viene avviato da init come root, quindi rilascia i privilegi di root e diventa l'utente www-datao qualcosa di simile una volta associato alla porta 80. Prova a eseguire /etc/init.d/apache startcome non root e Apache probabilmente non si avvia.


La domanda dice "si legano a queste porte". Perché pensi che abbia sbagliato?
Barmar,
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.