Analyse automatisée des logs apache

Bonjour à tous …
[la traduction du terme analyse dans le texte est GREP ^^ faut pas s’attendre à une analyse mathématique !!]

Bé voilà, comme j’adore raconter ma vie, voici un petit truc sympa :

Aujourd’hui on a eu droit à un cours … le premier depuis des mois!!! L’ennui se faisant sentir (un cours sur les tests … déjà vu en DUT), je me connecte à mon serveur et après un petit tour du proprio … comme d’hab koi ^^ Je lis les logs de mon serveur … (c’est grave docteur ??) et là horreur plein de ligne du ModSecurity m’indiquant pleins de tentatives diverses et variées (XSS, SQL Injection, …).

Un petit aperçu d’une ligne du log :

[Fri May 15 16:36:35 2009] [error] [client 74.55.32.34] ModSecurity: Access denied with code 501 (phase 2).
[msg "Remote File Access Attempt"]
[severity "CRITICAL"] [tag "WEB_ATTACK/FILE_INJECTION"]
[hostname "blog.gaetan-grigis.eu"]
[unique_id "Sg1981diuFsAADJ2ypYAAAAC"]

Le genre du truc qu’en terminal on aime pas trop lire (surtout sur l’écran du téléphone portable) … et pis y’en avais une bonne cinquantaine … et là mes venu la superbe idée (j’imagine que plein d’admins l’on déjà fait, mais bon ^^ au cas où si ça vous intéresse), j’ai crée un petit script qui analyse le log d’erreur d’apache (par grep quoi ^^) et envoi un mail avec les lignes incriminées, ce qui donne donc (il vous faudra bien sûr le mod_security d’installé … cf. mon blog ;))

#!/bin/sh
LOG_ERROR="/var/log/apache2/error.log"
LOG_MODSEC=`cat $LOG_ERROR |grep ModSecurity | wc -l`
if [ $LOG_MODSEC -gt 0 ]
then
        SEVERITY_ALERT=`cat $LOG_ERROR | grep "severity \"ALERT\"" | wc -l`
        SEVERITY_CRITI=`cat $LOG_ERROR | grep "severity \"CRITICAL\"" | wc -l`
        if [ $SEVERITY_ALERT -gt 0 ]
        then
                cat $LOG_ERROR | grep "severity \"ALERT\"" |mail -s "[LOG]HTTP ALERT" addr@gmail.com
                echo "NB ALERT : $SEVERITY_ALERT"
        fi

        if [ $SEVERITY_CRITI -gt 0 ]
        then
                cat $LOG_ERROR |grep "severity \"CRITICAL\"" | mail -s "[LOG]HTTP CRITICAL" addr@mail.com
                echo "NB CRITICAL : $SEVERITY_CRITI"
        fi
fi

et voila passionnante ma vie ^^, en ASM ça se résumerait ainsi : (MOV al,1 XOR ebx,ebx, int 0x80), reste plus qu’à exécuter le script avant le rotatelog histoire d’avoir le résumé des attaques de la journée/semaine …
Je vais peut être en profiter pour faire des graphiques suivant les types d’attaque, leurs nombres, leurs provenances, … ou pas

Petit ajout du 17 mai … pour rajouter un script du genre celui donné plus haut, il faut aller voir dans le fichier /etc/logrotate.d/apache2 et ajouter les lignes suivantes :

        prerotate
                sh /scripts/logAnalyzer.sh > /dev/null
        endscript

après la ligne sharedscripts et hop, on envoi les mails avant la rotation des logs, comme ça on passe pas pour le nolife-ki-li-ses-logs-apache-pendant-les-cours devant ses camarades de classe.

Voilà … bon we 😉