Mettre en place du greylisting
Par Romino le lundi 12 mars 2007, 18:07 - Serveurs - Debian / Plesk - Lien permanent
Comment se prémunir éfficacement du spam à moindre frais sur une distribution Debian avec le panel Plesk? Mettre en place une solution de greylisting !
Avant tout, un très bon lien pour ceux qui ont le courage de tout lire ...: http://forum.swsoft.com/showthread.php?s=&threadid=28645
Passons à l'installation:
Les prérequis:
doivent déjà être installés sur votre serveur:
- mysqldevel , que l'on rempalcera sur une debian par libmysqlclient10-dev
- openssl-devel
- make
- gcc
Pour cela, on utilise la fonction apt-get, et cela se fait tout seul:
apt-get install libmysqlclient10-dev apt-get install openssl-devel apt-get install make apt-get install gcc
1ère étape: récupérer les fichiers:
Pour cela, on va aller les récupérer sur le site de Mr Meshier qui a eu la bonne idée de compiler tout cela:
cd /tmp wget http://meshier.com/wp-content/uploads/2006/09/qmail-103-greylist-psa8.tar.gz tar -xzf qmail-103-greylist-psa8.tar.gz
on se positionne dans le répertoire, et on peut alors passer à la deuxième étape.
2ème étape: modification des fichiers
Dans le fichier Makefile, il va falloir modifier 2 lignes: Modifier
/usr/lib/mysql/libmysqlclient.a
en
/usr/lib/libmysqlclient.a
et cela donc à deux reprises
editer le fichier local.scan.c et adapter les lignes ci-dessous à vos besoins:
#define MYSQLHOST "localhost" #define MYSQLUSER "greylist" #define MYSQLPASS "password" #define MYSQLDB "qmail" #define BLOCK_EXPIRE 4 /* minutes until email is accepted */ #define RECORD_EXPIRE 1500 /* minutes until record expires */ #define RECORD_EXPIRE_GOOD 36 /* days until record expires after accepting email */
En ce qui me concerne, je met 9 pour BLOCK_EXPIRE et 15 pour EXPIRE_GOOD, ce qui rend le filtre assez agressif, mais c'est un choix perso.
3ème étape: création de la base sql
Il faut maintenant créer la base sql permettant de gérer tout ce monde. Les puristes préfèreront la créer via ssh, mais il semble que Plesk complique la donne dans certains cas.
Ce qu'il faut faire:
- Créer une base ayant le même non que ce que vous avez indiqué dans MYSQLDB
- Créer un utilisateur ayant le même nom que ce que vous avez précisé dans MYSQLUSER et avec le même mot de passe que MUYSQLPASS
- Créer une table selon le schéma ci-dessous:
--
-- Table structure for table `relaytofrom`
--
CREATE TABLE relaytofrom (
id bigint(20) NOT NULL auto_increment,
relay_ip varchar(16) default NULL,
mail_from varchar(255) default NULL,
rcpt_to varchar(255) default NULL,
block_expires datetime NOT NULL default '0000-00-00 00:00:00',
record_expires datetime NOT NULL default '0000-00-00 00:00:00',
blocked_count bigint(20) NOT NULL default '0',
passed_count bigint(20) NOT NULL default '0',
aborted_count bigint(20) NOT NULL default '0',
origin_type enum('MANUAL','AUTO') NOT NULL default 'MANUAL',
create_time datetime NOT NULL default '0000-00-00 00:00:00',
last_update timestamp(14) NOT NULL,
PRIMARY KEY (id),
KEY relay_ip (relay_ip),
KEY mail_from (mail_from(20)),
KEY rcpt_to (rcpt_to(20))
) TYPE=MyISAM;
Pour ceux qui veulent créer la base en ssh:
mysql -u root -p CREATE DATABASE qmail; GRANT ALL ON qmail.* TO 'greylist'@'localhost' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
A adapter en fonction de vos choix de noms d'utilisateur, base, ...
4ème étape: installation des fichiers
Il faut maintenant installer les fichiers sur le serveur, et surtout les compiler.
make
Cela doit vous faire dérouler une longue liste ... suffit d'être patient !
/etc/init.d/qmail stop cp qmail-envelope-scanner /var/qmail/bin/. cp -f qmail-smtpd /var/qmail/bin/. chown root.qmail /var/qmail/bin/qmail-envelope-scanner chown root.qmail /var/qmail/bin/qmail-smtpd /etc/init.d/qmail start
En principe, tout est désormais prêt.
5ème étape: création d'une tâche cron
On va créer un fichier qui va faire la purge de la base et du fichier tempon.
nano /etc/cron.daily/greylist
on y colle le code suivant, en adaptant certaines lignes à votre installation (on en le répètera jamais assez ...)
#!/usr/bin/perl
use strict;
use warnings;
use constant DBD => 'DBI:mysql:qmail:localhost:3306';
use constant DBUSER => 'milter';
use constant DBPASS => 'greylist';
use DBI;
system ("cat /dev/null > /tmp/greylist_dbg.txt");
my $dbh = DBI->connect(DBD,DBUSER,DBPASS) or die "can't connect to db ", $DBI::errstr, ":$!";
$dbh->do("DELETE FROM relaytofrom WHERE record_expires < NOW() - INTERVAL 1 HOUR AND origin_type = 'AUTO'");
$dbh->do(”OPTIMIZE TABLE relaytofrom”);
$dbh->disconnect;
exit;
---
6ème étape: le test !!
Maintenant, reste à tester le tout:
- envoyer un mail sur votre serveur depuis un compte externe (genre hotmail, gmail ou autre, mais qui ne soit pas hébergé par votre serveur)
- taper dans la console ssh:
tail -f /tmp/greylist_dbg.txt
Vous devez voir une ou deux lignes de texte.
- dernière vérif: aller dans la base de données et vérifier qu'une ligne a bien été créée avec votre adresse mail externe.
Si tout fonctionne, le mail n'arrivera pas immédiatement sur votre serveur, mais après un délai au moins égal au temps indiqué dans le champ BLOCK_EXPIRE
Dans le cas contraire:
- Vérifier que votre utilisateur de la bdd a suffisamment de droits
- Reprendre la procédure et vérifier qu'aun point ne bloque.
Commentaires
Salut,
Merci pour ce tuto qui s'annonce réjouissant. Pile ce que je cherchais
Mais avant de passer à table, une petite question. Est-ce qu'il y a des
restrictions au niveau des versions, à savoir, quelle version pour qmail et
pour plesk ? J'ai actuellement un Plesk 8.3.0 sous Debian Etch, et je ne
voudrai pas m'aventurer à tenter ce tuto s'il y a des restrictions au niveau
des versions. Merci de ta réponse. @++
Très bonne question ...
j'ai essayé ce tuto sur plusieurs versions de plesk sans souci, mais toujours sous Debian Sarge 3.1, donc pas plus de précisions .... Désolé
apt-get install libmysqlclient10-dev
apt-get install openssl-devel
ça fonctionne sous Sarge, mais tout ça c'est obsolète sous etch.....