Home > GNU/Linux, Sicurezza e GNU/Linux > Sicurezza e GNU/Linux (5): Dividere i processi per renderli più sicuri

Sicurezza e GNU/Linux (5): Dividere i processi per renderli più sicuri

Il fork in linguaggio C

Il fork in linguaggio C

Se avete mai visto film a tema militare, probabilmente ricorderete almeno una scena in cui il capo del plotone che deve infiltrarsi tra le linee nemiche ordina ai suoi: “Dividiamoci”. Se è vero che l’unione fa la forza, è altrettanto vero che dividersi può evitare che tutti i membri di un gruppo vengano catturati e uccisi.

Come abbiamo visto il maggior problema da risolvere nei sistemi di tipo Unix è il fatto che l’utente root è onnipotente e, pertanto, va usato con estrema cautela. A volte però non è immediato fare in modo che un compito delicato venga eseguito non da root, ma da un utente non privilegiato. Un esempio tipico è quello dei servizi che comunicano con l’esterno attraverso la rete. Un servizio, per chi non lo sapesse, è la funzionalità di un programma di tipo server, in esecuzione su una macchina, che esso fornisce ad un programma client. Ad esempio il servizio web (http) può essere fornito da un programma come Apache, che per questo prende il nome di server web (ed è per inciso il server web largamente più diffuso su Internet). Il client è in questo caso qualsiasi programma per navigare sul web (un browser insomma) come Firefox o Google Chrome.
Un altro esempio è Samba, che fornisce il servizio SMB, cioè il servizio di condivisione di file e stampanti primariamente implementato su Windows.
Sia il servizio http (quello fornito da Apache) che il servizio SMB, utilizzano connessioni su protocollo TCP/IP (cioè i protocolli Internet) attraverso le cosiddette porte basse, vale a dire quelle con numerazione fino a 1024.
Ora, per motivi di sicurezza, solo root può aprire una connessione in entrata (necessaria ad un programma server) su porte basse. Il motivo è che se non fosse così, qualsiasi utente potrebbe interferire con questi servizi. Immaginate ad esempio una macchina che fa da server web ma che ha anche un certo numero di utenti e si connettono tramite una shell remota. Questi utenti potrebbero avviare dei loro server in ascolto sulla porta 80 (quella normalmente riservata al servizio http) magari approfittando di un momento in cui il programma server legittimo viene riavviato, con in risultato di poter fornire proprie pagine web (quindi non autorizzate) ai client remoti.
Aprire la porta 80, quindi richiede di essere amministratore di sistema, ma l’esserlo pone un grosso problema di sicurezza: se Apache deve girare come root, allora una falla di Apache può fornire ad un attaccante la possibilità di eseguire codice arbitrario come utente root. Un bel guaio.
La soluzione è chiamata “separazione dei privilegi”. Quando Apache riceve una richiesta di connessione, esso lancia una nuova copia di se stesso (ovvero, fa un fork del processo principale), ma ne cambia l’utente proprietario. Sarà questa “copia” ad eseguire il 99% del lavoro (ad esempio chiamare il processore php per generare una pagina dinamica e poi formattarla per poi fornirla al client). Il processo principale si limiterà a trasmettere i dati dalla rete al processo figlio, riducendo drasticamente la superficie di attacco per un eventuale malintenzionato: in altre parole, ci sarà poco codice in esecuzione come root mentre la maggioranza dei compiti verrà eseguita da utenti normali. Ma quali utenti? Di norma a seguito dell’installazione di un programma server viene creato un utente speciale (nel caso di Apache si chiama www-data) che ha un profilo di sicurezza elevato: non ha una password (quindi non può loggarsi alla macchina) e non ha neppure una shell (in realtà ogni utente Unix deve avere una shell, ed in questo caso la shell sarà /bin/false).
In altre parole www-data è quello che molte distribuzioni chiamano “utente di sistema”: un sostituto di root per i compiti più delicati.
Nello stesso modo operano tutti i programmi server che usano le porte basse.

Come nel caso di chi non deve farsi colpire dai cecchini nemici, dividersi aumenta le probabilità di scampare ai pericoli.
La domanda è: funziona? Pare proprio di sì. Apache, nonostante la sua larghissima diffusione pari a circa 3 volte quella dei suo diretto concorrente IIS di Microsoft, è secondo le statistiche di Google alla pari con esso in quanto a numero di server bucati. In altre parole Apache è, in the wild, tre volte più sicuro di IIS. Una ulteriore dimostrazione che la diffusione di un software non è necessariamente collegata in modo diretto alla sua vulnerabilità.

About these ads
  1. PerryGi
    23 aprile 2011 alle 14:56

    Grazie Guido, chiaro ed esauriente.

  2. Cippaciong
    25 aprile 2011 alle 22:32

    Un’altra guida di un certo livello ma che può essere compresa veramente da tutti!
    Grazie!

  3. aldo
    30 aprile 2011 alle 0:42

    bello bello! ma sta storia dei processi non l’ho mai capita… intendo in senso tecnico. cioè in teoria l’ho capita. ma la storia che c’è li sulla foto “fork… ecc”.
    ho un manuale del C ma non spiega come funzionano bene i processi. non è che qualcuno (tipo te Guiodic) conosce una buona fonte che spiega bene tecnicamente come funziona e come scrivere un programma dividendo i processi??? intendo a livello di codice… ciaoooooo

  1. No trackbacks yet.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 733 follower

%d blogger cliccano Mi Piace per questo: