Esistono innumerevoli sistemi IDS, molti a pagamento, molti con funzionalità totalmente inutili, alcuni troppo “permissivi” e proporzionalmente altri troppo “aggressivi”.
In questo articolo, primo di una lunga serie tempo permettendo, cerco di mostrarvi le tecniche per costruirsi le basi per mettere in piedi un IDS casalingo utilizzando gli strumenti che bash ci offre.
Potrebbe essere un ottimo esercizio mirato ad affinare le tecniche di scripting bash, vi ricordo che potet raggiungere lo stesso obiettivo con altri linguaggi stile php / perl ma quasi sicuramente otterrete a parità di risultati un utilizzo più massiccii in termini di cpu.
Iniziamo con il postprocessing dell’analisi del file access.log di apache con l’opzione “combined”
Lo scopo è avere a portata di mano una utility che ci permetta al volo di capire quali determinati IP hanno effettuato richieste verso il nostro sito.
awk '{print $1}' /var/log/apache/access.log
Possiamo contare il numero di hits totale
awk '{print $1}' /var/log/apache/access.log|wc -l
e passare a qualcosa di più utile: ordinamento e conteggio
awk '{print $1}' /var/log/apache/access.log| sort|uniq -c|sort
Sono bastati un paio di comandi per fare qualcosa che via php/perl (senza usare CPAN!) vi sarebbe costato qualche ciclo… ora togliamo anche le “” virgolette che contornano l’indirizzo IP
awk '{print $1}' /var/log/apache/access.log| sort|uniq -c|sort|sed s/\"//g
Se volessimo sapere quante sono in tutto le richieste e ip unici aggiungiamo un awk
awk '{print $1}' /var/log/apache/access.log| sort|uniq -c|sort|sed s/\"//g| awk '{print $0;tot+=1;sum+=$1} END {print "HITS: "sum "|IP: " tot}'
Lo script è “corto” quanto basta per essere ancora scritto a video e richiamato via history e relativo !ID_CMD. Ovviamente ha le sue limitazioni in quanto la funzionalità è relativa ai settaggi del vostro logrotate. Nel prossimo articolo inserirò il metodo per potere parsare solo gli ultimi X minuti del file access.log e rendere lo script più performante nella sintassi
./hits ARG1