On connaît les milters et autres méthodes pour effectuer des vérifications toujours plus en amont de la transaction SMTP pour la messagerie, ceci afin de lutter encore plus efficacement le SPAM. Bien souvent, cela reste assez fastidieux à mettre en oeuvre et rajoute une complexité supplémentaire au MTA, le serveur de messagerie final ne devrait être là que pour délivrer les (vrais) mails, et non de s’occuper à 100 % de la sécurité.
qpsmtpd est un serveur SMTP très léger et très modulaire qui se base sur le principe des plugins et des hooks qu’il peut appeller à chaque instant du protocole SMTP : mail from, rcpt to, data, ... Le principe est de lancer qpsmtpd à l’écoute du port SMTP (25), charge à lui ensuite de faire les vérifications d’usage (beaucoup de plugins sont livrés dans le produit de base pour ce type d’opérations) pour ensuite relayer au serveur de messagerie qui écoutera sur un autre port (2525) par exemple. En gros qpsmtpd joue le rôle de firewall ou de frontal mail avant d’entrer dans l’infrastructure de la messagerie interne.
L’avantage de cette technique est de pouvoir développer un plugin maison, avec des hooks à appeler selon ses besoins : on peut introduire des règles métiers sur les mails : vérification de l’existence du compte, vérification de l’expéditeur selon des règles qui nous sont propres, etc…et de couper la transaction SMTP avant même de recevoir le message : gain de temps et de ressources pour le serveur MTA en bout de chaîne.
mail -> qpsmtpd (25) -> smtp (2525) -> délivre
Des plugins Postfix, Exim, Qmail…et un transfert simple smtp est aussi prévu (pour Sendmail notamment).
Il faut connaître Perl, mais les plugins sont simples à développer. Un exemple qui vérifie que le “to” existe bien (pour la démo, mais on pourra penser à une consultation LDAP, base de données, ...) :
use Qpsmtpd::DSN;
sub hook_rcpt {
my ($self, $transaction, $recipient) = @_;
#my @badrcptto = $self->qp->config("badrcptto") or return (DECLINED);
return (DECLINED) unless $recipient->host & $recipient->user;
my $host = lc $recipient->host;
my $from = lc($recipient->user) . '@' . $host;
return Qpsmtpd::DSN->no_such_user("mail to $from not accepted here") if $recipient->user ne 'newsland';
return (DECLINED);
}
A découvrir en tout cas pour rajouter une brique de sécurité à votre plateforme.
Une présentation du produit.