Postfix, affichez les tentatives de spam
Objectif
Cette page a pour but, de vous montrer comment réaliser une page de rapport automatique de tentative de spam. à l'image de spam.j2c-s2c.com
Prérequis
Vous devez avoir un serveur de mail postfix opérationnel, non open-relay, et protégé contre le spam via des dispositifs de destruction avant livraison.(RBL, règles strict dans votre serveur)
Vous devez connaitre, le php, et le sh
Apache, sur la machine doit être capable de faire de l'url rewriting.
Coté serveur de mail
Nous devons lire les logs, et en extraire l'info sans la relire 2 fois... nous choissons d'utiliser logtail et de faire tourner le script 1 fois par jour
Installation de logtail
aptitude install logtail
Le script
#!/bin/sh
DEST='/home/www/spam/reports'
/usr/sbin/logtail -o $DEST/offset.log /var/log/mail.log | awk '$7 ~ /reject/ && $11 !~ /450/ {print $2 "-" $1 "-" $3 " " $10 $27}' > $DEST/$(/bin/date +%Y%m%d).log
Je récupère un certains nombre de champs, sur des entrées comportant le mot "reject", qui ne sont pas des erreurs temporaires (= 450).
Ce programme, génère un fichier du genre :
10-Jan-09:05:39 unknown[121.20.70.198]:from=<tickerp2@sonnenplatz.com>
10-Jan-09:08:39 unknown[121.63.24.126]:from=<steamerzy6@projectile-ltd.com>
10-Jan-09:31:34 unknown[88.253.26.174]:from=<jason@fmunch.com>
10-Jan-09:48:24 unknown[123.55.179.91]:from=<vibratoz@3dplant.com>
10-Jan-10:20:15 unknown[91.185.11.150]:from=<dwvitranim@vitrani.com>
10-Jan-10:20:30 unknown[91.185.11.150]:from=<jnakbmvb@studiogid.ru>
10-Jan-10:20:46 unknown[91.185.11.150]:from=<david@travpunkten.com>
10-Jan-10:24:01 118-165-77-16.dynamic.hinet.net[118.165.77.16]:from=<bd5gk921j@yahoo.com>
10-Jan-11:25:22 200-161-186-21.dsl.telesp.net.br[200.161.186.21]:from=<marcel@j2c-s2c.com>
10-Jan-11:30:33 118-165-72-115.dynamic.hinet.net[118.165.72.115]:from=<bd5gk921j@yahoo.com>
10-Jan-12:18:27 118-166-218-113.dynamic.hinet.net[118.166.218.113]:from=<ttc585ttc585@yahoo.com.tw>
10-Jan-14:16:29 118-167-130-6.dynamic.hinet.net[118.167.130.6]:from=<support@microsoft.com>
10-Jan-21:16:24 118-168-115-186.dynamic.hinet.net[118.168.115.186]:from=<ttc585ttc585@yahoo.com.tw;>
10-Jan-21:30:09 ks361263.kimsufi.com[91.121.167.141]:from=<beetell@unitead2.com>
10-Jan-23:37:44 cbl-sd-65-249.aster.com.do[190.0.65.249]:from=<cgathiru@nse.co.ke>
DEST permet d'indiquer le répertoire où seront stockés les rapports
Il me reste plus qu'à le rajouter dans une crontab (de root)
# crontab -e
50 23 * * * /opt/mail/check-spam.sh
il faut s'assurer que le check-spam.sh est bien executable
Coté Serveur Web
La mainpage
Comme nous avons un fichier généré par jour, il est inconcevable de devoir regénérer tous les jours la page pour ajouter le fichier, utilisons le php pour le faire à notre place ;)
Voici un extrait de la mainpage (index.php)
<h2>Rapports journaliers de mon site g</h2>
<ul>
<?php
$handle=opendir('reports');
rewinddir();
$i = 0;
while ($file = readdir($handle))
{
if ($file != "." && $file != "..")
{
next;
}
if (is_dir($file) == false)
{
$file2=basename($file, '.log');
$table[] = $file2;
}
}
closedir($handle);
sort($table);
foreach ($table as $file)
{
if (preg_match('/^(\d{4})(\d{2})(\d{2})$/', $file, $result))
{
$day = $result[3];
$month = $result[2];
$year = $result[1];
$date_string = "$day/$month/$year";
}
echo "<li><a href=\"spam$file.php\">Tentatives du ".$date_string."</a></li>\n";
}
?>
</ul>
Ensuite, nous devons générer le rapport : (spam.php)
<?php
$file_date = $_GET['date'];
if (preg_match('/^(\d{4})(\d{2})(\d{2})$/', $file_date, $result))
{
$day = $result[3];
$month = $result[2];
$year = $result[1];
$file = $result[0];
$date_string = "$day/$month/$year";
$path = '';
}
?>
<html>
<head>
<-- les entêtes -->
<?php
echo "<title>Tentatives de spam le $date_string </title>";
?>
</head>
<body>
<h1>Rapport de tentatives de spams sur mes serveurs le <?php echo "$date_string"; ?></h1>
<a href="/">Revenir à la liste des rapports</a><br /><br />
<table>
<tr>
<th>Heure</th>
<th>Nom de Domaine</th>
<th>Adresse IP</th>
<th>Adresse E-mail spoofée</th>
</tr>
<?php
$fichier="$_SERVER[DOCUMENT_ROOT]/reports$path/$file.log";
$tabfich=file($fichier);
for( $i = 0 ; $i < count($tabfich) ; $i++ )
{
if (preg_match('/(.+)-(.+)\s{1}(.+)\[(.+)\]:\s*from=\<(.+)\>$/', $tabfich[$i], $result))
{
if ( ereg("exemple\.com$",$result[5], $coin))
{
$result[5] = "fuckU@attack.j2c-s2c.com"; // funny mail
}
echo " <tr>\n";
echo " <td align='right'>$result[2]</td>\n";
echo " <td>$result[3]</td>\n";
echo " <td align='right'>$result[4]</td>\n";
echo " <td align='center'><a href=\"mailto:$result[5]\">$result[5]</a></td>\n";
echo " </tr>\n";
}
}
?>
</table>
</body>
</html>
Si on veut afficher la liste des fichiers du plus récent au plus ancien, il faut remplacer "sort" par "rsort".
Config d'APACHE
Une fois ceci terminé, il ne nous reste plus qu'à configurer apache avec le mod-rewrite
Dans le virtualhost responsable de la gestion de ses pages, il suffit de rajouter ces lignes.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} /spam(\d{8}).php
RewriteRule (.*) /spam.php?date=%1 [L]
Il ne vous reste plus qu'à redémarrer le serveur apache
apache2ctl restart
Il y a 2 commentaires.
Afficher les commentaires
-
Ajouter un commentaire
.: Dernière mise à jour le 12/10/2010.
Uptime :