{"id":145,"date":"2006-02-02T21:27:39","date_gmt":"2006-02-02T20:27:39","guid":{"rendered":"http:\/\/www.zarrelli.org\/new_blog\/?p=145"},"modified":"2006-02-02T21:27:39","modified_gmt":"2006-02-02T20:27:39","slug":"hardening-apachedownloade-installazione","status":"publish","type":"post","link":"https:\/\/www.zarrelli.org\/blog\/hardening-apachedownloade-installazione\/","title":{"rendered":"Hardening Apache,\rdownload\ne installazione"},"content":{"rendered":"<p>Aprire una porta su internet, lasciare che ignoti visitatori entrino e diano uno sguardo nell\u2019anticamera del vostro server \u00e8 sicuramente un\u2019operazione affascinante e, spesso, utile. Un server web dovrebbe proprio servire a questo, a creare uno spazio destinato ad accogliere le richieste pi\u00f9 diverse, a mostrare le informazioni che si vogliono condividere. Con il tempo, per\u00f2, le esigenze sono cresciute, sono divenute pi\u00f9 sofisticate, tanto che il semplice HTML \u00e8 diventato un linguaggio inadeguato ai nuovi scopi: pagine dinamiche, applicazioni su web, portali, weblog e tutta la teoria di strumenti interattivi ha reso pi\u00f9 sofisticati i siti e pi\u00f9 complessi i server web alle loro spalle.<br \/>\nApache \u00e8 un ottimo esempio di server versatile, potente e, tutto sommato, semplice da configurare: pu\u00f2 essere utilizzato da un utente di media esperienza per gestire il proprio sito Internet, come lo si pu\u00f2 riscontrare in portali o siti di classe enterprise a servire intranet ed extranet pi\u00f9 simili a vere e proprie applicazione browser-driven che a pagine di consultazione. Proprio la notevole interattivit\u00e0 delle applicazioni che possono essere costruite attorno a un web server ha portato all&#8217;emergere, nel corso degli anni, di una serie di problematiche legate alla sicurezza sia del framework, Apache, che dei programmi, scritti nei pi\u00f9 disparati linguaggi, dal Perl o C, per esempio, alle pagine PHP o JavaScript. Insomma, all&#8217;aumentare dell&#8217;interattivit\u00e0 delle pagine web \u00e8 corrisposta una crescita considerevole dei problemi legati alla sicurezza e delle contromisure che un amministratore di sistema deve essere in grado di porre in campo per assicurare una discreta sicurezza alle proprie installazioni.<\/p>\n<h3>Sicurezza stratificata<\/h3>\n<p>Cosa comporta mettere in sicurezza un web server?<br \/>\nIl problema, come spesso accade, si riflette su diversi livelli di amministrazione su un server:<\/p>\n<ol>\n<li>Mettere in sicurezza il sistema operativo;<\/li>\n<li>Mettere in sicurezza il framework (Apache);<\/li>\n<li>Mettere in sicurezza le applicazioni.<\/li>\n<\/ol>\n<p>In questa occasione tralasceremo la sicurezza relativa al sistema operativo, un&#8217;operazione decisamente complessa che richiederebbe un intero ciclo di articoli a se stante. Di passaggio possiamo solo fornire un suggerimento: una prima soluzione potrebbe consistere nel ricompilare il kernel utilizzando le patch grsecurity (www.grsecurity.net), impostando un alto livello di protezione. Non \u00e8 la soluzione ottimale, dato che la difesa di un sistema operativo si basa anch&#8217;essa su pi\u00f9 livelli di intervento, che vanno dalla ricompilazione dei sorgenti degli applicativi alle operazioni, almeno le pi\u00f9 elementari, di auditing; per\u00f2, l\u2019installazione di grsecurity pu\u00f2 essere un primo punto di approccio al problema, dal quale partire e approfondire in seguito.<\/p>\n<p>Ci\u00f2 che qui ci interessa \u00e8, primariamente, rendere pi\u00f9 affidabile Apache, partendo dalle \u201cradici\u201d del problema, iniziando a lavorare a livello di sorgente, per assicurarci della bont\u00e0 del programma e per mettere in gioco qualche diversivo in grado di disorientare i malintenzionati meno ferrati in materia di sicurezza.<\/p>\n<p>Il nostro primo passo sar\u00e0, quindi scaricare i sorgenti di Apache: \u00e8 indifferente quale si decida di utilizzare, se appartenente alla versione 1.x o alla 2.x.<\/p>\n<h3>Verifichiamo i sorgenti<\/h3>\n<p>La prima buona pratica da tenere a mente \u00e8 quella di preferire i server ufficiali del progetto Apache come fonte dalla quale scaricare i sorgenti sui quali si vuole lavorare. E&#8217; una semplice questione di sicurezza: \u00e8 decisamente pi\u00f9 difficile per qualche malintenzionato penetrare in queste macchine piuttosto che in un computer gestito in maniera amatoriale da qualche volenteroso.<\/p>\n<p>Una volta ottenuti i sorgenti, proseguiamo con una verifica della loro bont\u00e0: ogni sorgente fornito ufficialmente dal progetto Apache viene firmato digitalmente dal gestore della versione rilasciata e quindi bisogner\u00e0 provvedere a scaricare sia le firme PGP che gli hash MD5.<\/p>\n<p>Nel nostro esempio utilizzeremo i sorgenti contenuti nell&#8217;archivio:<\/p>\n<p><code>httpd-2.0.54.tar.gz<\/code><\/p>\n<p>Una volta scaricato il sorgente, dobbiamo prelevare anche la relativa firma PGP e l&#8217;hash MD5:<\/p>\n<p><code>httpd-2.0.54.tar.gz.md5<br \/>\nhttpd-2.0.54.tar.gz.asc<\/code><\/p>\n<p>Provvediamo a confrontare la firma ottenuta con i sorgenti scaricati, utilizzando un tool di gestione quale potrebbe essere GNU Privacy Guard:<\/p>\n<p><code>~$ gpg httpd-2.0.54.tar.gz.asc<br \/>\ngpg: Signature made lun 11 apr 2005 23:06:14 CEST using DSA key ID DE885DD3<br \/>\ngpg: Impossibile controllare la firma: chiave pubblica non trovata<\/code><\/p>\n<p>Qui incontriamo il primo ostacolo. Non possiamo controllare la bont\u00e0 dei sorgenti, dato che non abbiamo la chiave pubblica corrispondente. Da notare che l&#8217;identificativo della chiave pubblica messa a disposizione dal gestore di questa versione dei sorgenti per verificare la loro integrit\u00e0 \u00e8:<\/p>\n<p><code>DE885DD3<\/code><\/p>\n<p>Il problema \u00e8 di facile soluzione: baster\u00e0 utilizzare un gestore pubblico di chiavi per scaricare quella corrispondente all&#8217;identificativo indicato. Nel nostro caso useremo <code>keyserver.linux.it<\/code>, il quale \u00e8 fornito anche di una comoda interfaccia web che facilita notevolmente il compito a chi si trova un po&#8217; a disagio nell&#8217;utilizzo di gpg:<\/p>\n<p><code>~$ gpg --keyserver keyserver.linux.it --recv-key DE885DD3<br \/>\ngpg: requesting key DE885DD3 from hkp server keyserver.linux.it<br \/>\ngpg: key DE885DD3: public key \"Sander Striker <striker @apache.org>\" imported<br \/>\ngpg: non \u00e8 stata trovata alcuna chiave definitivamente affidabile<br \/>\ngpg: Numero totale esaminato: 1<br \/>\ngpg:              importate: 1<\/striker><\/code><\/p>\n<p>Abbiamo installato la chiave pubblica che ci interessa, prendendola da <code>keyserver.linux.it<\/code>: dato che i key server sono interconnessi fra di loro e si scambiano le chiavi, ognuno pu\u00f2 scegliere quello che ritiene migliore e pi\u00f9 affidabile.<\/p>\n<p>Possiamo ora verificare che la firma apposta ai sorgenti sia buona e lo faremo utilizzando la chiave fornita da Sander Striker tramite il key server:<\/p>\n<p><code>$ gpg httpd-2.0.54.tar.gz.asc<br \/>\ngpg: Signature made lun 11 apr 2005 23:06:14 CEST using DSA key ID DE885DD3<br \/>\ngpg: Good signature from \"Sander Striker <striker @apache.org>\"<br \/>\ngpg:                 aka \"Sander Striker <\/striker><striker @striker.nl>\"<br \/>\ngpg: ATTENZIONE: questa chiave non \u00e8 certificata con una firma fidata!<br \/>\ngpg:          Non ci sono indicazioni che la firma appartenga al proprietario.<br \/>\nImpronta digitale della chiave primaria: 4C1E ADAD B4EF 5007 579C  919C 6635 B6C0 DE88 5DD3<\/striker><\/code><\/p>\n<p>Attenzione.  Abbiamo una buona e una cattiva notizia:<\/p>\n<ul>\n<li>La buona notizia consiste nel fatto che la firma sui sorgenti \u00e8 buona;<\/li>\n<li>La cattiva \u00e8 che la chiave con cui abbiamo gestito la verifica non \u00e8 affidabile.<\/li>\n<\/ul>\n<p>Chiunque potrebbe creare un chiave pubblica corrispondente a una firma falsa sui sorgenti scaricati e indurci a credere che sia tutto a posto. Dobbiamo fare un passo ulteriore: siamo costretti a verificare che la chiave connotata dall&#8217;identificativo <code>DE885DD3<\/code> sia stata creata davvero da Sander Striker, ovvero dobbiamo validarla:<\/p>\n<p><code>$ gpg --fingerprint DE885DD3<br \/>\npub   1024D\/DE885DD3 2002-04-10<br \/>\n      Key fingerprint = 4C1E ADAD B4EF 5007 579C  919C 6635 B6C0 DE88 5DD3<br \/>\nuid                  Sander Striker <striker @apache.org><br \/>\nuid                  Sander Striker <\/striker><striker @striker.nl><br \/>\nsub   2048g\/532D14CA 2002-04-10<\/striker><\/code><\/p>\n<p>In questo caso abbiamo verificato l&#8217;impronta della chiave che abbiamo scaricato, ma nemmeno questo \u00e8 sufficiente. Ci\u00f2 che ci potrebbe aiutare \u00e8 entrare in un <em>web of trust<\/em>, ovvero costruire una rete di referenti affidabili, da cui abbiamo ricevuto direttamente l&#8217;impronta delle loro chiavi e quindi siamo sicuri della loro identit\u00e0. Se una delle maglie di questa rete ci porta a qualcuno che ha firmato la chiave di Sander Striker, potremo considerare affidabile la chiave di quest&#8217;ultimo e tutte le chiavi da lui firmate. Il metodo pi\u00f9 affidabile per verificare la chiave di qualcuno \u00e8 scambiare l&#8217;impronta \u201cde visu\u201d, in modo da essere sicuri di chi ci sta fornendo l&#8217;informazione, ma questo \u00e8 possibile solo per i nostri referenti diretti. Per poter ovviare al problema di incontrare faccia a faccia Sander Striker, operazione difficile e scomoda, possiamo scaricare dal sito del progetto Apache il file<\/p>\n<p><code>http:\/\/www.apache.org\/dist\/httpd\/KEYS<\/code><\/p>\n<p>contenente le chiavi pubbliche degli sviluppatori di Apache. Dato che gli sviluppatori hanno firmato reciprocamente le loro chiavi, considerando valide le chiavi pubbliche di uno, verranno considerate valide tutte:<\/p>\n<p><code>$ gpg --edit-key DE885DD3<br \/>\ngpg (GnuPG) 1.4.1; Copyright (C) 2005 Free Software Foundation, Inc.<br \/>\nThis program comes with ABSOLUTELY NO WARRANTY.<br \/>\nThis is free software, and you are welcome to redistribute it<br \/>\nunder certain conditions. See the file COPYING for details.<\/p>\n<p>gpg: controllo il trustdb<br \/>\ngpg: non \u00e8 stata trovata alcuna chiave definitivamente affidabile<br \/>\npub  1024D\/DE885DD3  created: 2002-04-10  expires: mai         usage: CSA<br \/>\n                     trust: undefined     validity: sconosciuto<br \/>\nsub  2048g\/532D14CA  created: 2002-04-10  expires: mai         usage: E<br \/>\n[ unknown] (1). Sander Striker <striker @apache.org><br \/>\n[ unknown] (2)  Sander Striker <\/striker><striker @striker.nl><\/p>\n<p>Comando> trust<br \/>\npub  1024D\/DE885DD3  created: 2002-04-10  expires: mai         usage: CSA<br \/>\n                     trust: undefined     validity: sconosciuto<br \/>\nsub  2048g\/532D14CA  created: 2002-04-10  expires: mai         usage: E<br \/>\n[ unknown] (1). Sander Striker <\/striker><striker @apache.org><br \/>\n[ unknown] (2)  Sander Striker <\/striker><striker @striker.nl><\/p>\n<p>Please decide how far you trust this user to correctly verify other users' keys<br \/>\n(by looking at passports, checking fingerprints from different sources, etc.)<\/p>\n<p>  1 = I don't know or won't say<br \/>\n  2 = I do NOT trust<br \/>\n  3 = I trust marginally<br \/>\n  4 = I trust fully<br \/>\n  5 = I trust ultimately<br \/>\n  m = back to the main menu<\/p>\n<p>Cosa hai deciso? 5<br \/>\nDo you really want to set this key to ultimate trust? (y\/N) y<\/p>\n<p>pub  1024D\/DE885DD3  created: 2002-04-10  expires: mai         usage: CSA<br \/>\n                     trust: ultimate      validity: sconosciuto<br \/>\nsub  2048g\/532D14CA  created: 2002-04-10  expires: mai         usage: E<br \/>\n[ unknown] (1). Sander Striker <\/striker><striker @apache.org><br \/>\n[ unknown] (2)  Sander Striker <\/striker><striker @striker.nl><br \/>\nNota che la validit\u00e0 della chiave indicata non sar\u00e0 necessariamente corretta<br \/>\nfinch\u00e8 non eseguirai di nuovo il programma.<br \/>\nComando> quit<\/striker><\/code><\/p>\n<p>A questo punto, la chiave di Sander Strike \u00e8 considerata valida a tutti gli effetti. Proviamo ora a verificare i sorgenti:<\/p>\n<p><code>$ gpg --verify httpd-2.0.54.tar.gz.asc<br \/>\ngpg: Signature made lun 11 apr 2005 23:06:14 CEST using DSA key ID DE885DD3<br \/>\ngpg: controllo il trustdb<br \/>\ngpg: 3 marginal(s) needed, 1 complete(s) needed, classic trust model<br \/>\ngpg: depth: 0  valid:   1  signed:   3  trust: 0-, 0q, 0n, 0m, 0f, 1u<br \/>\ngpg: depth: 1  valid:   3  signed:   9  trust: 3-, 0q, 0n, 0m, 0f, 0u<br \/>\ngpg: Good signature from \"Sander Striker <striker @apache.org>\"<br \/>\ngpg:                 aka \"Sander Striker <\/striker><striker @striker.nl><\/striker><\/code><\/p>\n<p>La firma \u00e8 considerata valida ed \u00e8 stata utilizzata una chiave valida. Ovviamente, se riuscite a farvi dare l&#8217;impronta della chiave di prima mano, anche tramite un vostro buon web of trust, l&#8217;operazione \u00e8 da considerarsi ancora pi\u00f9 sicura.<\/p>\n<p>Un secondo metodo per controllare l&#8217;integrit\u00e0 dell&#8217;archivio contenente i file sorgente \u00e8 costituito nella verifica della sua firma MD5. Senza addentrarci troppo nei dettagli tecnici, possiamo definire la firma MD5 come una stringa a 128 bit (hash) generato  in base a una stringa di partenza variabile. Data la stessa stringa di partenza, si otterr\u00e0 sempre la stessa stringa di arrivo, ma non \u00e8 vero il contrario: dal codice ottenuto non si pu\u00f2 risalire alla stringa di partenza. Quindi, siamo di fronte a un algoritmo definito <code>one way<\/code>, che non consente praticamente a un malintenzionato di alterare i dati di partenza senza che questi si riflettano nel codice di controllo. E nemmeno \u00e8 praticamente fattibile creare due stringhe di partenza che diano lo stesso hash finale. Insomma, data l&#8217;alta improbabilit\u00e0 di poter alterare la stringa di partenza senza che ci\u00f2 alteri anche il codice di controllo, \u00e8 possibile usare la l&#8217;algoritmo MD5, dandogli come input l&#8217;archivio contenente i file sorgente di Apache, per poi controllarne la stringa di hash con quella generata fornita tramite il sito del progetto: se i due hash corrispondono vi \u00e8 una probabilit\u00e0 molto alta, talmente alta da dare una certezza pratica, che il file in nostro possesso non sia stato alterato. Controlliamo quindi la firma del nostro file, generandola tramite l&#8217;utility <code>md5sum<\/code>, contenuta nel pacchetto <code>textutils<\/code>, riversandola in un file temporaneo che confronteremo tramite <code>diff<\/code> con il file scaricato dal sito di Apache:<\/p>\n<p><code>$ cat httpd-2.0.54.tar.gz.md5<br \/>\n772503748ffb85301385d47fb2b96eca  httpd-2.0.54.tar.gz<br \/>\n$ md5sum httpd-2.0.54.tar.gz > verifica<br \/>\n$ diff verifica httpd-2.0.54.tar.gz.md5<br \/>\n$<\/code><\/p>\n<p>L&#8217;output generato da <code>diff<\/code> \u00e8 nullo, quindi i due file sono identici e ci\u00f2 significa che la firma generata dal file in nostro possesso \u00e8 identica alla firma generata con la copia ufficiale di Apache, quindi vi \u00e8 un&#8217;alta probabilit\u00e0 che anche i due file di partenza siano identici.<\/p>\n<h3>Patchwork<\/h3>\n<p>Una volta ottenuti dei sorgenti affidabili, \u00e8 necessario assicurarsi che questi siano privi di bachi sensibili.<br \/>\nIl primo accorgimento per evitare problemi nascosti nei sorgenti, consiste puntare all&#8217;URL <code>http:\/\/archive.apache.org\/dist\/httpd\/patches\/<\/code> o a un mirror affidabile e aggiornato e controllare se per la versione in proprio possesso esiste una patch critica, che va quindi scaricata nella directory dei sorgenti e applicata utilizzando il comando:<\/p>\n<p><code>patch -s < nome_patch.patch<\/code><\/p>\n<p>Questo primo passo \u00e8 necessario ma non sufficiente a garantire che i sorgenti siano privi di bachi importanti, dato che questi spesso vengono rilevati a distanza dal loro rilascio, evidenziati durante l'utilizzo su numerose installazioni. Per evitare di rimanere con un server afflitto da bachi \u00e8 necessario rimanere sempre aggiornati sullo sviluppo dei sorgenti, iscrivendosi alla mailing list <\/code><code>announce@httpd.apache.org<\/code><\/p>\n<p>(che \u00e8 pi\u00f9 bollettino che mailing list vera e propria, dato che vi circolano solo gli annunci di nuove versioni o di patch, inviati dalla Fondazione). Se vi saranno aggiornamenti critici, una volta iscritti questi arriveranno comodamente nella vostra casella postale, mettendovi al riparo da future, sgradite sorprese.<\/p>\n<h3>Mistificazioni<\/h3>\n<p>Resistere all&#8217;attacco di un malintenzionato in gamba \u00e8 decisamente difficile, ma togliersi di torno l&#8217;improvvisato di turno non \u00e8 un&#8217;operazione che richieda grandi sforzi. Un semplice trucco per confondere le acque a chi stia cercando di collezionare pi\u00f9 informazioni possibile sul nostro server, come per esempio la versione utilizzata (utile per cercare bachi non patchati), quale PHP o libreria SSL vengano implementate, \u00e8 abbastanza semplice e richiede la modifica di un solo file header nei sorgenti.<\/p>\n<p><b>Apache 1.x<\/b><\/p>\n<p>Nella configurazione standard, Apache \u00e8 decisamente \u201cchiacchierone\u201d e rivela fin troppo facilmente la propria versione e i vari moduli compilati, consentendo a chiunque, semplicemente richiamando una pagina esistente, di sapere se sono installati i moduli PHP e SSL e le relative versioni, per esempio. Troppo semplice e troppo invitante soprattutto per uno \u201cscript kiddie\u201d, uno smanettone senza troppe competenze ma fornito all&#8217;inverosimile di script e programmi in grado di condurre autonomamente una vasta serie di attacchi.<br \/>\nIl nostro scopo, ora, consiste non solo e non tanto nell&#8217;ammutolire Apache, ma nel renderlo menzognero, facendogli dire qualche piacevole fandonia. Per raggiungere questo risultato, con i sorgenti della versione 1.x, baster\u00e0 modificare il file<\/p>\n<p><code>httpd.h<\/code><\/p>\n<p>Nel nostro esempio, utilizzeremo i sorgenti contenuti nell&#8217;archivio<\/p>\n<p><code>apache_1.3.33.tar.gz<\/code><\/p>\n<p>Una volta decompresso, entriamo nella directory<\/p>\n<p><code>apache_1.3.33\/src\/include<\/code><\/p>\n<p>e apriamo in file <code>httpd.h<\/code>, nel quale troveremo alcune righe interessanti:<\/p>\n<p><code>#define SERVER_BASEVENDOR   \"Apache Group\"<br \/>\n#define SERVER_BASEPRODUCT  \"Apache\"<br \/>\n#define SERVER_BASEREVISION \"1.3.33\"<\/p>\n<p>#define APACHE_RELEASE 10333100<br \/>\n#define SERVER_SUPPORT \"http:\/\/www.apache.org\/\"<\/code><\/p>\n<p>Sono le informazioni contenute in queste direttive a essere utilizzate per generare i messaggi \u201cdi sistema\u201d mostrati ai navigatori. Modifichiamoli leggermente:<\/p>\n<p><code>#define SERVER_BASEVENDOR   \"Suppa Lovva Group\"<br \/>\n#define SERVER_BASEPRODUCT  \"Lovva Server\"<br \/>\n#define SERVER_BASEREVISION \"1.2.3.4.x.x.x\"<\/p>\n<p>#define APACHE_RELEASE 99887766554433221100<br \/>\n#define SERVER_SUPPORT \"http:\/\/www.suppalovva.net\"<\/code><\/p>\n<p>Ora baster\u00e0 lanciare un semplice<\/p>\n<p><code>.\/configure<br \/>\nmake<br \/>\nmake install<\/code><\/p>\n<p>dalla directory radice dei sorgenti, avviare il server, richiamare una pagina inesistente e il risultato sar\u00e0 quello visibile nella figura sottostante.<\/p>\n<p><img decoding=\"async\" id=\"image151\" src=\"https:\/\/www.zarrelli.org\/blog\/wp-content\/uploads\/2006\/02\/lovva.jpg\" width=\"100%\" alt=\"Lovva Server\" \/><br \/>\n<b>Il nostro server appare decisamente strano. Suppa Lovva?<\/b><\/p>\n<p><b>Apache 2.x<\/b><\/p>\n<p>In Apache 2.x si pu\u00f2 ottenere lo stesso risultato modificando un differente file. Nel nostro esempio, abbiamo decompresso l&#8217;archivio <code>httpd-2.0.54.tar.gz<\/code>, editando il file<\/p>\n<p><code>httpd-2.0.54\/include\/ap_release.h<\/code><\/p>\n<p>Al suo interno, ritroviamo delle stringhe decisamente familiari:<\/p>\n<p><code>#define AP_SERVER_BASEVENDOR \"Apache Software Foundation\"<br \/>\n#define AP_SERVER_BASEPRODUCT \"Apache\"<br \/>\n#define AP_SERVER_MAJORVERSION \"2\"<br \/>\n#define AP_SERVER_MINORVERSION \"0\"<br \/>\n#define AP_SERVER_PATCHLEVEL \"54\"<\/code><\/p>\n<p>Modifichiamole a piacere:<\/p>\n<p><code>#define AP_SERVER_BASEVENDOR \"Free Love Foundation\"<br \/>\n#define AP_SERVER_BASEPRODUCT \"StupidCupid\"<br \/>\n#define AP_SERVER_MAJORVERSION \"99\"<br \/>\n#define AP_SERVER_MINORVERSION \"00\"<br \/>\n#define AP_SERVER_PATCHLEVEL \"11\"<\/code><\/p>\n<p>Compiliamo i sorgenti, installiamoli, lanciamo Apache e richiamiamo una pagina inesistente. Il risultato sar\u00e0 quello mostrato nella figura sottostante.<\/p>\n<p><img decoding=\"async\" id=\"image151\" src=\"https:\/\/www.zarrelli.org\/blog\/wp-content\/uploads\/2006\/02\/stupidcupid.jpg\" width=\"100%\" alt=\"Stupid Cupid\" \/><br \/>\n<b>Volendo giocare con gli header si possono apportare parecchie modifiche<\/b><\/p>\n<p>Gli amministratori con uno spiccato senso dello humor potrebbero avere gi\u00e0 inteso cosa si pu\u00f2 fare giocando con gli header: basta modificare poche righe per simulare le risposte di IIS o di qualche altro server web a piacere.<\/p>\n<h3>La direttiva ServerTokens<\/h3>\n<p>Se vogliamo rendere la vita ancora pi\u00f9 difficile al malintenzionato di turno, possiamo giocare un po&#8217; con la configurazione del file <code>httpd.conf<\/code>, abilitando la direttiva <code>ServerTokens<\/code>, che gestisce la quantit\u00e0 di informazioni sul server restituite dagli header inviati da Apache ai client. Questa direttiva, per\u00f2, \u00e8 disponibile solo dalla versione 1.3 del server &#8211; ovviamente esiste anche nella 2.x, e accetta una serie di modificatori:<\/p>\n<ul>\n<li><code>ServerTokens Prod(uctOnly)<\/code><br \/>\nViene inviato solo il nome del web server, per es: Server: Apache Server;<\/li>\n<p><\/p>\n<li><code>ServerTokens Min(imal)<\/code><br \/>\nViene inviata anche la versione, per es.: Apache\/1.3.33 Server;<\/li>\n<p><\/p>\n<li><code>ServerTokens OS<\/code><br \/>\nViene inviato anche il tipo di sistema operativo: per es. : Apache\/1.3.33 (Unix);<\/li>\n<p><\/p>\n<li><code>ServerTokens Full (o senza argomento)<\/code><br \/>\nVengono inviati tutti i dati possibili, compresi quelli relativi ai moduli compilatiServer sends (e.g.): Server: Apache\/1.3.33 (Unix) PHP\/5.0.5<\/li>\n<\/ul>\n<p>Attenzione per\u00f2: questa direttiva pu\u00f2 essere abilitata solo a livello di server e non pu\u00f2 essere modificata nei singoli host virtuali eventualmente configurati.<\/p>\n<h3>Prima di compilare<\/h3>\n<p>Questo primo articolo sulla sicurezza in Apache si chiude con un consiglio di buona condotta al momento di configurare i sorgenti per la compilazione del server. Seguendo il sempre valido motto <b>KISS<\/b>, <em>Keep It Simple Stupid<\/em>, cerchiamo di mantenere il pi\u00f9 semplice possibile i binari installati sul nostro sistema. Certo, compilare monoliticamente o a moduli dinamici tutte le funzioni aggiuntive di Apache pu\u00f2 risultare comodo: prima o poi potrebbero servire e non bisogna nemmeno ricompilare. Per una maggiore sicurezza, per\u00f2, \u00e8 meglio non avere in giro funzionalit\u00e0 che non vengono utilizzate, magari lasciate attivate per una dimenticanza: meglio non compilare nemmeno ci\u00f2 che non serve. Gi\u00e0, ma cosa serve? Quali sono i moduli di base, il minimo indispensabile per avere un server web funzionale? Ecco quale \u00e8 l&#8217;insieme minimo di moduli da installare per poter servire pagine senza troppi fronzoli:<\/p>\n<ul>\n<li><code>httpd_core<\/code><br \/>\nModulo con le funzionalit\u00e0 di base, necessarie all&#8217;avvio di Apache; <\/li>\n<p><\/p>\n<li><code>mod_access<\/code><br \/>\nModulo che presiede alle direttive Allow, Deny e Order per l&#8217;accesso condizionato ai namespace;<\/li>\n<p><\/p>\n<li><code>mod_auth<\/code><br \/>\nModulo che offre l&#8217;autenticazione HTTP di base;<\/li>\n<p><\/p>\n<li><code>mod_dir<\/code><br \/>\nModulo che consente di implementare la direttiva DirectoryIndex, per indicare il file index di una directory;<\/li>\n<p><\/p>\n<li><code>mod_log_config<\/code><br \/>\nModulo per l&#8217;mplementazione delle funzioni di logging;<\/li>\n<p><\/p>\n<li><code>mod_mime<\/code><br \/>\nGestisce i set di caratteri l&#8217;encoding dei contenuti, il linguaggio predefinito delle pagine da servire e i tipi MIME dei documenti e altro ancora. Insomma, gestisce tutte le meta informazioni riguardanti le pagine servite.<\/li>\n<\/ul>\n<p>Da disabilitare assolutamente, se non utilizzati:<\/p>\n<ul>\n<li><code>mod_auto_index<\/code><br \/>\nConsente di visualizzare il contenuto di una directory priva di file di indice;<\/li>\n<li><code>mod_info<\/code><br \/>\nFornisce una lista di informazioni sul server, sui moduli compilati e sulle direttive di configurazione.<\/li>\n<\/ul>\n<h3>Conclusioni<\/h3>\n<p>Per ora abbiamo finito. Siamo arrivati fino alla configurazione dei sorgenti e compilazione del server. Nel prossimo articolo, approfondiremo quelle direttive di configurazione di Apache, che ci consentiranno di applicare delle direttive sufficientemente restrittive per limitare ragionevolmente la maggior parte degli attacchi pi\u00f9 triviali.<br \/>\nUna volta configurato in maniera sicura il nostro server, lo sbatteremo in cella, in una chroot jail, dal quale un eventuale aggressore non uscir\u00e0 molto facilmente.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aprire una porta su internet, lasciare che ignoti visitatori entrino e diano uno sguardo nell\u2019anticamera del vostro server \u00e8 sicuramente un\u2019operazione affascinante e, spesso, utile. Un server web dovrebbe proprio servire a questo, a creare uno spazio destinato ad accogliere le richieste pi\u00f9 diverse, a mostrare le informazioni che si vogliono condividere. Con il tempo, &hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,62],"tags":[106,129,472,140,479,139,104,126,484,130,151],"class_list":{"0":"post-145","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"hentry","6":"category-computer","7":"category-sysadmin","8":"tag-acer","9":"tag-applicazioni","10":"tag-fon","11":"tag-free-software","12":"tag-internet","13":"tag-linux","14":"tag-mac","15":"tag-security","16":"tag-sicurezza","17":"tag-software","18":"tag-web","20":"without-featured-image"},"_links":{"self":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/posts\/145","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/comments?post=145"}],"version-history":[{"count":0,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/posts\/145\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/media?parent=145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/categories?post=145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/tags?post=145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}