Apache bloccare bot e user agent con mod_rewrite

Come bloccare i bot su Apache, sopratutto se cattivi? In uno degli ultimi articoli abbiamo parlato del mod_evasive per bloccare gli attacchi di tipo Dos e DDoS. Continuiamo ad affrontare il tema Apache e della websecurity e andremo a vedere come bloccare su Apache i bots e gli spider malevoli.

Oltre ai bot indesiderati, in questo articolo affronteremo anche il tema degli web spiders indesiderati, ovvero quelli che non rispettano le regole impostate nel file robot.txt. Il compito del file robots.txt è principalmente, ricordiamolo, quello di evitare di sovraccaricare il tuo sito di richieste. Molti bot, spider e crawler però non lo prendono in considerazione ed ecco che ci viene in aiuto questa guida. Vediamo quindi come bloccarli.

Let’s go!

Indice dei contenuti

Controllare se ci sono bot che visitano il nostro sito

Prima di addentrarci nel processo di blocco dei bot su Apache, è importante verificare qual’è la nostra situazione. Ci sono dei bot che ci visitano? Quali sono? Come verificare se ci sono bot che ci attaccano?

Vediamo quindi come possiamo individuare bot e spider che stanno visitando il nostro sito web. Per farlo è necessario avere accesso, in SSH, al server, che ovviamente deve essere un Apache httpd Server, visto che di questo stiamo parlando :).

Prima di tutto individuiamo il path in cui vengono scritti i logs del nostro webserver. Di solito, a meno che non abbiate installato Apache tramite compilazione, sia su Debian che su Ubuntu (ne abbiamo parlato anche nel nostro articolo in cui abbiamo spiegato come configurare Apache su Docker Compose ) i file di log vengono scritti in /var/log/apache2/. Nello specifico, il file di cui abbiamo bisogno e che dovremo analizzare è /var/log/apache2/access.log.

Il comando da lanciare è il seguente: (*)

cat /var/log/apache2/access.log |  cut -d'"' -f6 | grep -E -v -i "chrome|mozilla|safari|opera" | sort | uniq -c | sort
ShellScript

* Il comando appena elencato funziona soltanto se non avete apportato modifiche al formato standard dei logs di Apache.

Un consiglio: il comando può essere adeguato per poter eseguire la ricerca all’interno di un file compresso, senza bisogno di scompattarlo:

zcat /var/log/apache2/access.log.2.gz  |  cut -d'"' -f6 | grep -E -v -i "chrome|mozilla|safari|opera" | sort | uniq -c | sort
ShellScript

Pertanto, cosa dovremmo aspettarci dall’output di questo comando? L’output altro non è che la lista degli User Agent univoci che stanno visitando il nostro sito, ordinati per numero di visite, ad esclusione degli User Agent utilizzati da browser più comuni (Chrome, Mozilla, Safari e Opera). Ecco l’output del comando, lanciato su un sito di esempio:

    103 Apache/2.4.54 (Debian) OpenSSL/1.1.1n (internal dummy connection)
    108 FeedFetcher-Google; (+http://www.google.com/feedfetcher.html)
     10 python-requests/2.26.0
      1 Hello, World
      1 masscan/1.3 (https://github.com/robertdavidgraham/masscan)
      1 webprosbot/2.0 (+mailto:[email protected])
      2 Hello World
      2 Nokia7250/1.0 (3.14) Profile/MIDP-1.0 Configuration/CLDC-1.0
      2 python-requests/2.28.2 3 SerendeputyBot/0.8.6 (http://serendeputy.com/about/serendeputy-bot) 
      4 Twitterbot/1.0
      5 ALittle Client
     65 -
    674 python-requests/2.6.0 CPython/2.7.5 Linux/3.10.0-1160.11.1.el7.x86_64
      7 python-requests/2.27.1
      7 Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)
      9 Googlebot-Image/1.0
ShellScript

La lista riporta nella prima colonna il numero di occorrenze per bot, nella seconda colonna il nome del bot / User Agent / Spider.

Apache bloccare bot e User Agents manualmente tramite mod_rewrite

Ora che abbiamo la lista dei nostri bot e User Agent cattivi possiamo effettuare un primo blocco. Il primo blocco di cui parleremo è un blocco manuale. Questo sta a significare che eseguiremo il blocco di una lista di bot o User Agent a noi noti, e lo faremo tramite una rewrite rule.

Affinché si possa eseguire questa strada è importante che il modulo mod_rewrite sia attivo sul vostro Apache httpd server. Nel caso in cui non sappiate come attivarlo, vi invito a leggere il nostro articolo dedicato al mod_rewrite.

Quali sono i limiti di un blocco manuale? Ogni giorno escono nuovi bot, crawler e spider, pertanto saremo costretti a verificare e aggiornare la nostra lista manualmente e con una certa frequenza.

Scegliamo la lista di bots, spider/crawler da bloccare. Prendiamo un paio dalla lista precedente. Per esempio prendiamo: “Hello World” e “ALittle Client” e aggiungiamoci anche un bot di fantasia chiamato “iegribot”.

Configurazione mod_rewrite per bloccare bot e User Agent

Vediamo come bloccarle i bot su Apache con mod_rewrite:

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (HelloWorld|iegribot|ALittleClient) [NC]
RewriteRule . - [F,L]
HTTP

Qualora abbiate il dubbio, questa direttiva di mod_rewrite può essere inserita all’interno del file di configurazione di Apache, oppure direttamente nel file .htaccess. La riga 1 dell’esempio può essere non considerata nel caso in cui sia già presente nella vostra configurazione di Apache.

Quindi, cosa dobbiamo aspettarci come risposta dopo questa configurazione? Ebbene, la risposta attesa è HTTP 403 (HTTP/1.1 403 oppure HTTP/2 403).

Ora che abbiamo apportato la modifica, riavviamo il nostro Apache ed eseguiamo un test per verificarne il risultato:

curl -I -A "iegribot" https://iegri.com
ShellScript

Come potete notare, sto utilizzando il comando curl e simulo uno User Agent chiamato “iegribot”. Andiamo a vedere quale sarà il risultato:

Apache bloccare User Agent
Apache bloccare bot e User Agent con mod_rewrite

Come potete dall’immagine precedente, il risultato ottenuto è esattamente quello atteso, ovvero un HTTP 403 che equivale a un “Permission Denied“.

Come abbiamo notato, per eseguire i test per verificare che le risposte ricevute fossero quelle attese, e che quindi la nostra configurazione abbia avuto effetto, abbiamo utilizzato il comando curl. E se volessimo bloccare curl? E se bloccassimo anche wget che più o meno fa la stessa cosa ?!?! . Beh, sarà sufficiente modificare la precedente configurazione nel modo seguente:

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (curl|wget|HelloWorld|iegribot|ALittleClient) [NC]
RewriteRule . - [F,L]
ShellScript

Ora che la configurazione è stata modificata, andiamo a vedere cosa succede provando a utilizzare wget o curl per richiamare il nostro sito:

fabioiegri@Mac htdocs % curl -I  https://iegri.com
HTTP/2 403 
ShellScript

Direi che l’esperimento ha dato i suoi frutti.

Conclusioni … e spoiler

In questo articolo vi ho mostrato come utilizzare il mod_rewrite di Apache per bloccare bot e user agent cattivi (oltre che spider e crawler). Come detto in precedenza, il limite di questa configurazione è che bisogna costantemente aggiornarla, rischiando di rimanere indietro e di lasciare spazi aperti a possibili attaccanti.

Chiaramente esiste una soluzione alternativa e più vantaggiosa rispetto a quella appena elencata, che è, come diciamo spesso quando si parta si #webperformance e di #websecurity, l’utilizzo di una CDN o di un WAF.

E se non potessi permettermi una CDN? In tal caso esiste un’alternativa a quanto appena elencato, ovvero la possibilità di bloccare User Agent e Bot con Apache, in modo completamente automatico attraverso il download di una lista sempre aggiornata.

E … SPOILER, questo sarà l’argomento del prossimo articolo.

A questo punto, spero che l’articolo vi sia risultato utile, in tal caso, potreste condividerlo 🙂 .

Se avete dei dubbi o se volete condividere il vostro punto di vista, scrivete nei commenti e cercherò di rispondere al più presto.

Se volete restare in contatto, vi lascio anche il link della mia newsletter di LinkedIn.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *