Proteggi il tuo sito web PHP dai bot con questo strumento open source
Il buttafuori CrowdSec è progettato per essere incluso in qualsiasi applicazione PHP per aiutare a bloccare gli aggressori.
PHP è un linguaggio di programmazione ampiamente utilizzato sul Web e si stima che venga utilizzato da quasi l'80% di tutti i siti Web. Il mio team di CrowdSec ha deciso che dovevamo fornire agli amministratori dei server un buttafuori PHP per aiutare a tenere lontani bot e malintenzionati che potrebbero tentare di interagire con i file PHP.
I buttafuori CrowdSec possono essere impostati a vari livelli di uno stack applicativo: server web, firewall, CDN e così via. Questo articolo esamina un ulteriore livello: l'impostazione della correzione direttamente a livello dell'applicazione.
La correzione direttamente nell'applicazione può essere utile per vari motivi:
- Fornisce una risposta basata sulla logica aziendale alle potenziali minacce alla sicurezza.
- Dà libertà su come rispondere ai problemi di sicurezza.
Sebbene CrowdSec pubblichi già un buttafuori WordPress, questa libreria PHP è progettata per essere inclusa in qualsiasi applicazione PHP (Drupal, ad esempio). Il buttafuori aiuta a bloccare gli aggressori, sfidandoli con CAPTCHA a far passare gli umani mentre blocca i bot.
Prerequisiti
Questo tutorial presuppone che tu stia eseguendo Drupal su un server Linux con Apache come server web.
Il primo passo è installare CrowdSec sul tuo server. Puoi farlo con uno script di installazione ufficiale. Se utilizzi Fedora, CentOS o simili, scarica la versione RPM:
$ curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.rpm.sh
Sui sistemi Debian e basati su Debian, scarica la versione DEB:
$ curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh
Questi script sono semplici, quindi leggi quello che scarichi per verificare che importi una chiave GPG e configuri un nuovo repository. Una volta che ti senti a tuo agio con ciò che fa, eseguilo e quindi installalo.
$ sudo dnf install crowdsec || sudo apt install crowdsec
CrowdSec rileva autonomamente tutti i servizi esistenti, quindi non dovrebbero essere necessarie ulteriori configurazioni per ottenere una configurazione immediatamente funzionante.
Testare la configurazione iniziale
Ora che hai installato CrowdSec, avvia uno scanner di vulnerabilità delle applicazioni web, come Nikto, e guarda come si comporta:
$ ./nikto.pl -h http://<ip_or_domain>
(Philippe Humeau, CC BY-SA 4.0)
L'indirizzo IP è stato rilevato e attiva vari scenari, l'ultimo dei quali è crowdsecurity/http-crawl-non_statics.
(Philippe Humeau, CC BY-SA 4.0)
Tuttavia, CrowdSec rileva solo i problemi ed è necessario un buttafuori per applicare la soluzione. Ecco che arriva il buttafuori PHP.
Rimediare con il buttafuori PHP
Ora che puoi rilevare comportamenti dannosi, devi bloccare l’IP a livello di sito web. Al momento non è disponibile alcun buttafuori Drupal. Tuttavia, puoi utilizzare direttamente il buttafuori PHP.
Come funziona? Il buttafuori PHP (come qualsiasi altro buttafuori) effettua una chiamata API all'API CrowdSec e controlla se deve vietare gli IP in entrata, inviare loro un CAPTCHA o consentirne il passaggio.
Il server web è Apache, quindi puoi utilizzare lo script di installazione per Apache.
$ git clone https://github.com/crowdsecurity/cs-php-bouncer.git
$ cd cs-php-bouncer/
$ ./install.sh --apache
(Philippe Humeau, CC BY-SA 4.0)
Il buttafuori è configurato per proteggere l'intero sito web. Proteggi una parte specifica del sito adattando la configurazione di Apache.
Prova ad accedere al sito web
Il buttafuori PHP è installato e configurato. Sei stato bannato a causa delle precedenti azioni di scansione delle vulnerabilità web, ma puoi provare ad accedere al sito web:
(Philippe Humeau, CC BY-SA 4.0)
Il buttafuori ha bloccato con successo il tuo traffico. Se non sei stato bannato a seguito di una precedente scansione di vulnerabilità web, potresti aggiungere una decisione manuale con:
$ cscli decisions add -i <your_ip>
Per i restanti test, rimuovere le decisioni attuali:
$ cscli decisions delete -i <your_ip>
Andare avanti
Ho bloccato l'IP cercando di interferire con il sito web PHP. È carino, ma che dire degli IP che tentano di scansionarlo, scansionarlo o eseguire attacchi DDoS? Questi tipi di rilevamenti possono portare a falsi positivi, quindi perché non restituire una sfida CAPTCHA per verificare se si tratta di un utente reale (piuttosto che di un bot) invece di bloccare l'IP?
Rileva crawler e scanner
Non mi piacciono i crawler e gli user agent dannosi e sull'Hub sono disponibili vari scenari per individuarli.
Assicurati che le raccolte base-http-scenarios
dall'hub vengano scaricate con cscli
:
$ cscli collections list | grep base-http-scenarios
crowdsecurity/base-http-scenarios ✔️ enabled /etc/crowdsec/collections/base-http-scenarios.yaml
In caso contrario, installalo e ricarica CrowdSec:
$ sudo cscli collections install crowdsecurity/base-http-scenarios
$ sudo systemctl reload crowdsec
Rimedio con un CAPTCHA
Poiché il rilevamento di DDoS, crawler o user agent malevoli può portare a falsi positivi, preferisco restituire un CAPTCHA per qualsiasi indirizzo IP che attiva tali scenari per evitare di bloccare utenti reali.
Per ottenere ciò, modifica il file profiles.yaml
.
Aggiungi questo blocco YAML all'inizio del tuo profilo in /etc/crowdsec/profiles.yaml
:
---
# /etc/crowdsec/profiles.yaml
name: crawler_captcha_remediation
filter: Alert.Remediation == true && Alert.GetScenario() in ["crowdsecurity/http-crawl-non_statics", "crowdsecurity/http-bad-user-agent"]
decisions:
- type: captcha
duration: 4h
on_success: break
Con questo profilo, viene applicato un CAPTCHA (per quattro ore) su qualsiasi indirizzo IP che attiva gli scenari crowdsecurity/http-crawl-non_statics
o crowdsecurity/http-bad-user-agent.
Successivamente, ricarica CrowdSec:
$ sudo systemctl reload crowdsec
Prova le soluzioni personalizzate
Il riavvio di uno scanner di vulnerabilità web attiverebbe molti scenari, quindi alla fine verresti nuovamente bannato. Invece, puoi semplicemente creare un attacco che attivi lo scenario bad-user-agent
(l'elenco degli user-agent dannosi noti è qui). Tieni presente che devi attivare la regola due volte per essere bannato.
$ curl --silent -I -H "User-Agent: Cocolyzebot" http://example.com > /dev/null
$ curl -I -H "User-Agent: Cocolyzebot" http://example.com
HTTP/1.1 200 OK
Date: Tue, 05 Oct 2021 09:35:43 GMT
Server: Apache/2.4.41 (Ubuntu)
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-cache, must-revalidate
X-Content-Type-options: nosniff
Content-Language: en
X-Frame-Options: SAMEORIGIN
X-Generator: Drupal 7 (http://drupal.org)
Content-Type: text/html; charset=utf-8
Ovviamente puoi vedere che vieni scoperto per le tue azioni.
$ sudo cscli decisions list
(Philippe Humeau, CC BY-SA 4.0)
Se provi ad accedere al sito, invece di essere semplicemente bloccato, ricevi un CAPTCHA:
(Philippe Humeau, CC BY-SA 4.0)
Una volta risolto il problema, potrai accedere nuovamente al sito web.
Successivamente, sbloccami di nuovo:
$ cscli decisions delete -i <your_ip>
Avvia lo scanner delle vulnerabilità:
$ ./nikto.pl -h http://example.com
A differenza dell'ultima volta, ora puoi vedere che hai attivato diverse decisioni:
(Philippe Humeau, CC BY-SA 4.0)
Quando si tenta di accedere al sito web, la decisione di ban ha la priorità:
(Philippe Humeau, CC BY-SA 4.0)
Incartare
Si tratta di un modo rapido per bloccare gli autori di attacchi provenienti da siti web e applicazioni PHP. Questo articolo contiene solo un esempio. Le soluzioni correttive possono essere facilmente estese per soddisfare esigenze aggiuntive. Per saperne di più sull'installazione e sull'utilizzo dell'agente CrowdSec, consulta questa guida pratica per iniziare.
Per scaricare il buttafuori PHP, vai su CrowdSec Hub o GitHub.