Utilizzare ModSecurity per proteggere il sito AEM dagli attacchi DoS
Scopri come abilitare ModSecurity per proteggere il tuo sito dagli attacchi Denial of Service (DoS) utilizzando OWASP ModSecurity Core Rule Set (CRS) nel Dispatcher Publish di Adobe Experience Manager (AEM).
Panoramica
La base Open Web Application Security Project® (OWASP) fornisce OWASP Top 10 che delinea i dieci problemi di sicurezza più critici per le applicazioni Web.
ModSecurity è una soluzione open-source e multipiattaforma che fornisce protezione da una serie di attacchi contro le applicazioni web. Consente inoltre il monitoraggio del traffico HTTP, la registrazione e l’analisi in tempo reale.
OWSAP® fornisce anche il set di regole di base OWASP® ModSecurity. CRS è un set di regole generiche di rilevamento degli attacchi da utilizzare con ModSecurity. In questo modo CRS mira a proteggere le applicazioni web da un'ampia gamma di attacchi, tra cui i primi dieci OWASP, con un minimo di falsi allarmi.
Questo tutorial illustra come abilitare e configurare la regola CRS DOS-PROTECTION per proteggere il sito da un potenziale attacco DoS.
Aggiungere CRS al modulo di progetto Dispatcher
-
Scaricare ed estrarre il set di regole di base OWASP ModSecurity più recente.
code language-shell # Replace the X.Y.Z with relevent version numbers. $ wget https://github.com/coreruleset/coreruleset/archive/refs/tags/vX.Y.Z.tar.gz # For version v3.3.5 when this tutorial is published $ wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.5.tar.gz # Extract the downloaded file $ tar -xvzf coreruleset-3.3.5.tar.gz
-
Crea le cartelle
modsec/crs
indispatcher/src/conf.d/
nel codice del progetto AEM. Ad esempio, nella copia locale del progetto AEM WKND Sites.{width="200" modal="regular"}
-
Copiare la cartella
coreruleset-X.Y.Z/rules
dal pacchetto di rilascio CRS scaricato nella cartelladispatcher/src/conf.d/modsec/crs
. -
Copiare il file
coreruleset-X.Y.Z/crs-setup.conf.example
dal pacchetto di rilascio CRS scaricato nella cartelladispatcher/src/conf.d/modsec/crs
e rinominarlo incrs-setup.conf
. -
Disattivare tutte le regole CRS copiate da
dispatcher/src/conf.d/modsec/crs/rules
rinominandole comeXXXX-XXX-XXX.conf.disabled
. È possibile utilizzare i comandi riportati di seguito per rinominare tutti i file contemporaneamente.code language-shell # Go inside the newly created rules directory within the dispathcher module $ cd dispatcher/src/conf.d/modsec/crs/rules # Rename all '.conf' extension files to '.conf.disabled' $ for i in *.conf; do mv -- "$i" "$i.disabled"; done
Vedi regole CRS e file di configurazione rinominati nel codice del progetto WKND.
{width="200" modal="regular"}
Abilitare e configurare la regola di protezione Denial of Service (DoS)
Per abilitare e configurare la regola di protezione Denial of Service (DoS), effettuare le operazioni riportate di seguito.
-
Abilitare la regola di protezione DoS rinominando
REQUEST-912-DOS-PROTECTION.conf.disabled
inREQUEST-912-DOS-PROTECTION.conf
(o rimuovere.disabled
dall'estensione del nome della regola) all'interno della cartelladispatcher/src/conf.d/modsec/crs/rules
. -
Configura la regola definendo le variabili DOS_COUNTER_THRESHOLD, DOS_BURST_TIME_SLICE, DOS_BLOCK_TIMEOUT.
- Creare un file
crs-setup.custom.conf
nella cartelladispatcher/src/conf.d/modsec/crs
. - Aggiungi lo snippet di regola seguente al file appena creato.
code language-none # The Denial of Service (DoS) protection against clients making requests too quickly. # When a client is making more than 25 requests (excluding static files) within # 60 seconds, this is considered a 'burst'. After two bursts, the client is # blocked for 600 seconds. SecAction \ "id:900700,\ phase:1,\ nolog,\ pass,\ t:none,\ setvar:'tx.dos_burst_time_slice=60',\ setvar:'tx.dos_counter_threshold=25',\ setvar:'tx.dos_block_timeout=600'"
- Creare un file
In questa configurazione della regola di esempio, DOS_COUNTER_THRESHOLD è 25, DOS_BURST_TIME_SLICE è 60 secondi e DOS_BLOCK_TIMEOUT è 600 secondi. Questa configurazione identifica più di due occorrenze di 25 richieste, esclusi i file statici, entro 60 secondi sono qualificati come attacchi DoS, causando il blocco del client richiedente per 600 secondi (o 10 minuti).
Inizializzare CRS
Per inizializzare il CRS, rimuovere i falsi positivi comuni e aggiungere eccezioni locali per il sito, effettua le seguenti operazioni:
-
Per inizializzare CRS, rimuovere
.disabled
dal file REQUEST-901-INITIALIZATION. In altre parole, rinominare il fileREQUEST-901-INITIALIZATION.conf.disabled
inREQUEST-901-INITIALIZATION.conf
. -
Per rimuovere i falsi positivi comuni come il ping IP locale (127.0.0.1), rimuovere
.disabled
dal file REQUEST-905-COMMON-EXCEPTIONS. -
Per aggiungere eccezioni locali come la piattaforma AEM o i percorsi specifici del sito, rinominare
REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example
inREQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
- Aggiungi eccezioni di percorso specifiche per la piattaforma AEM al file appena rinominato.
code language-none ######################################################## # AEM as a Cloud Service exclusions # ######################################################## # Ignoring AEM-CS Specific internal and reserved paths SecRule REQUEST_URI "@beginsWith /systemready" \ "id:1010,\ phase:1,\ pass,\ nolog,\ ctl:ruleEngine=Off" SecRule REQUEST_URI "@beginsWith /system/probes" \ "id:1011,\ phase:1,\ pass,\ nolog,\ ctl:ruleEngine=Off" SecRule REQUEST_URI "@beginsWith /gitinit-status" \ "id:1012,\ phase:1,\ pass,\ nolog,\ ctl:ruleEngine=Off" ######################################################## # ADD YOUR SITE related exclusions # ######################################################## ...
-
Rimuovere inoltre
.disabled
da REQUEST-910-IP-REPUTATION.conf.disabled per il controllo del blocco della reputazione IP eREQUEST-949-BLOCKING-EVALUATION.conf.disabled
per il controllo del punteggio delle anomalie.
Aggiungi configurazione Apache ModSecurity
Per abilitare ModSecurity (o modulo Apache mod_security
), effettuare le seguenti operazioni:
-
Crea
modsecurity.conf
alledispatcher/src/conf.d/modsec/modsecurity.conf
con le configurazioni chiave seguenti.code language-none # Include the baseline crs setup Include conf.d/modsec/crs/crs-setup.conf # Include your customizations to crs setup if exist IncludeOptional conf.d/modsec/crs/crs-setup.custom.conf # Select all available CRS rules: #Include conf.d/modsec/crs/rules/*.conf # Or alternatively list only specific ones you want to enable e.g. Include conf.d/modsec/crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf Include conf.d/modsec/crs/rules/REQUEST-901-INITIALIZATION.conf Include conf.d/modsec/crs/rules/REQUEST-905-COMMON-EXCEPTIONS.conf Include conf.d/modsec/crs/rules/REQUEST-910-IP-REPUTATION.conf Include conf.d/modsec/crs/rules/REQUEST-912-DOS-PROTECTION.conf Include conf.d/modsec/crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf # Start initially with engine off, then switch to detection and observe, and when sure enable engine actions #SecRuleEngine Off #SecRuleEngine DetectionOnly SecRuleEngine On # Remember to use relative path for logs: SecDebugLog logs/httpd_mod_security_debug.log # Start with low debug level SecDebugLogLevel 0 #SecDebugLogLevel 1 # Start without auditing SecAuditEngine Off #SecAuditEngine RelevantOnly #SecAuditEngine On # Tune audit accordingly: SecAuditLogRelevantStatus "^(?:5|4(?!04))" SecAuditLogParts ABIJDEFHZ SecAuditLogType Serial # Remember to use relative path for logs: SecAuditLog logs/httpd_mod_security_audit.log # You might still use /tmp for temporary/work files: SecTmpDir /tmp SecDataDir /tmp
-
Selezionare il
.vhost
desiderato dal modulo Dispatcherdispatcher/src/conf.d/available_vhosts
del progetto AEM, ad esempiowknd.vhost
, aggiungere la voce seguente all'esterno del blocco<VirtualHost>
.code language-none # Enable the ModSecurity and OWASP CRS <IfModule mod_security2.c> Include conf.d/modsec/modsecurity.conf </IfModule> ... <VirtualHost *:80> ServerName "publish" ... </VirtualHost>
Tutte le configurazioni di ModSecurity CRS e DOS-PROTECTION sono disponibili nel ramo tutorial/enable-modsecurity-crs-dos-protection del progetto WKND Sites dell'AEM per la revisione.
Convalida configurazione Dispatcher
Quando si lavora con AEM as a Cloud Service, prima di distribuire le modifiche alla configurazione di Dispatcher, è consigliabile convalidarle localmente utilizzando lo script validate
degli strumenti Dispatcher dell'SDK AEM.
# Go inside Dispatcher SDK 'bin' directory
$ cd <YOUR-AEM-SDK-DIR>/<DISPATCHER-SDK-DIR>/bin
# Validate the updated Dispatcher configurations
$ ./validate.sh <YOUR-AEM-PROJECT-CODE-DIR>/dispatcher/src
Distribuzione
Distribuisci le configurazioni Dispatcher convalidate localmente utilizzando la pipeline Cloud Manager Livello Web o Full Stack. È inoltre possibile utilizzare l'ambiente di sviluppo rapido per velocizzare i tempi di risposta.
Verifica
Per verificare la protezione DoS, in questo esempio inviamo più di 50 richieste (25 soglie di richiesta per due occorrenze) entro un intervallo di 60 secondi. Tuttavia, queste richieste devono passare attraverso l'AEM as a Cloud Service predefinito o qualsiasi altro CDN che occupa il tuo sito Web.
Una tecnica per ottenere il pass-through CDN consiste nell'aggiungere un parametro di query con un nuovo valore casuale in ogni richiesta di pagina del sito.
Per attivare un numero maggiore di richieste (50 o più) in un breve periodo (ad esempio 60 secondi), è possibile utilizzare lo strumento Apache JMeter o Benchmark o ab.
Simulare un attacco DoS utilizzando lo script JMeter
Per simulare un attacco DoS utilizzando JMeter, procedere come segue:
-
Scarica Apache JMeter e installalo localmente
-
Esegui localmente utilizzando lo script
jmeter
dalla directory<JMETER-INSTALL-DIR>/bin
. -
Aprire lo script JMX WKND-DoS-Attack-Simulation-Test di esempio in JMeter utilizzando il menu dello strumento Apri.
-
Aggiorna il valore del campo Nome server o IP in Home Page e Adventure Page HTTP Request sampler che corrispondono all'URL dell'ambiente AEM di prova. Rivedi altri dettagli dello script JMeter di esempio.
-
Eseguire lo script premendo il pulsante Start dal menu Strumenti. Lo script invia 50 richieste HTTP (5 utenti e 10 conteggi di loop) rispetto alla home page e alla pagina di avventura del sito WKND. In totale, quindi, 100 richieste a file non statici qualificano l'attacco DoS per la configurazione personalizzata della regola CRS DOS-PROTECTION.
-
Il listener JMeter Visualizza risultati nella tabella mostra lo stato di risposta Non riuscito per il numero di richiesta ~ 53 e versioni successive.
-
Per le richieste non riuscite viene restituito il codice di risposta HTTP 503. È possibile visualizzare i dettagli utilizzando il listener JMeter Visualizza struttura risultati.
Registri di revisione
La configurazione del logger ModSecurity registra i dettagli dell’incidente di attacco DoS. Per visualizzare i dettagli, effettua le seguenti operazioni:
-
Scarica e apri il file di registro
httpderror
di Publish Dispatcher. -
Cerca la parola
burst
nel file di registro per visualizzare le righe di errorecode language-none Tue Aug 15 15:19:40.229262 2023 [security2:error] [pid 308:tid 140200050567992] [cm-p46652-e1167810-aem-publish-85df5d9954-bzvbs] [client 192.150.10.209] ModSecurity: Warning. Operator GE matched 2 at IP:dos_burst_counter. [file "/etc/httpd/conf.d/modsec/crs/rules/REQUEST-912-DOS-PROTECTION.conf"] [line "265"] [id "912170"] [msg "Potential Denial of Service (DoS) Attack from 192.150.10.209 - # of Request Bursts: 2"] [ver "OWASP_CRS/3.3.5"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "paranoia-level/1"] [tag "attack-dos"] [tag "OWASP_CRS"] [tag "capec/1000/210/227/469"] [hostname "publish-p46652-e1167810.adobeaemcloud.com"] [uri "/content/wknd/us/en/adventures.html"] [unique_id "ZNuXi9ft_9sa85dovgTN5gAAANI"] ... Tue Aug 15 15:19:40.515237 2023 [security2:error] [pid 309:tid 140200051428152] [cm-p46652-e1167810-aem-publish-85df5d9954-bzvbs] [client 192.150.10.209] ModSecurity: Access denied with connection close (phase 1). Operator EQ matched 0 at IP. [file "/etc/httpd/conf.d/modsec/crs/rules/REQUEST-912-DOS-PROTECTION.conf"] [line "120"] [id "912120"] [msg "Denial of Service (DoS) attack identified from 192.150.10.209 (1 hits since last alert)"] [ver "OWASP_CRS/3.3.5"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "paranoia-level/1"] [tag "attack-dos"] [tag "OWASP_CRS"] [tag "capec/1000/210/227/469"] [hostname "publish-p46652-e1167810.adobeaemcloud.com"] [uri "/us/en.html"] [unique_id "ZNuXjAN7ZtmIYHGpDEkmmwAAAQw"]
-
Rivedi i dettagli come indirizzo IP client, azione, messaggio di errore e dettagli della richiesta.
Impatto sulle prestazioni di ModSecurity
L’abilitazione di ModSecurity e delle regole associate ha alcune implicazioni in termini di prestazioni, quindi è importante considerare quali regole sono necessarie, ridondanti e saltate. Collabora con i tuoi esperti di sicurezza web per abilitare e personalizzare le regole CRS.
Regole aggiuntive
Questa esercitazione abilita e personalizza solo la regola CRS DOS-PROTECTION a scopo dimostrativo. Si consiglia di collaborare con esperti di sicurezza web per comprendere, esaminare e configurare le regole appropriate.