Skip to content


Filtres antispam et antivirus pour postfix : Postgrey, Procmailrc+Spamassassin et Clamav

Introduction :

Après avoir installé Postfix avec saslauth, cela n'empêchera pas de recevoir des mails plus ou moins non sollicités...

Pour cela nous allons filtrer les spams avec spamassassin et les virus avec clamav.

Installation de Procmail, Spamassassin et Clamav :

Il y a un problème avec clamav. Il faut ajouter l'entrée source dans /etc/apt/sources.list :

deb ftp://ftp.proxad.net/mirrors/volatile.debian.net/ etch/volatile main contrib non-free

# apt-get update
# apt-get upgrade
# apt-get install procmail clamav clamav-base clamav-daemon clamav-freshclam clamav-testfiles

Configuration de Spamassassin et Procmailrc :

Modifions le fichier /etc/spamassassin/local.cf

# cp /etc/spamassassin/local.cf /etc/spamassassin/local.cf.bak

nano /etc/spamassassin/local.cf

# ré écriture du sujet
rewrite_header Subject *****SPAM*****
# rapport léger du score du mail
report_safe 1
# classe le mail lorsque le score est au-dessus de 8.0
required_score 8.0
# utilise les filtres bayesiens
use_bayes 1
# affine son classement
bayes_auto_learn 1

Modifions le fichier /etc/procmailrc :

DROPPRIVS=yes
# filtre antispam
:0fw
| /usr/bin/spamc

Redémarrons le démon de spamassassin :

# /etc/init.d/spamassassin restart

Configuration de Clamav et Procmailrc :

Le fichier par défaut de clamav : /etc/clamav/clamd.conf

LocalSocket /var/run/clamav/clamd.ctl
FixStaleSocket true
User clamav
AllowSupplementaryGroups true
ScanMail true
ScanArchive true
ArchiveLimitMemoryUsage false
ArchiveBlockEncrypted false
MaxDirectoryRecursion 15
FollowDirectorySymlinks false
FollowFileSymlinks false
ReadTimeout 180
MaxThreads 12
MaxConnectionQueueLength 15
StreamMaxLength 10M
LogSyslog false
LogFacility LOG_LOCAL6
LogClean false
LogVerbose false
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /var/lib/clamav
TemporaryDirectory /tmp
SelfCheck 3600
Foreground false
Debug false
ScanPE true
ScanOLE2 true
ScanHTML true
DetectBrokenExecutables false
MailFollowURLs false
ExitOnOOM false
LeaveTemporaryFiles false
AlgorithmicDetection true
ScanELF true
IdleTimeout 30
PhishingSignatures true
PhishingScanURLs true
PhishingAlwaysBlockSSLMismatch false
PhishingAlwaysBlockCloak false
DetectPUA false
ScanPartialMessages false
HeuristicScanPrecedence false
StructuredDataDetection false
LogFile /var/log/clamav/clamav.log
LogTime true
LogFileUnlock false
LogFileMaxSize 0

Modifions le fichier /etc/procmailrc :

# filtre antivirus
:0fw
| /usr/bin/clamfilter.pl

Nous devons créer le script perl /usr/bin/clamfilter.pl

#!/usr/bin/perl -w
#
# ClamFilter 1.0
# by Matt Hahnfeld (http://www.everysoft.com/)
# Requires perl, clamscan, procmail, and this script.
#
# Add these lines to your .procmailrc:
#
# :0fw
# | /usr/local/bin/clamfilter.pl
# 
# This script is public domain.
#

use strict;
use File::Temp 'tempfile';

&main();
exit 0;

sub main {
  # Set up a temporary file for the original message
  my ($tmpfh, $tmpfn) = tempfile( UNLINK => 1 );
  -w $tmpfn or die 'Could not open temp file!';

  # Pass 1: Write out the temporary file
  while (<STDIN>) {
    print $tmpfh $_;
  }
  seek($tmpfh, 0, 0);

  # Pass 2: Scan the message
  open CLAMSCAN, "/bin/cat $tmpfn | /usr/bin/clamscan --stdout --recursive --mbox - 2>/dev/null |" or die 'Could not open clamscan!';
  my $clamstatus = qq|X-Virus-Found: yes
X-Virus-Status:
 ------------------------------------------------------------
 Virus Scan Status:
 ------------------------------------------------------------
|;
  while (<CLAMSCAN>) {
    $clamstatus .= ' ' . $_;
  }
  close CLAMSCAN;
  $clamstatus .= qq| 
 ------------------------------------------------------------

|;

  # Pass 3: Print out the message
  my $bodyflag = 0;
  while (<$tmpfh>) {
    if (! $bodyflag and $_ eq "\n") {
      if ($?) {
	print $clamstatus;
      }
      else {
	print "\n";
      }
      $bodyflag = 1;
    }
    else {
      print;
    }
  }
}

Redémarrons clamav :

# /etc/init.d/clamav-daemon restart

Il faut maintenant que postfix soit informé de l'utilisation de procmailrc.

Nous allons donc modifier /etc/postfix/main.cf

En réalité il n'y a vraiment rien à modifier, juste une ligne à ajouter !

mailbox_command = /usr/bin/procmail -t -a "$EXTENSION"

Ce qui revient à avoir comme main.cf :

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no


# appending .domain is the MUA's job.
append_dot_mydomain = no


# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h


# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache


# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.


myhostname = localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = dom-sln.local, localhost, localhost.localdomain, localhost
relayhost = 
mynetworks = 127.0.0.0/8, 10.1.1.0/24, 10.3.1.0/24, 10.1.1.254
mailbox_command = /usr/bin/procmail -t -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all


# sasl
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination 
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
broken_sasl_auth_clients = yes

Nous redémarrons postfix :

# /etc/init.d/postfix restart

Bon résumons, nous avons un serveur de mail SMTP qui identifie vos usagers pour les autoriser à l'envoi. Nous classons les mails en SPAM si le score dépasse un certain taux. Nous analysons le corps du mail pour savoir si il y a un virus contenu dedans.

Il nous manque la ré écriture du sujet si le mail contient un virus. Pour cela nous modifions denouveau /etc/procmailrc.

Lors de l'analyse par clamfilter.pl, un champ est ajouté si il y a virus : X-Virus-Found: yes

Nous allons donc ré écrire le sujet si il y a X-Virus-Found: yes.

LOGFILE=/var/log/procmail
VERBOSE=yes
DROPPRIVS=yes

# filtre antispam
:0fw
| /usr/bin/spamc -p 783

# filtre antivirus
:0fw
#| /usr/bin/clamscan
| /usr/bin/clamfilter.pl

# ré écriture du sujet du mail
:0fw
* ^X-Virus-Found: yes
| formail -I "Subject: {* !!! Attention VIRUS contenu dans ce courriel !!! *} $MATCH"

Installation de Postgrey :

La touche finale qui fera baisser le nombre de spams par dix est le greylisting.

Fonctionnement :

Pour chaque courriel reçu on crée un triplet identifié par l’adresse IP du serveur émetteur, l’adresse courriel de l’expéditeur et l’adresse courriel du destinataire.

Si le triplet apparaît pour la première fois, le serveur de messagerie renvoie un code 4xx (refus temporaire) au serveur SMTP distant. Si ce serveur est un véritable serveur SMTP, le courriel sera réexpédié ultérieurement.

Il y eut un temps où certaines questions légitimes étaient posées quand à l'évolution de serveurs SMTP des spammeurs, allaient-ils prendre en compte le greylisting ? Aujourd'hui nous constatons que non en grande partie.

Il y a aussi les désagréments dûs à certains serveurs SMTP ne respectant pas les RFC et/ou mal configurés qui engendrent la perte de certains mails.

Il est donc conseillé de prévoir une période de tests...

Nous allons donc installer postgrey et configurer postfix pour qu'il en tienne compte !

# apt-get install postgrey

démarrez ou re démarrez le service !

# /etc/init.d/postgrey restart

Dans le fichier /usr/share/doc/postgrey/README.Debian il est dit :

To use Postgrey, put something along the lines of
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:60000

in your /etc/postfix/main.cf (Postfix 2.1 or newer is required.)

Et bien faisons le !

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, check_policy_service inet:127.0.0.1:60000

Par défaut la période d'attente est de 600 secondes soit 10 minutes. Vous pouvez configurer ou changer cette valeur en modifiant le fichier /etc/default/postgrey :

POSTGREY_OPTS="--inet=127.0.0.1:60000"

en :

POSTGREY_OPTS="--inet=127.0.0.1:60000 --delay=300 --max-age=5"

Vous avez ainsi un serveur SMTP, qui limite le nombre de spams envoyés à vos utilisateurs.

- Fin -

Print Friendly, PDF & Email

Posted in Debian, Linux, Technique, Toutes. Tagged with , , , , .

5 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. tosor said

    c'est propre encore merci

  2. admin said

    😉

Continuing the Discussion

Some HTML is OK

(required)

(required, but never shared)

or, reply to this post via trackback.

Time limit is exhausted. Please reload CAPTCHA.


/* */
Creative Commons License
Cette création par Laurent Besson est mise à disposition selon les termes de la licence Creative Commons Paternité-Partage des Conditions Initiales à l'Identique 2.0 France.