Nel capitolo relativo ad Apache abbiamo accennato ad alcuni moduli per la sicurezza che adesso analizzeremo più nel dettaglio: si tratta di mod_security e mod_SSL, che offrono la possibilità di rendere ancora più sicuro il proprio web server.
Mod_security
In particolare, mod_security è una sorta di firewall aggiuntivo che può essere integrato all'interno di Apache, che attraverso una serie di regole preimpostate o configurate manualmente previene attacchi dall'esterno, quali, ad esempio, SQL Injection e simili. La sua installazione è molto semplice: è sufficiente infatti lanciare il seguente comando
$ sudo apt-get install libapache-mod-security
Per caricare il modulo in Apache, lanciamo
$ sudo a2enmod mod-security
e riavviamo il web server con
$ sudo /etc/init.d/apache2 restart
Adesso, apriamo il file di configurazione globale di Apache:
$ sudo nano /etc/apache2/apache2.conf
e aggiungiamo le seguenti righe
<IfModule mod_security.c>
SecFilterEngine On
SecFilterCheckURLEncoding On
SecFilterCheckUnicodeEncoding Off
SecFilterForceByteRange 0 255
SecAuditEngine RelevantOnly
SecAuditLog /var/log/apache2/audit_log
SecFilterDebugLog /var/log/apache2/modsec_debug_log
SecFilterDebugLevel 0
SecFilterScanPOST On
SecFilterDefaultAction "deny,log,status:500"
</IfModule>
Come già visto in precedenza, ogni riga contiene una direttiva, e nel dettaglio:
- SecFilterEngine: attiva o disattiva il filtro di mod-security;
- SecFilterCheckURLEncoding: codifica i caratteri speciali prima del loro passaggio all'URL;
- SecFilterCheckUnicodeEncoding: abilita o disabilita la validazione della codifica Unicode;
- SecFilterForceByteRange: permette il passaggio di richieste la cui dimensione in Byte è contenuta in un certo intervallo;
- SecAuditEngine: abilita il logging, con il valore RelevantOnly logga solo gli avvenimenti più importanti;
- SecAuditLog: specifica il file di log;
- SecFilterDebugLog: specifica il file di debug;
- SecFilterDebugLevel: specifica il livello di accuratezza del file di debug;
- SecFilterScanPOST: abilita la scansione delle variabili passate tramite il metodo POST;
- SecFilterDefaultAction: specifica il comportamento da tenere nel caso in cui una richiesta venga filtrata; in questo caso, blocca la richiesta, la inserisce nel file di log, e restituisce all'utente un errore 500.
Maggiori dettagli sull'utilizzo di mod_security sono disponibili all'interno della documentazione ufficiale del progetto.
Mod_ssl
Passiamo adesso a mod_ssl: si tratta di un modulo che permette di abilitare le connessioni cifrate tramite il protocollo https, così da garantire lo scambio di informazioni tra client e server in maniera sicura. Tale modulo è incluso nel pacchetto apache2.2-common, che molto probabilmente è stato installato insieme al web server. In ogni caso, per essere sicuri, lanciamo il comando
$ sudo apt-get install libapache-mod-ssl openssl
che installerà anche le librerie relative a OpenSSL. Attiviamo il modulo tramite
$ sudo a2enmod ssl
e riavviamo Apache per rendere effettivi i cambiamenti
$ sudo /etc/init.d/apache2 restart
Adesso è necessario generare il certificato e la relativa chiave: con la seguente sequenza, creeremo una directory apposita per contenere tali file e li creeremo tramite OpenSSL
$ sudo mkdir /etc/apache2/ssl $ cd /etc/apache2/ssl $ sudo openssl req -new -newkey rsa:2048 -keyout apachessl.pem -x509 -set_serial 1000 -days 365 -out apachessl.crt
Creiamo un file di configurazione per il sito con cui utilizzare SSL, in questo modo
$ sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/ssl
apriamo tale file
$ sudo nano /etc/apache2/sites-available/ssl
ed aggiungiamo le seguenti righe
NameVirtualHost *:443
<virtualhost *:443>
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apachessl.crt
SSLCertificateKeyFile /etc/apache2/ssl/apachessl.pem
</virtualhost>
Infine, apriamo il file /etc/apache2/ports.conf e, nel caso in cui non sia già presente, aggiungiamo la riga
Listen 443