Solution antispam perso
Comment gérer ses mails sur son propre serveur freebsd et ainsi pouvoir y accéder comme on veut, filtrer ses spam, passer un coup d'antivirus etc. C'est un sujet largement abordé partout, mais voila j'ai quand même envie de vous présenter ma solution.
Les technologies :
- OS : FreeBSD
- MTA : Postfix
- LDA : dovecot deliver
- serveur mail : dovecot
- filtrage : dovecot-sieve + fdm
- antispam : dspam
- antivirus : clamav
- SGBD : postgresql
- Complement : dovecot-antispam
- récupération des mail : fdm
Installation des différents composants
installation de postfix
#make -C /usr/ports/mail/postfix config
Dans mon cas j'ai choisit les options suivantes :
- SASL2
- DOVECOT
- TLS
puis :
#make -C /usr/ports/mail/postfix install clean
Accepter l'activation de postfix dans mailer.conf pour que postfix soit le mta par défaut en lieu et place du sendmail embarqué par défaut dans FreeBSD
installation de dovecot
#make -C /usr/ports/mail/dovecot config
J'ai choisit les options suivantes :
- KQUEUE
- SSL
- POP3
- LDA
puis :
#make -C /usr/ports/mail/dovecot install clean
installation de dovecot-sieve
#make -C /usr/ports/mail/dovecot-sieve install clean
Installation de postgresql
#make -C /usr/ports/databases/postgresql82-server config
J'ai choisit les options suivantes :
- NLS
- PAM
- OPTIMIZED_CFLAGS
puis :
#make -C /usr/ports/databases/postgresql82-server install clean
Installation de clamav
#make -C /usr/ports/security/clamav config
Je n'ai personnellement mis aucunes options.
#make -C /usr/ports/security/clamav install clean
installation de dspam
#make -C /usr/ports/mail/dspam config
J'ai choisit les options suivantes :
- SYSLOG
- DAEMON
- CLAMAV
- CLAMAV_LOCAL
- POSTGRESQL
- POSTGRESQL_LOCAL
- LONG_USERNAMES
- CGI
- LIGHTTPD
CGI et LIGHTTPD serveur a l'utilisation de l'interface web que je ne décrirais pas dans ce post.
#make -C /usr/ports/mail/dspam install clean
Installation de dovecot-antispam
#make -C /usr/ports/mail/dovecot-antispam config
J'ai choisit les options suivantes :
- DSPAM
puis :
#make -C /usr/ports/mail/dovecot-antispam install clean
Installation de fdm
#make -C /usr/ports/mail/fdm install clean
Configuration des différents composants
Configuration de postfix
Relay des mails en fonction du sender
Ici nous allons dire à postfix de relayer les mails en fonction de l'adresse mail du sender de manière a envoyer les mails gmail via le smtp de gmail, free via le smtp de free et ainsi de suite, bien entendu d'effectuer l'authentification si nécessaire Dans le main.cf rajouter ceci
sender_dependent_relayhost_maps = hash:/usr/local/etc/postfix/sender_relay
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/smtp_passwords
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sender_dependent_authentication = yes
smtp_tls_per_site = hash:/usr/local/etc/postfix/tls_per_site
Il faut donc créer /usr/local/etc/postfix/sender_relay dans lequel on retrouve la liste des serveur smtp vers lesquels relayé les mails envoyé depuis une adresse donnée :
user@free.fr smtp.free.fr
user@gmail.com smtp.gmail.com:587
...
Une fois le fichier renseigné :
#postmap /usr/local/etc/postfix/sender_relay
ensuite il faut créer le fichier suivant : /usr/local/etc/postfix/smtp_passwords qui va servir à l'authentification sur les serveur smtp décrit dans le fichier précédent
user@free.fr user:password
user@gmail.com user:password
de même
#postmap /usr/local/etc/postfix/smtp_passwords
Pour finir le fichier suivant doit aussi être créé : /usr/local/etc/postfix/tlspersite, il va servir à définir si le serveur nécessite l'utilisation du TLS. Seul les serveurs smtps doivent être listés dedans :
smtp.gmail.com MAY
et toujours
#postmap /usr/local/etc/postfix/smtp_passwords
Activation du relay lmtp vers dspam
Il existe plusieurs méthode pour relayé les mails reçu par postfix à dspam, mais le ltmp me semble la plus simple. Pour l'activer il suffit simplement de rajouter
mailbox_transport = lmtp:unix:/var/run/dspam.sock
Dans main.cf
Voila maintenant le MTA est configurer.
Je vous laisse le soin de configurer selon les méthode habituelle le reste des options de postfix : authentification, tls, etc.
Configuration de dspam
Préparation de la base PostgreSQL :
ici tout ce fait en user pgsql
#su - pgsql
création de la base dspam :
#createdb dspam
Il faut que la base support le language plpgsql donc :
#createlang plpgsql dspam
Ensuite il faut créé le contenu de la base dspam en utilisant le fichier /usr/local/share/examples/dspam/pgsql/pgsql_objects.sql Attention ce fichier m'a posé un problème : ligne 58 il faut ajouter */ à la fin puis
#psql dspam < /usr/local/share/examples/dspam/pgsql/pgsql_objects.sql
création de l'utilisateur dspam (sans mot de passe puisque la base n'est pas accessible depuis l'extérieur
#createuser --no-adduser --no-createdb dspam
enfin attribution des droits à l'utilisateur dspam
#psql dspam <<EOF
GRANT SELECT,INSERT,UPDATE,DELETE ON
dspam_preferences,
dspam_signature_data,
dspam_stats,
dspam_token_data
TO dspam;
EOF
Configuration de clamav
Editer le fichier de configuration du daemon clamav /usr/local/etc/clamd.conf qui est très clair et positionner les options qui vous intéressent.
Ajouter le rafraîchissement de la base de donnée clamav à dans la crontab de root :
#crontab -e
rajouter la ligne suivante :
0 0 * * 0 /usr/local/bin/freshclam --quiet
Configuration de dspam.conf
Dans le fichier /usr/local/etc/dspam.conf rajouter le chargement du driver postgresql et la configuration du serveur postgresql
StorageDriver /usr/local/lib/libpgsql_drv.so
PgSQLServer 127.0.0.1
PgSQLPort 5432
PgSQLUser dspam
#PgSQLPass dspam
PgSQLDb dspam
Pas besoin du mot de passe puisque nous n'en avons pas mis pour l'utilisateur dspam
Configurer le LDA (celui de dovecot) pour la distribution des tous les mails reçu par dspam, que ce soient des spam ou pas :
TrustedDeliveryAgent "/usr/local/libexec/dovecot/deliver -d bapt"
UnTrustedDeliveryAgent "/usr/local/libexec/dovecot/deliver -d bapt"
je précise -d bapt car je n'ai qu'un seul utilisateur et que je souhaite que l'intégralité de mail qui passe par dspam soit délivré à cette utilisateur, quelque soit le destinataire. pour être plus générique, ce rapporter à la doc dspam.
Rajouter votre utilisateur en tant que utilisateur de confiance (pouvant utiliser le binaire dspam) afin que le plugin dovecot-antispam fonctionne correctement :
Trust bapt
Le plugin dovecot antispam peut fonctionner de deux manière : par l'utilisation du binaire dspam --client ou par l'envoie d'un mail à dspam, dans le second cas, il n'est pas nécessaire de rajouter l'utilisateur système.
Passer le mode d'entraînement de dspam à TEFT :
TrainingMode teft
Je n'aime pas avoir le mot SPAM qui apparaît dans le sujet du mail, je préfère que que ce soit dans les headers, donc :
Preference "signatureLocation=headers"
Preference "showFactors=on"
Preference "spamAction=deliver"
#Preference "spamSubject=SPAM"
Configurer l'utilisation de clamav :
ClamAVPort 3310
ClamAVHost 127.0.0.1
ClamAVResponse accept
passer en mode serveur automatique pour que le daemon choisisse le mode le plus approprié en fonction des appels qui lui sont fait :
ServerMode auto
Configurer les paramètre du serveur, cad les options qui aurait été passé au client en ligne de commande si on avait utilisé ce biais là plutôt que de passer par le LMTP
ServerParameters "--deliver=innocent --user bapt -d %u"
Encore une fois je force le user bapt pour que tous les mails rentrant soit traité comme étant pour le user bapt et non que le nom de l'utilisateur soit autodéterminé. Pour être plus générique, se référer à la doc dspam.
la socket serveur ainsi que la socket client (qui sont la même dans notre cas):
ServerDomainSocketPath "/var/run/dspam.sock"
ClientHost /var/run/dspam.sock
Attention le chemin "/var/run/dspam.sock doit être identique au chemin que nous avons donné à postfix précédemment.
voila dspam est maintenant configurer.
Configuration de dovecot
Activation les protocoles IMAP et IMAPS : Dans /usr/local/etc/dovecot.conf, ajouter :
protocols = imap imaps
On désactive l'authentification plaintext pour tout ce qui n'est pas localhost :
disable_plaintext_auth = yes
On active le SSL :
ssl_disable = no
ssl_cert_file = /etc/ssl/dovecot-key.pem
ssl_key_file = /etc/ssl/dovecot-key.pem
On définit l'emplacement du maildir :
default_mail_env = maildir:%h/.maildir
On active le plugin antispam dans la section imap :
protocol imap {
...
mail_plugins = antispam
mail_plugin_dir = /usr/local/lib/dovecot/imap
...
}
On active dovecot-sieve dans la section lda
protocol lda {
...
mail_plugins = cmusieve
mail_plugin_dir = /usr/local/lib/dovecot/lda
...
}
On configure le plugin antispam
plugin {
...
antispam_spam = spam
antispam_dspam_binary = /usr/local/bin/dspam
antispam_dspam_args = --user;%u
...
}
Ainsi quand un mail est placé dans le dossier spam dspam l'apprend comme étant un spam et inversement si le mail en déplacé du dossier spam vers un autre, dspam l'apprend comme ham.
Finition en tant qu'utilisateur
Configuration de fdm
Rappatriement des mails
Dans le fichier $HOME/.fdm.conf :
set unmatched-mail keep
action "monsmtp" smtp server "localhost" to "bapt"
account "free" pop3 server "pop.free.fr" user "user" pass "passwd"
account "gmail" imaps server "imap.gmail.com" user "user" pass "passwd" folder "INBOX" # ou account "gmail" pop3s server "imap.gmail.com" user "user" pass "passwd"
match accounts {"free" "gmail"} action "monsmtp"
Nettoyage des spam vieux de plus de 1 jours et idem pour la corbeille
Dans le fichier $HOME/.fdm.conf
account "spam" maildir "%h/.maildir/.spam"
account "Trash" maildir "%h/.maildir/.Trash"
match accounts {"spam" "Trash"} and age > 1 days action drop
(J'utilise la même méthode pour nettoyer les dossiers correspondant aux mailing lists mais je conserver les mails 7 jours) A partir de dovecot 1.1 cette méthode ne sera plus nécessaire car dovecot inclue un nouveau plugin permettant l'expiration des mails. fdm est capable de faire beaucoup plus mais dans notre cas, tout le reste du filtrage est effectué par dovecot-sieve
Configuration de sieve pour trier les spam
dans le fichier $HOME/.dovecot.sieve
require "fileinto";
...
if header :contains "X-DSPAM-Result" "Spam" {
fileinto "spam";
stop;
}
...
Il est possible de faire du filtrage très fin de mail via sieve, internet regorge de documentation là dessus.
Démarrer le tout
Rajouter dans /etc/rc.conf :
postfix_enable="YES"
dovecot_enable="YES"
postgresql_enable="YES"
clamav_clamd_enable="YES"
dspam_enable="YES"
postgresql_flags="-w -s -m fast"
postgresql_initdb_flags="--encoding=utf-8 --lc-collate=C"
postgresql_class="default"
puis
#/usr/local/etc/rc.d/postfix start
#/usr/local/etc/rc.d/dovecot start
#/usr/local/etc/rc.d/postgresql start
#/usr/local/etc/rc.d/clamav-clamd start
#/usr/local/etc/rc.d/dspam start
Attention postrgesql doit être démarrer pour la configuration du stockage de dspam sur postgresql
Il ne reste plus qu'à activer le rapatriement automatique des mails. Dans la crontab de l'utilisateur :
*/5 * * * * /usr/local/bin/fdm -l fetch
On ajoute enfin un nettoyage quotidien de dspam Dans la crontab de root :
0 0 * * 0 /usr/local/bin/dspam_clean
0 0 * * 0 psql -U dspam dspam < /usr/local/share/examples/dspam/pgsql/purge.sql > /dev/null
Il ne vous reste plus qu'à configurer vos MUA préférés pour l'utilisation de tout ça. pour moi mutt et horde/dimp (pour le web).


