Modsecurity(TM) è un IDS (intrusion detection system) per le applicazioni web.
In sostanza impedisce che un utente malintenzionato possa, sfruttando vulnerabilità varie (cgi/php) compromettere la sicurezza di un sistema.
Il suo funzionamento è alquanto semplice: essendo un mod per apache si integra perfettamente (ed esclusivamente) con lo stesso e permette di controllare tutte le richieste web in ingresso ed in uscita, graficamente l'impostazione è questa:
caso A) http get ---> [mod security] ---> [apache web server] ---> reply
caso B) vuln.cgi&file=|uname| ---> [mod security] ---> { LOG-IP/BLOCK/FORWARD }
Il sito ufficiale del progetto è http://www.modsecurity.org.
Installazione:
-- da sorgenti
Attraverso DSO l'installazione è molto semplice.
Decomprimiamo il tarball da qualche parte ed installiamolo comodamente con attraverso il comando apxs:
# <apache-home>/bin/apxs -cia mod_security.c
dopodichè restariamo apache con apachectl restart
Per compilarlo staticamente con Apache 1.x portiamoci nella directory contenente i sorgenti di apache e copiamo mod_security in /src/modules/extra; fatto questo procediamo compilando:
$ cd <apache1.x-source>
$ cp <modsecurity-source>/apache1/mod_security.c ./src/modules/extra
$ ./configure \
> --activate-module=src/modules/extra/mod_security \
> -–enable-module=security
Per quanto concerne invece Apache 2, il procedimento è simile:
$ cd <apache2-source>
$ cp <modsecurity-source>/apache2/mod_security.c ./modules/proxy
$ ./configure \
> -enable-security \
> --with-module=proxy:mod_security.c
-- da binari
Per Apache 1.x bisogna copiare il modulo mod_security.so in libexec/ e, dopo aver fatto questo, modificare il file httpd.conf aggiungendo la seguente riga:
LoadModule security_module libexec/mod_security.so
Per Apache 2.x il discorso è pressochè identico con l'unica eccezione dovuta al fatto che al posto di copiare il modulo in libexec/ lo copieremo in modules/ e quindi al file httpd.conf aggiungeremo:
LoadModule security_module modules/mod_security.so
Configurazione:
Editiamo il file di configurazione del nostro web server aggiungendoci una direttiva al file che fungerà da configurazione di modsecurity:
# echo "#include /path_a_piacere/modsec.conf" >> /var/www/conf/httpd.conf (la path dell'httpd.conf varia, questa è quella che uso io su OpenBSD).
A questo punto scriviamo il file /path_a_piacere/modsec.conf:
# Abilitiamo ModSecurity
SecFilterEngine On
# Impostiamo il comportamento di default da assumere in caso di infrazione
# di una regola ove questo comportamento
# non è impostato direttamente dalla direttiva della regola stessa.
#
SecFilterDefaultAction "deny,log,status:403"
# Abilitiamo lo scan del POST, dell'encoding dell'URL e parsiamo l'unicode
SecFilterScanPOST On
SecFilterCheckURLEncoding On
SecFilterCheckUnicodeEncoding Off
# Usiamo un server-banner a piacere
# SecServerSignature "Micro$oft-IIS/9.0"
# Definiamo il margine d'importanza affinchè un evento venga loggato ed impostiamo la cartella dei logs.
SecAuditEngine RelevantOnly
SecAuditLog /path_a_piacere/logs.modsecurity
# Parametri opzionali:
SecFilterSelective REQUEST_METHOD "!^(GET|HEAD)$" chain
SecFilterSelective HTTP_Content-Type \
"!(^application/x-www-form-urlencoded$|^multipart/form-data;)"
SecFilterSelective REQUEST_METHOD "^(GET|HEAD)$" chain
SecFilterSelective HTTP_Content-Length "!^$"
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"
# Definiamo gli attacchi che vanno per la maggiore tra le comunità di lamers ed impostiamo il logging ed, ovviamente il bloccaggio:
# CSS
SecFilter "../../../" "deny,log"
# Remote exec.
SecFilter "uname" "deny,log"
SecFilter "/etc/passwd" "deny,log"
SecFilter "echo" "deny,log"
Buon divertimento!
Breve rassegna della security history, problematiche attuali. Security e siti dinamici.