Aggiornamento: la risposta corrente è completamente aggiornata.
Secondo questa discussione ho creato un repository GitHub chiamato WWW Security Assistant . C'è un ramo, chiamato ask_ubuntu
, dedicato a questa risposta. Tutti i riferimenti, precedentemente disponibili qui , vengono rimossi a causa del limite di caratteri - sono disponibili su GitHub.
Qui ci sono alcuni modi trascurati, coinvolti in un meccanismo completo, come aumentare la sicurezza di Apache2 in Ubuntu 16.04.
Tabella dei contenuti:
- WWW Security Assistant Script (WSAS) ► Iptables
- Iptables - Configurazione di base - Salva e ripristina
- ModEvasive per Apache2
- ModEvasive ► WSAS ► Iptables
- ModSecurity 2.9 per Apache2
- ModSecurity OWASP Set di regole di base 3.x
- Whitelisting delle regole ModSecurity
- ModSecurity Rules ► WSAS ► Iptables
- File di registro ModSecurity e Apache
- File di registro ModSecurity ► Fail2Ban ► Iptables
- ModSecurity GuardianLog ► Guardian HTTPD ► WSAS ► Iptables
- ModSecurity GuardianLog ► Analizza HTTPD personalizzato ► WSAS ► Iptables
Inoltre diciamo che è sempre bene usare HTTPS:
WWW Security Assistant Script ► Iptables
Qui è presentato il copione www-security-assistant.bash
. Potrebbe aiutarti a gestire gli indirizzi IP dannosi. Lo script ha due modalità.
Modalità automatica
Quando un programma esterno, come quello di Apache mod_security
, fornisce un $IP
indirizzo dannoso . In questo caso, la sintassi che richiama lo script, dovrebbe essere:
www-security-assistant.bash <ip-address> Guardian
www-security-assistant.bash <ip-address> ModSecurity
www-security-assistant.bash <ip-address> ModEvasive
www-security-assistant.bash <ip-address> a2Analyst
In questa modalità lo script fornisce due fasi di azione e per ogni azione invierà un'e - mail all'amministratore (i).
Primo stadio: per le prime "trasgressioni" la fonte $IP
sarà bandita per un periodo di tempo pari al valore di $BAN_TIME
. Questa modalità utilizza il comando at
.
Secondo stadio: quando il numero delle trasgressioni da un certo $IP
diventa uguale al valore di $LIMIT
, questo $IP
indirizzo sarà bandito in modo permanente attraverso Iptables e verrà aggiunto al $BAN_LIST
.
Modalità manuale
Questa modalità accetta le seguenti opzioni:
www-security-assistant.bash <ip-address>
--DROP "log notes"
Crea una voce nel file /var/www-security-assistant/iptables-DROP.list
e genera una regola come:
iptables -A GUARDIAN -s $IP -j DROP
www-security-assistant.bash <ip-address>
--DROP-CLEAR "log notes"
Crea una voce nel file /var/www-security-assistant/iptables-DROP-CLEAR.list
, rimuove la certa regola Iptables, rimuove $IP
la cronologia e la $BAN_LIST
:
iptables -D GUARDIAN -s $IP -j DROP
www-security-assistant.bash <ip-address>
--ACCEPT "log notes"
Crea solo una voce nel file /var/www-security-assistant/iptables-ACCEPT.list
.
www-security-assistant.bash <ip-address>
--ACCEPT-CHAIN "log notes"
Crea una voce nel file /var/www-security-assistant/iptables-ACCEPT.list
e genera una regola come:
iptables -A GUARDIAN -s $IP -j ACCEPT
dipendenze
Lo script utilizza iptables-save.sh
e la iptables
catena GUARDIAN
, spiegati nella sezione successiva. Creerà e manterrà pochi file all'interno di $WORK_DIR
:
www-security-assistant.history
- contiene i dati per le trasgressioni dell'IP precedente.
www-security-assistant.mail
- il contenuto dell'ultima e-mail inviata dallo script.
iptables-ACCEPT.list
; iptables-DROP.list
e iptables-DROP-CLEAR.list
.
Lo script richiede una configurazione minima per inviare e-mail:
sudo apt install s-nail mutt mailutils postfix
sudo dpkg-reconfigure postfix # For General type: Internet Site
echo 'Test passed.' | mail -s Test-Email email@example.com
Se esiste un servizio HTTPS configurato, è possibile utilizzare il relativo certificato TLS nel servizio Postfix.
Inoltre lo script utilizza at
: sudo apt install at
.
Installazione
Crea directory di lavoro, chiamiamola /var/www-security-assistant
. Scarica www-security-assistant.bash
e rendilo eseguibile:
sudo mkdir /var/www-security-assistant
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/www-security-assistant.bash -O /var/www-security-assistant/www-security-assistant.bash
sudo chmod +x /var/www-security-assistant/www-security-assistant.bash
Rendi www-security-assistant.bash
disponibile come comando personalizzato:
sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
Concedere l'autorizzazione per www-data
l'esecuzione www-security-assistant.bash
senza password tramite sudo
. Utilizzare il comando seguente per creare e modificare in sicurezza un nuovo file con un'ulteriore sudoers
regola " ":
sudo visudo -f /etc/sudoers.d/www-security-assistant
Aggiungi la seguente riga all'interno del file: salva il file ed esci:
www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
Tweak www-security-assistant.bash
. Cambia almeno il valore della variabile $EMAIL_TO
.
Verifica
Rappresentati come $AGENT
e controlla se la MODALITÀ automatica funziona correttamente:
www-security-assistant.bash 192.168.1.177 Guardian
Quindi controlla la tua e-mail, digita iptables -L GUARDIAN -n
, rivedi i file www-security-assistant.history
e www-security-assistant.mail
. Eseguire il comando sopra 5 volte e rivedere i file iptables-DROP.list
e iptables-CURRENT.conf
.
Controlla se la MODALITÀ manuale funziona correttamente - aggiungi il tuo host locale alla White List:
www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"
Quindi controlla il file iptables-ACCEPT.list
.
La parte restante di questo tutorial è come integrarsi www-security-assistant
con il tuo sistema.
Iptables - Configurazione di base - Salva e ripristina
Configurazione di base
Leggere questo manuale prima di aggiungere le seguenti regole.
sudo iptables -F
sudo iptables -I INPUT 1 -i lo -j ACCEPT
sudo iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# This rule may lock you out of the system!
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
Prima di eseguire le azioni successive, apri una nuova connessione SSH e prova ad accedere al tuo sistema per verificare se tutto funziona correttamente!
Salva e ripristina
Ciò potrebbe essere ottenuto tramite script personalizzati, che salveranno e ripristineranno il iptables
coning durante il processo di stop-start (o riavvio) del sistema. (Se utilizziamo UFW per impostare le regole di Iptables questo passaggio non è necessario.)
printf '#!/bin/sh\n/sbin/iptables-save > /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-save.sh
printf '#!/bin/sh\n/sbin/iptables-restore < /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-restore.sh
sudo chmod +x /var/www-security-assistant/iptables-restore.sh /var/www-security-assistant/iptables-save.sh
sudo ln -s /var/www-security-assistant/iptables-save.sh /etc/network/if-post-down.d/iptables-save
sudo ln -s /var/www-security-assistant/iptables-restore.sh /etc/network/if-pre-up.d/iptables-restore
Crea una nuova catena
Crea una nuova catena, chiamata GUARDIAN
e inseriscila come numero 3 nella INPUT
catena:
sudo iptables -N GUARDIAN
sudo iptables -I INPUT 3 -j GUARDIAN
Verifica
Riavvia il sistema e controlla la configurazione. Si prega di utilizzare sudo systemctl reboot
(non utilizzare l'opzione force reboot -f
). Quando il sistema è di nuovo online, possiamo verificare se la catena appena creata esiste:
sudo iptables -L GUARDIAN -n
ModEvasive per Apache2
ModEvasive è un modulo di manovre evasive per Apache per fornire azioni evasive in caso di attacco DoS o DDoS HTTP o attacco di forza bruta. Leggi di più...
Installazione
Installa e abilita il modulo:
sudo apt install libapache2-mod-evasive
sudo a2enmod evasive
Crea directory di registro e rendila accessibile per www-data
:
sudo mkdir -p /var/log/apache2_mod_evasive
sudo chown www-data /var/log/apache2_mod_evasive
Regola la configurazione di base: decommenta e modifica alcune direttive nel file di configurazione:
/etc/apache2/mods-enabled/evasive.conf
Riavviare Apache: sudo systemctl restart apache2.service
.
Verifica
- Apri una pagina web dal tuo server e aggiorna la finestra del browser alcune volte in modo intensivo (premi
F5
): devi visualizzare il messaggio di errore 403 proibito . Nella directory del registro, verrà generato un nuovo file di blocco. Questo file deve essere eliminato per il rilevamento di ulteriori trasgressioni da questo indirizzo IP.
ModEvasive ► WSAS ► Iptables
Qui ci configureremo mod_evasive
per parlare iptables
attraverso www-security-assistant.bash
, creato nella sezione precedente.
Modifica /etc/apache2/mods-available/evasive.conf
in questo modo:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 9
DOSSiteCount 70
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
#DOSEmailNotify your@email.foo
DOSLogDir "/var/log/apache2_mod_evasive"
DOSSystemCommand "sudo /var/www-security-assistant/www-security-assistant.bash %s 'ModEvasive' 'AutoMode' >> /var/www-security-assistant/www-security-assistant.execlog 2>&1"
</IfModule>
Crea file di registro e riavvia Apache:
sudo touch /var/www-security-assistant/www-security-assistant.execlog && sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog
Per verificare questa configurazione possiamo simulare attacco DDOS tramite il F5
metodo menzionato sopra, oppure possiamo utilizzare un comandi come ab
, hping3
ecc
Attenzione: fare attenzione perché la iptables
regola, utilizzata in WSAS, farà cadere tutte le nuove connessioni dall'origine $IP
, comprese le connessioni SSH. È utile disporre di un modo di backup per connettersi al server durante i test. È possibile modificare questa regola in modo che funzioni solo con le porte HTTP / HTTPS.
ModSecurity 2.9 per Apache2
ModSecurity è un motore firewall per applicazioni Web che offre una protezione molto ridotta da solo. Per diventare utile, ModSecurity deve essere configurato con regole. Al fine di consentire agli utenti di sfruttare appieno ModSecurity, Trust Labs Spider Labs fornisce un set di regole certificato gratuito ... Leggi di più ...
Installazione
Installa e abilita il modulo:
sudo apt install libapache2-mod-security2
sudo a2enmod security2
Crea file di configurazione:
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
Leggere e modificare /etc/modsecurity/modsecurity.conf
con attenzione! Aggiungi o modifica almeno le seguenti direttive:
# -- Rule engine initialization ----------------------------------------------
SecRuleEngine On
# -- Debug log configuration -------------------------------------------------
SecDebugLogLevel 2
SecDebugLog "/var/log/apache2_mod_security/modsec_debug.log"
# -- Audit log configuration -------------------------------------------------
SecAuditLog "/var/log/apache2_mod_security/modsec_audit.log"
# -- Guardian log configuration -------------------------------------------------
SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
Il file /etc/apache2/mods-enabled/security2.conf
riguarda /etc/modsecurity/modsecurity.conf
la configurazione di Apache. In questa fase security2.conf
deve apparire come questo:
<IfModule security2_module>
SecDataDir /var/cache/modsecurity
IncludeOptional /etc/modsecurity/*.conf
</IfModule>
Crea directory registro:
sudo mkdir -p /var/log/apache2_mod_security
Rotazione del registro di installazione. Innanzitutto creare il file di configurazione:
sudo cp /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-modsec
Quindi modifica il nuovo file in questo modo:
/var/log/apache2_mod_security/*.log { … }
Riavvia Apache.
Verifica
Crea un file di configurazione aggiuntivo /etc/modsecurity
, chiamalo ad esempio z-customrules.conf
e aggiungi la seguente regola come contenuto:
# Directory traversal attacks
SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"
Riavviare il server: sudo systemctl restart apache2.service
. Apri il browser e digita https://example.com/?abc=../
. Il risultato sarà: 403 Proibito . Controllare i file di registro /var/log/apache2_mod_security
per ulteriori dettagli.
Per rendere le cose più divertenti, posiziona lo script issues.php
in una posizione appropriata all'interno del tuo DocumentRoot
(qui suppongo che questo posto sia /var/www/html
):
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/appendix/var/www/html/issues.php -O /var/www/html/issues.php
Quindi modificare la regola sopra nel modo seguente:
# Directory traversal attacks with redirection (or use URL instead of URI: redirect:'https://example.com/issues.php')
SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109, redirect:'/issues.php'"
Riavvia Apache, quindi apri il browser e digita https://example.com/?abc=../
;-) L'idea è presa in prestito dallo script di SE BotLovin.cs
.
Modifica /etc/modsecurity/z-customrules.conf
ancora una volta e commenta (disabilita) la regola: questo era solo un esempio di prova ed è coperto da OWASP CRS, descritto nella sezione successiva.
Ecco un altro esempio in cui reindirizzeremo tutte le wp-admin
richieste di pagina, ma eccetto queste da determinati indirizzi IP (nota il chain
):
# Block wp-admin access
SecRule REQUEST_URI "^/wp-admin" "id:108, log, deny, status:403, t:lowercase, chain, redirect:'/issues.php'"
SecRule REMOTE_ADDR "!@ipMatch 192.168.1.11,99.77.66.12"
Qui abbiamo due azioni dirompenti: (1) deny, status:403
e (2) redirect:'/issues.php'
. In realtà non abbiamo bisogno deny
dell'azione perché sarà annullata redirect
dall'azione.
ModSecurity OWASP Set di regole di base 3.x
In Ubuntu 16.04 è possibile installare 2.x CSR: apt install modsecurity-crs
. Qui installeremo CSR 3.x , le istruzioni dettagliate sono fornite nel manuale di installazione ( git
è obbligatorio).
Installazione
Clona CSR nella cartella /usr/share/modsecurity-crs.3
:
sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
Aggiorna e rinnova automaticamente il database GeoIP. (Il DB GeoIP non è più incluso nel CRS. Invece si consiglia di scaricarlo regolarmente.) Lo script util/upgrade.py
porta questa funzionalità. Puoi usarlo come segue in cron - sudo crontab -e
:
0 2 * * * /usr/share/modsecurity-crs.3/util/upgrade.py --geoip --crs --cron >> /var/log/apache2_mod_security/owasp-crs-upgrade.log 2>&1
Crea file di configurazione:
sudo cp /usr/share/modsecurity-crs.3/crs-setup.conf{.example,}
sudo cp /usr/share/modsecurity-crs.3/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf{.example,}
sudo cp /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf{.example,}
Leggi e modifica questi file con attenzione! Uncomment almeno SecGeoLookupDB
direttiva:
SecGeoLookupDB util/geo-location/GeoIP.dat
Applica la configurazione di Apache. Modifica /etc/apache2/mods-available/security2.conf
in questo modo:
<IfModule security2_module>
SecDataDir /var/cache/modsecurity
IncludeOptional /etc/modsecurity/*.conf
IncludeOptional /usr/share/modsecurity-crs.3/crs-setup.conf
IncludeOptional /usr/share/modsecurity-crs.3/rules/*.conf
</IfModule>
Salvare il file e quindi riavviare Apache.
Whitelisting delle regole ModSecurity
La whitelist delle regole ModSecurity potrebbe essere effettuata tramite le seguenti direttive ModSec, che possono essere utilizzate a livello di sistema o nella configurazione dell'host virtuale, anche a livello globale, per directory specifiche o corrispondenze di località:
SecRuleRemoveById
SecRuleRemoveByMsg
SecRuleRemoveByTag
SecRuleUpdateTargetById
SecRuleUpdateTargetByMsg
SecRuleUpdateTargetByTag
SecRuleUpdateActionById
Disabilita mod_security2
per PhpMyAdmin. Cambia /etc/phpmyadmin/apache.conf
in questo modo:
<Directory /usr/share/phpmyadmin>
<IfModule security2_module>
SecRuleEngine Off
</IfModule>
</Directory>
Disabilita regole specifiche per determinate directory:
<Directory /var/www/html>
<IfModule security2_module>
SecRuleRemoveById 973301
</IfModule>
</Directory>
Disabilita le regole a livello globale. A questo scopo dobbiamo aggiungere le nostre direttive da qualche parte nei file di configurazione di Apache: /etc/modsecurity/z-customrules.conf
è un buon posto.
Disabilita le regole all'interno dell'intera configurazione di Apache:
SecRuleRemoveById 973301 950907
Autorizza un indirizzo IP in modo che possa passare attraverso ModSecurity:
SecRule REMOTE_ADDR "@ipMatch 192.168.110.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
Disabilita le regole in Directory match:
<Directory /var/www/mediawiki/core>
SecRuleRemoveById 973301 950907
</Directory>
Aggiorna l'azione della regola con il suo ID all'interno della corrispondenza Posizione:
<LocationMatch "/index.php.*">
SecRuleUpdateActionById 973301 "pass"
SecRuleUpdateActionById 950907 "pass"
</LocationMatch>
Negli esempi sopra riportati si assume che 973301
e 950907
sono gli ID di regole che ostacolano il normale lavoro delle nostre applicazioni web. Possiamo trovare regole come queste da un'analisi di modsec_audit.log
.
ModSecurity Rules ► WSAS ► Iptables
Qui sono riportati alcuni altri esempi su come creare SecRule personalizzati, e anche come possiamo chiamare WWW Security Assistant Script (WSAS) attraverso di essi.
Configurazione iniziale
Abbiamo bisogno di uno script di avvio aggiuntivo - modsecurity-assistant.sh
. Il motivo è che l' exec
azione di ModSecurity ha una sintassi troppo semplice e limitata.
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/modsecurity-assistant.sh -O /var/www-security-assistant/modsecurity-assistant.sh
sudo chmod +x /var/www-security-assistant/modsecurity-assistant.sh
Se guardi all'interno dello script vedrai alcune variabili esportate da ModSecurity. Questi sono: $REQUEST_URI
, $ARGS
, $SERVER_NAME
, $REMOTE_ADDR
, $REMOTE_HOST
e $UNIQUE_ID
. Le altre variabili sono spiegate all'interno dello script.
Crea una regola personalizzata e chiama i nostri script attraverso di essa
Per prima cosa creiamo una regola che verrà eseguita modsecurity-assistant.sh
(e chiamata www-security-assistant.bash
) quando l'URI della richiesta contiene una parola inclusa nella nostra lista nera. Apri /etc/modsecurity/z-customrules.conf
e aggiungi le seguenti righe in fondo:
# REQUEST_URI words blacklist
#
SecRule REQUEST_URI "@pmFromFile /var/www-security-assistant/modsecurity-uri-black.list" \
"id:150, log, t:lowercase, chain, \
drop, deny, status:403, redirect:'/issues.php'"
SecRule REMOTE_ADDR "!@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
"setenv:REMOTE_HOST=%{REMOTE_HOST}, \
setenv:ARGS=%{ARGS}, \
exec:/var/www-security-assistant/modsecurity-assistant.sh"
REQUEST_URI
- questa variabile contiene l'URI completo della richiesta corrente. La regola potrebbe essere più ampia:SecRule REQUEST_URI|ARGS|REQUEST_BODY ...
@pmFromFile
leggerà il file modsecurity-uri-black.list
che contiene un elenco di frasi, in cui ogni frase o parola specifica viene inserita in una nuova riga. È possibile raccogliere parole e frasi interessanti dai file di registro. Se esiste una corrispondenza particolare tra REQUEST_URI
e il nostro elenco di modelli, verrà applicata la regola. Il file potrebbe essere vuoto, ma è necessario crearlo ( touch
).
L' log
azione creerà voci di registro nei file di registro per questa regola con id:150
.
drop
, deny
(con status
) e le redirect
azioni appartengono al gruppo dirompente di azioni, devono essere all'inizio della regola chain
(se esiste una catena). La seconda azione sovrascriverà la prima e la terza sovrascriverà la seconda, quindi è necessario scegliere quale si desidera eseguire e cancellare le altre.
chain
l'azione chiamerà la prossima regola della catena, nota che la seconda regola, non ha id
.
REMOTE_ADDR
contiene l'indirizzo IP della richiesta.
@ipMatchFromFile
sarà il file modsecurity-ip-white.list
che contiene una lista bianca di indirizzi IP, separati su nuove righe. Sono accettabili anche le voci CIDR. Poiché l' azione dirompente si trova sempre nella regola principale della catena, verrà applicata, ma quando un determinato IP si trova in questa lista bianca, l' exec
azione non verrà applicata. Il file potrebbe essere vuoto, ma è necessario crearlo ( touch
).
exec
action chiamerà il nostro script esterno. Questa azione non è dirompente e verrà eseguita quando la regola corrente tornerà vera. Quando viene applicata questa azione, l'IP remoto verrà elaborato tramite i nostri script.
setenv
questa azione esporterà alcune variabili interne =%{...}
come envvars, i nomi esportati possono essere diversi dagli interni. Alcune variabili devono essere esportate manualmente, altre vengono esportate automaticamente - probabilmente si tratta di un piccolo bug (in alcuni casi l'esportazione manuale con gli stessi nomi, ad esempio setenv:REQUEST_URI=%{REQUEST_URI}
, causerà un valore vuoto della variabile esportata).
Verifica
Supponiamo che non hai Joomla sul tuo server, modifica il file modsecurity-uri-black.list
e aggiungi una riga con il contenuto /joomla
. Quindi digitare il browser https://exemple.com/joomla
. Dovresti essere reindirizzato e bloccato tramite Iptables. Cancella i record sudo www-security-assistant.bash <your-ip> --DROP-CLEAR 'some note'
, aggiungi il tuo IP modsecurity-ip-white.list
e ripeti l'esercizio. Ora dovresti essere reindirizzato, ma non bloccato.
Collega i nostri script con OWASP Core Rule Set 3.x
Per fare ciò aggiorneremo l'azione predefinita delle Regole della modalità Anomalia (949110 e 959100). A tal fine, modifica il file /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
e aggiungi le righe successive in fondo:
# -- Anomaly Mode - Update actions by ID -----
#
SecRuleUpdateActionById 949110 "t:none, drop, deny, status:403, redirect:'/issues.php', \
setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
exec:/var/www-security-assistant/modsecurity-assistant.sh"
SecRuleUpdateActionById 959100 "t:none, drop, deny, status:403, redirect:'/issues.php', \
setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
exec:/var/www-security-assistant/modsecurity-assistant.sh"
# -- Anomaly Mode - Whitelist some URI and IP addresses -----
#
SecRule REQUEST_URI "^/wp-admin/admin-ajax.php*|^/index\.php\?title=.*&action=(submit|raw&ctype=text/javascript|raw&ctype=text/css)$" \
"id:'999010', t:none, phase:1, pass, \
ctl:ruleRemoveById=949110, \
ctl:ruleRemoveById=959100"
SecRule REMOTE_ADDR "@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
"id:'999020', t:none, phase:1, pass, \
ctl:ruleRemoveById=949110, \
ctl:ruleRemoveById=959100"
Verifica
Non dimenticare di riavviare (o ricaricare) Apache per applicare le modifiche alla configurazione. Non dimenticare di cancellare periodicamente i record durante i test, altrimenti puoi essere bloccato in modo permanente :-)
Simula l'attacco trasversale alla directory:
https://example.com/?abc=../../../ # This should be redirected and blocked
https://example.com/wp-admin/admin-ajax.php?abc=../../../ # This should pass because of the whitelist rule
Simula attacco SQL Injection:
https://example.com/?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
https://example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo
File di registro ModSecurity e Apache
Il web server Apache può essere configurato per fornire all'amministratore del server importanti informazioni sul suo funzionamento ... La strada principale per fornire feedback all'amministratore è attraverso l'uso dei file di registro. Leggi di più...
ModSecurity ha un potente meccanismo di registrazione. Dalla direttiva SecGuardianLog
fornisce un feed di log appositamente progettato per funzionare con script esterni.
Attualmente l'unico strumento noto per funzionare con il registro dei guardiani è
httpd-guardian
, che fa parte del progetto Apache httpd tools . Lo httpd-guardian
strumento è progettato per difendersi dagli attacchi denial of service. Usa il blacklist tool
per interagire con un firewall basato su iptables, inserendo dinamicamente nella blacklist gli indirizzi IP offensivi. Leggi di più...
File di registro ModSecurity ► Fail2Ban ► Iptables
È possibile configurare Fail2Ban per l'analisi dei dati dei file di registro di Apache. modsec_audit.log
è probabilmente la scelta migliore, ma vedi anche le sezioni di cui parliamo SecGuardianLog
.
Fai attenzione che SecAuditLogRelevantStatus
in /etc/modsecurity/modsecurity.conf
sia commentato. Altrimenti tutti coloro che ricevono una pagina di errore 404 verrebbero bloccati da fail2ban.
SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"
Attualmente Fail2Ban non è implementato in alcun modo in questo progetto.
ModSecGuardianLog ► HTTPD-Guardian ► WSAS ► Iptables
httpd-guardian
- Rileva gli attacchi DoS monitorando le richieste Apache Security, Copyright (C) 2005 Ivan Ristic - è progettato per monitorare tutte le richieste del server Web attraverso il meccanismo di registrazione in pipe. Tiene traccia del numero di richieste inviate da ciascun indirizzo IP ... httpd-guardian può emettere un avviso o eseguire uno script per bloccare l'indirizzo IP ...
Questo script può essere utilizzato con il meccanismo di registrazione di Apache2 o con
ModSecurity (meglio).
Installazione e configurazione nelle circostanze attuali
Scarica httpd-guardian
e rendilo eseguibile:
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-guardian.pl -O /var/www-security-assistant/httpd-guardian.pl
sudo chmod +x /var/www-security-assistant/httpd-guardian.pl
Leggi le righe 98-119
per vedere come lo script è collegato al nostro script WSAS.
Applicare la seguente modifica nella configurazione di Apache ( /etc/modsecurity/modsecurity.conf
), quindi riavviarla:
#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
Verifica
Per testare lo script disabilita ModEvasive ( sudo a2dismod evasive
non dimenticare di abilitarlo in seguito) e riavvia Apache. Quindi tail
il registro exec:
tail -F /var/www-security-assistant/www-security-assistant.execlog
E da un'altra istanza esegui un attacco DoS, ad esempio utilizzalo ab
in questo modo:
for i in {1..20}; do (ab -n 200 -c 10 https://example.com/ &); done
ModSecGuardianLog ► Analizza personalizzato ► WSAS ► Iptables
Qui viene presentato un semplice script, chiamato httpd-custom-analyze.bash
, che non è qualcosa di speciale ma potrebbe essere un buon esempio. Le sue caratteristiche sono descritte nel corpo della sceneggiatura.
Installazione e configurazione
Scarica httpd-custom-analyze.bash
e rendilo eseguibile:
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-custom-analyze.bash -O /var/www-security-assistant/httpd-custom-analyze.bash
sudo chmod +x /var/www-security-assistant/httpd-custom-analyze.bash
Applica la seguente modifica nella configurazione di Apache ( /etc/modsecurity/modsecurity.conf
) e riavviala:
#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
#SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
SecGuardianLog "|/var/www-security-assistant/httpd-custom-analyze.bash"
Lo script chiamerà WSAS quando viene raggiunta la soglia: leggi la riga 86
e 35
.
Per far httpd-
funzionare contemporaneamente entrambi gli script, modifica modsecurity.conf
e reindirizza SecGuardianLog
a entrambi.
Per eseguire un test, seguire i suggerimenti della sezione precedente.