====== Apache ModSecurity 2 ======
Distribuzione di riferimento: **Debian GNU/Linux 12 Bookworm**.
* **libapache2-mod-security2** - Modulo Apache
* **modsecurity-crs** - Set di regole OWASP, pacchetto opzionale, ma raccomandato. Viene quindi installato automaticamente.
Il file di configurazione è **/etc/modsecurity/modsecurity.conf**, come è indicato in **/etc/apache2/mods-available/security2.conf**. Nello stesso file viene incluso opzionalmente anche **/usr/share/modsecurity-crs/*.load**, quindi - se viene installato il pacchetto **modsecurity-crs** - tali regole vengono attivate automaticamente.
# -- Rule engine initialization --
SecRuleEngine DetectionOnly
#SecRuleEngine On
# -- Request body handling --
SecRequestBodyAccess On
# -- Response body handling --
SecResponseBodyAccess Off
# -- Audit log configuration --
SecAuditEngine RelevantOnly
SecAuditLog /var/log/modsec_audit.log
# Track requests to some php pages.
SecRule REQUEST_URI "@beginsWith /wp-login.php" "id:1101,phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},setvar:ip.req_counter_login=+1"
SecRule REQUEST_URI "@beginsWith /xmlrpc.php" "id:1102,phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},setvar:ip.req_counter_xmlrpc=+1"
# Threshold: one request every 3 seconds (60 req / 180 s).
SecRule IP:req_counter_login "@gt 1000" "id:1201,phase:1,log,deny,status:403,msg:'Blocking IP for hammering wp-login.php',setvar:ip.blocked=1,expirevar:ip.blocked=3600"
SecRule IP:req_counter_xmlrpc "@gt 1000" "id:1202,phase:1,log,deny,status:403,msg:'Blocking IP for hammering xmlrpc.php',setvar:ip.blocked=1,expirevar:ip.blocked=3600"
# Reset the counter using a rolling window.
SecAction "id:1301,phase:1,pass,nolog,expirevar:ip.req_counter_login=3600"
SecAction "id:1302,phase:1,pass,nolog,expirevar:ip.req_counter_xmlrpc=3600"
# Block any further requests if the IP is blocked
SecRule IP:BLOCKED "@eq 1" "id:1401,phase:1,log,deny,status:403,msg:'IP is temporarily blocked due to rate limiting'"
===== Definizione delle regole =====
La prima **SecRule** definita valuta la variabile **REQUEST_URI**, cioè valuta l'URL richiesto usando l'operatore **%%@beginsWith%%**. Se il risultato è positivo l'azione **setvar** incrementa il valore della variabile **ip.req_counter_login**, dove **ip** è una collezione di variabili che è stata inizializzata **initcol** usando il **REMOTE_ADDR** (cioè viene istanziata una collezione di variabile diversa per ogni HTTP client).
**ATTENZIONE**: I nomi delle variabili sono **case-insensitive** ed è consuetudine indicarle in minuscolo nello statement **setvar** e in maiuscolo quando sono l'argomento di **SecRule**.
Collegata alla regola precedente vi è un'altra **SecRule** che valuta la variabile **IP:req_counter_login** ...
FIXME
Quando si cambia il file di configurazione è sufficiente fare il reload di Apache:
systemctl reload apache2.service
Nella configurazione sopra viene indicato il file di log **/var/log/modsec_audit.log**, si deve provvedere una configurazione di logrotate per effettuare l'opportuna rotazione del log. Creare il file **/etc/logrotate.d/modsecurity** con qualcosa del genere:
/var/log/modsec_audit.log {
daily
missingok
rotate 365
compress
delaycompress
notifempty
create 640 root adm
}
===== Web References =====
* **[[https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-%28v2.x%29#user-content-Operators|ModSecurity Operators]]**