Retrouvez cet article dans : Linux Magazine 100
Cher ami lecteur de GLMF, bienvenue. Nous allons parler un peu ensemble d’un sujet qui est assez universel sur l’internet magique, à savoir l’e-mail.
Comme tout le monde, tu as certainement commencé par avoir une adresse e-mail liée à ton fournisseur d’accès ou à ton école ou à ton entreprise. Or, tu t’es certainement dit, ami lecteur :
- « C’est bien ces jolies adresses pseudo@fai.fr ou p.nom@univ-paumee.fr, mais ça va durer combien de temps ? Lorsque je partirai de mon job/université/fai, je perdrai cette adresse » ou
- « Ouah bon, c’est tout moche ces adresses, moi je veux mon adresse prenom@nom.tld » ou encore
- « Bah tiens, je vais héberger le mail de mes potes, et j’aimerais bien avoir le mien aussi ».
Si tu t’es reconnu dans une de ces phrases, tu peux continuer la lecture. Ou alors tu peux aussi lire si les mails ça t’intéresse. Ou alors tu peux passer à l’article suivant.
Nous allons donc mettre en place une super plateforme pour gérer tous les aspects liés au mail. À la fin de cet article, tu auras, cher lecteur, une plate-forme mail qui fera... de la réception et de l’envoi de mails !
N’est-ce pas splendide ? Et là tu te dis « Ouaaaah, mais il se fout de nous là, c’est quoi ce... ?!!§§§!!! ».
Ce à quoi je répondrais : « Attends, attends, tu n’as pas tout vu ».
Nous allons donc saupoudrer notre daemon SMTP de :
- chiffrement avec l’utilisation de SSL ;
- redondance/scalabilité/souplesse avec l’utilisation d’un annuaire LDAP pour stocker les informations sur les comptes ;
- fonctionnalités conviviales :
- d’anti-spam ;
- d’anti-virus ;
- de gestionnaire de mailing-lists.
Nous allons détailler l’installation et la configuration des diverses briques logicielles afin qu’elles s’intègrent sans trop de difficultés dans la plate-forme.
Installation
On va prendre exemple sur FreeBSD. Ce choix est effectivement complètement et totalement arbitraire. Nous allons aussi installer depuis les ports les logiciels que nous allons utiliser pour monter cette plate-forme.
Logiciels utilisés
On va installer :
- Exim pour la partie SMTP ;
- OpenLDAP pour la partie annuaire LDAP ;
- Dovecot pour la partie POP/IMAP ;
- Apache pour le CGI Dspam (en conjonction avec
mod_auth_imap2) ; - Ecartis pour les mailing-lists ;
- ClamAV pour l’anti-virus ;
- Dspam pour l’anti-spam ;
- SpamAssassin pour l’anti-spam aussi ;
- MySQL pour stocker les préférences de Dspam.
En vrac, quelques justifications sur les choix effectués :
- Exim a été choisi, car il est souple, suffisamment rapide pour nos besoins (je ne parle pas d’installer une plate-forme mail d’ISP), pas trop compliqué à configurer et possède une documentation extrêmement complète ;
- Dovecot pour la partie POP/IMAP, car il est simple, rapide, puissant, très facile à configurer ;
- OpenLDAP, car c’est le standard des annuaires LDAP ;
- Apache, parce que j’ai la fl emme d’installer le CGI de Dspam avec un autre daemon HTTP (il suffit que le daemon sache faire du CGI) ;
- Ecartis, car c’est le seul avec lequel je me suis donné la peine de lire la documentation (et aussi parce qu’il est écrit en C, donc rapide, et très configurable) ;
- ClamAV, car c’est la seule solution anti-spam libre à ma connaissance ;
- Dspam, parce qu’il est écrit en C donc ultra-rapide, et parce qu’il est très performant ;
- SpamAssassin pour catcher certains spams que Dspam n’arrive pas à détecter.
Pour en finir avec le sujet des performances, si vous voulez quelque chose d’extrêmement performant, il vous suffira d’enlever de la configuration dont je vous parle les éléments suivants : SpamAssassin et le CGI Dspam. Ce sont ces logiciels qui sont les plus consommateurs de ressources dans notre cadre. Ceci dit, avec l’utilisation de tous les logiciels que j’ai cités,
les performances constatées sont honnêtes, traitant plusieurs mails par seconde sur un P4 2.6 GHz avec 512 Mo de RAM.
Préparation
Avant d’aller dans le portstree et d’installer les logiciels, nous allons ajouter ceci dans le /etc/make.conf :
USA_RESIDENT= no
NO_X=yes
WITHOUT_X11=yes
WITHOUT_JAVA=yes
WITH_OPENSSL_BASE=yes
# exim
.if ${.CURDIR}==»/usr/ports/mail/exim»
WITH_OPENLDAP=yes
#WITH_SA_EXIM=yes
.endif
# dovecot
.if ${.CURDIR}==»/usr/ports/mail/dovecot»
WITH_LDAP=yes
.endif
# apache 2.2
.if ${.CURDIR}==»/usr/ports/www/apache22»
WITH_MPM=worker
WITH_LDAP=yes
WITH_LDAP_MODULES=yes
WITH_MISC_MODULES=yes
WITH_AUTH_MODULES=yes
WITH_SSL_MODULES=yes
WITH_SUEXEC_MODULES=yes
SUEXEC_DOCROOT=/usr/local/www
SUEXEC_UIDMIN=100
SUEXEC_GIDMIN=100
.endif
# dspam
.if ${.CURDIR:M*/mail/dspam*}
DSPAM_GROUP=vmail
.endif
Nous allons également modifier plusieurs fichiers comme suit :
% cat /etc/mail/mailer.conf sendmail /usr/local/sbin/exim send-mail /usr/local/sbin/exim mailq /usr/local/sbin/exim -bp newaliases /usr/bin/true hoststat /usr/bin/true purgestat /usr/bin/true % grep sendmail /etc/rc.conf sendmail_enable=NONE
Dans /etc/syslog.conf :
[...] # Mail mail.info /var/log/mail/maillog # OpenLDAP local4.* /var/log/slapd.log # Dovecot local3.* /var/log/mail/dovecot.log # ClamAV local6.* /var/log/mail/clamd.log [...]
avec évidemment un mkdir /var/log/mail juste avant, et dans /etc/newsyslog.conf :
[...] /var/log/exim/mainlog mailnull:mail 640 7 * $W0D23 ZN /var/log/exim/rejectlog mailnull:mail 640 7 * $W0D23 ZN /var/log/mail/maillog 640 7 * $W0D23 C /var/log/mail/dovecot.log 640 7 * $W0D23 JC /var/log/mail/clamd.log clamav:wheel 640 7 * $W0D23 JC [...]
Nous allons enfin ajouter un utilisateur/groupe virtuel, sous lequel tous les mails seront délivrés et sous l’identité duquel Dovecot tournera pour servir les clients POP/IMAP.
% pw useradd -n vmail -u 999 -d /home/courier -m
Si, lors de l’installation des logiciels qui va suivre, de la configuration est demandée (via une interface curses), laissez les choix par défaut ([Tab], puis [Entrée]).
Exim :
% cd /usr/ports/mail/exim && make install clean
Dovecot :
% cd /usr/ports/mail/dovecot && make install clean
Dspam :
% cd /usr/ports/mail/dspam && make config install clean
Lors du make config, sélectionnez les options suivantes (et seulement celles-là) :
| |[X] SYSLOG Logs via syslog | | | |[X] DEBUG Enable debugging logging | | | |[X] PREF_EXT Preferences in database not in files | | | |[X] DAEMON Daemonize dspam; speaks LMTP or DLMTP | | | |[X] MYSQL50 Use MySQL 5.0.x as back-end | | | |[X] MYSQL_LOCAL RUN_DEPEND on selected MySQL server ver. | | | |[X] HASH Use hash driver | | | |[X] VIRT_USERS Enable virtual users (needs SQL back-end) | | | |[X] EXIM_LDA Use Exim as local delivery agent | | | |[X] CGI Install CGI (pulls in Apache or see below) | | | |[X] LONG_USERNAMES Usernames longer that OS supports | |
(Rappel : pour sélectionner/désélectionner : [Espace], pour se déplacer entre les choix : [Up/Down], pour aller sur : [OK/Cancel], [Tab].)
Cette commande installe Dspam et MySQL. Nous nous permettons de mentionner ici un point important. Notez scrupuleusement ce que le port MySQL vous conseille pour le changement du mot de passe root de MySQL.
SpamAssassin :
% cd /usr/ports/mail/p5-Mail-SpamAssassin && make install clean
Ecartis :
% cd /usr/ports/mail/ecartis && make install clean
Apache et mod_auth_imap2 :
% cd /usr/ports/www/mod_auth_imap2 && make install clean
Arborescence du filesystem
Les comptes mails seront installés dans /home/courier/domaine.tld/username. Ils bénéficient d’un UID/GID unique (999 dans les exemples suivants, attaché à un user/group vmail/vmail). On aurait pupeaufiner le système, afin de faire bénéficier chaque domaine d’un UID unique, mais, eh, je suis une loutre après tout.
Vous devez donc faire, en tant que root, mkdir -p /home/courier/domaine.tld/username pour chaque utilisateur que vous allez créer, puis chown -R vmail: vmail /home/courier/domaine.
Pour la création des certificats, je vous propose d’aller voir la documentation du wiki GCU :
http://wiki.gcu.info/doku.php?id=unix:openssl_et_ac.
Login des utilisateurs
Dans tout le document, à quelque endroit que cela soit, lorsque les utilisateurs auront besoin de se connecter (SMTP AUTH pour le relais des e-mails ou POP/IMAP), leur login sera username@domaine. tld, et le mot de passe associé.
Configuration des daemons
Nous allons ici configurer les différents serveurs qui composent notre plate-forme. Notre nom de domaine « principal » sera gcu-squad.org et nos domaines mails seront shinois.org et shinoise.org.
Configuration d’OpenLDAP
Pour la configuration d’OpenLDAP, nous allons tout d’abord modifier le fichier /usr/local/etc/openldap/slapd.conf. C’est lui qui contrôle le fonctionnement du serveur LDAP. Éditez ce fichier et ajoutez (ou décommentez).
# les schémas nécessaires au bon
# fonctionnement de notre architecture
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/openldap.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
loglevel shell
modulepath /usr/local/libexec/openldap
moduleload back_bdb
# ACL
access to *
by dn=»cn=mat,ou=admin,dc=gcu-squad,dc=org» write
by dn=»cn=reader,ou=admin,dc=gcu-squad,dc=org» read
by self write
by users read
by anonymous auth
# notre base de données principale
database bdb
suffix «dc=gcu-squad,dc=org»
rootdn «cn=Manager,dc=gcu-squad,dc=org»
# le mot de passe est ici “Manager”
rootpw {SSHA}npKN7KarjmyY88io0aw12H6yvel2l9Tc
directory /home/ldap/dc=gcu-squad,dc=org
index objectClass eq
Ce fichier doit être lisible par le daemon slapd et lui seul. Comme il tourne sous l’identité de l’utilisateur ldap, vous devez procéder comme suit :
% chown ldap:ldap /usr/local/etc\ /openldap/slapd.conf && chmod 600 \ /usr/local/etc/openldap/slapd.conf
Ensuite, créez le répertoire où seront stockés les fichiers BerkeleyDB.
% mkdir -p /home/ldap/dc=gcu-squad,dc=org % chown ldap:ldap /home/ldap/dc=gcu-squad,dc=org
Enfin, il faut ajouter les lignes qui vont bien dans /etc/rc.conf :
[...] slapd_enable=YES slapd_flags=’-h «ldapi:// %2fvar%2frun%2fopenldap%2fldapi/ ldaps:/// ldap://127.0.0.1/»’ slapd_sockets=»/var/run/openldap/ldapi» [...]
Avant de lancer le serveur LDAP, nous allons le peupler basiquement.
Création du schéma LDAP
Voici le init.ldif utilisé pour le peuplement initial.
dn: dc=gcu-squad,dc=org
objectClass: domain
dc: gcu-squad
dn: ou=admin,dc=gcu-squad,dc=org
ou: admin
objectClass: organizationalUnit
dn: ou=mail_domains,dc=gcu-squad,dc=org
ou: mail_domains
objectClass: organizationalUnit
dn: cn=mat,ou=admin,dc=gcu-squad,dc=org
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: mat
sn: mat
userPassword: {SSHA}Fz9i97UaxmS6OaP5G2vyFNromKmuqzpJ
dn: cn=reader,ou=admin,dc=gcu-squad,dc=org
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: reader
sn: reader
userPassword: {SSHA}GQmADeq7J6ufKZel5Px4gwxRBzGtelQw
Pour générer un mot de passe pour votre utilisateur, il suffit de lancer slappasswd sans argument.
NOTE :
Il faut faire attention à la syntaxe du fichier ldif. Il ne faut pas mettre d’espace à la fin des lignes, et il ne faut pas mettre d’espace avant les caractères «:».
Avec le serveur ldap non lancé, on tape slapadd -l init. ldif (en root), puis on chown -R ldap:ldap /home/ldap/dc=gcu-squad,dc=org, puis on lance le serveur LDAP : /usr/local/etc/rc.d/slapd start.
Peuplement du serveur LDAP
Nous allons maintenant regarder comment créer les « types de comptes » mail, à savoir des vrais comptes, des alias et des listes de diffusion basiques.
% cat > add.ldif <<EOF
# on crée d’abord le domaine pour
# lequel on veut gérer les mails dans le
# ldap.
dn: ou=shinois.org,ou=mail_domains,dc=gcu-squad,dc=org
ou: shinois.org
objectClass: organizationalUnit
objectClass: top
# cette entrée est un exemple
« d’entrée pour les alias
# le cn (sysaliases) est un
# nom arbitraire (mais unique)
# tous les mails envoyés à un quelconque
# mailLocalAddress@shinois.org
# seront reroutés vers bonjour@gmail.com
dn: cn=sysaliases,ou=shinois.org,ou=mail_domains,dc=gcu-squad,dc=org
objectClass: top
objectClass: person
objectClass: inetLocalMailRecipient
sn: sysaliases
cn: sysaliases
mailLocalAddress: root
mailLocalAddress: ftp
mailLocalAddress: ftpmaster
mailLocalAddress: postmaster
mailLocalAddress: hostmaster
mailLocalAddress: newsmaster
mailRoutingAddress: bonjour@gmail.com
# cette entrée est un exemple d’entrée
# pour les listes de diffusion
# basiques en écrivant à membres@shinois.org,
# les mails seront reroutés
# vers tous les rfc822MailMember
dn: cn=membres,ou=shinois.org,ou=mail_domains,dc=gcu-squad,dc=org
objectClass: top
objectClass: nisMailAlias
rfc822MailMember: membre1@orange.fr
rfc822MailMember: membre2@free.fr
rfc822MailMember: membre3@neuf.fr
rfc822MailMember: membre4@tele2.fr
cn: membres
# et enfin, ceci est une entrée
# pour un compte utilisateur
dn: uid=iouseur,ou=shinois.org,ou=mail_domains,dc=gcu-squad,dc=org
givenName: Prénom
mail: iouseur@shinois.org
uid: iouseur
sn: Nom
cn: Prénom Nom
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
objectClass: posixAccount
homeDirectory: /home/courier/shinois.org/iouseur
userPassword: {SSHA}kGW/7WHJRLfsCNZBMRJUzfgCGJZggRFI
gidNumber: 998
uidNumber: 998
EOF
Le mot de passe est à générer avec slappasswd. L’ajout de comptes se fait avec la commande ldapadd comme suit :
% ldapadd -h localhost -xvWD ‘cn=mat,ou=admin,dc=gcu-squad,dc=org’ -f add.ldif
Configuration d’Exim 4
Je vais maintenant vous montrer la configuration d’Exim. Dans ce fichier, il y a des parties qui traitent de l’utilisation de logiciels tiers, notamment pour l’anti-virus et l’anti-spam. Il faut donc se reporter aux paragraphes correspondants dans l’article.
Petit point juste en passant, n’oubliez pas d’activer le support d’Exim dans /etc/rc.conf.
% echo ‘exim_enable=»YES»’ >> /etc/rc.conf
Le fichier principal d’Exim est le fichier /usr/local/etc/exim/configure. Nous allons vous copier tout le fichier, en commençant par le début et en finissant par la fin (quoi de plus logique ?). Il sera entrecoupé de divers commentaires afin que vous compreniez ce que fait chaque morceau de configuration.
Mais tout d’abord, je vais vous parler du fichier de
configuration d’Exim, qui est découpé en plusieurs sections :
- la configuration principale, qui traite de réglages généraux, comme la liste des domaines à considérer comme locale, la liste des domaines à relayer, et diverses autres choses ;
- la configuration des ACL, avec plusieurs ACL appelées à divers moments du dialogue SMTP (vous verrez, dans l’exemple, c’est plus clair) ;
- la configuration des routers, qui indique sous quelles conditions le mail partira dans un transport (préfixe, suffixe de l’adresse mail ou appartenance aux domaines locaux de l’adresse mail, etc.) ;
- la configuration des transports, qui indique comment le mail sera traité (est-ce qu’on le délivre localement, est-ce qu’on l’envoie à un autre serveur SMTP, est ce qu’on le réinjecte dans Exim, etc.) ;
- la configuration des
retry(qu’on laissera par défaut) ; - la configuration des
rewrite(qu’on laissera aussi par défaut) ; - la configuration du SMTP AUTH.
.include /usr/local/etc/exim/exim.ldap ldap_default_servers = localhost
Ici, nous incluons le fichier suivant, afin de définir quelques informations pour LDAP.
% cat /usr/local/etc/exim/exim.ldap # des «variables» globales LDAPSERVER = 127.0.0.1 LDAPBASE = dc=gcu-squad,dc=org USER = cn=reader,ou=admin,dc=gcu-squad,dc=org PASS = reader %
Le USER ldap utilisé n’a besoin que des droits de lecture dans le DIT. C’est pour ça que nous utilisons le DN de reader et pas celui de mat.
Nous allons maintenant continuer le fichier /usr/local/etc/exim/configure.
domainlist local_domains = @ : \
@[] : \
localhost : \
${lookup ldap {user=USER pass=PASS ldap://LDAPSERVER/ou=mail_domains,
LDAPBASE?ou?sub?(ou=${domain})}{$value}{} }
domainlist relay_to_domains = @ : \
@[] : \
localhost : \
lsearch;/usr/local/etc/exim/relay-domains
hostlist relay_from_hosts = localhost : 192.168.100.0/24
Nous définissons ici quels sont les domaines que nous considérons locaux, avec la variable local_domains, et pour quels domaines destination nous acceptons de relayer les mails. Pour ce dernier, la liste des domaines est stockée dans un fichier de la forme suivante :
# ceci est un commentaire mad-prof.fr: squaresky.com:
Dans cet exemple, cela signifie que nous sommes MX secondaires pour les domaines mad-prof.fr et squaresky.com.
Revenons au fichier de configuration d’Exim.
tls_advertise_hosts = * tls_certificate = /etc/ssl/certs/exim.crt tls_privatekey = /etc/ssl/private/exim.key
Ici, nous indiquons à qui nous annonçons que nous acceptons l’extension STARTTLS de SMTP. Nous indiquons où est stockée la paire de clefs pour SSL.
# nous avons besoin des ACL pour l’anti # virus et l’anti spam basé sur RBL acl_smtp_connect = acl_check_host acl_smtp_mail = acl_check_from acl_smtp_rcpt = acl_check_rcpt acl_smtp_data = acl_check_data # pour ClamAV av_scanner = $acl_m0
Ici, sont définis les ACL pour les différents moments de la transaction SMTP. Par exemple, au moment de la connexion, Exim va vérifier que l’hôte qui se connecte remplit bien les conditions demandées par l’ACL acl_check_host. Juste après que la commande SMTP RCPT TO a été reçue par le serveur, c’est l’ACL acl_check_rcpt qui va être vérifiée.
exim_user = mailnull exim_group = mail never_users = root trusted_groups = wheel host_lookup = * rfc1413_hosts = * rfc1413_query_timeout = 5s ignore_bounce_errors_after = 2d timeout_frozen_after = 7d message_size_limit = 100M
Les noms des variables de configuration nous paraissant suffisamment clairs, nous passons à la section suivante, la configuration des ACL.
begin acl acl_check_host: deny hosts = *.kornet.net message = Go die spammer # then, accept accept acl_check_from: deny senders = *@*.em46464v1.net : *@*.cammander.com : *@*.em654654v2.net message = Go die spammer # then accept accept acl_check_rcpt: # il faut lister ici nos mx secondaires... accept hosts = : mx2.shinois.org : mx2.shinoise.org deny message = Restricted characters in address domains = +local_domains local_parts = ^[.] : ^.*[@%!/|] deny message = Restricted characters in address domains = !+local_domains local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./ # on accepte inconditionellement postmaster@local_domains accept local_parts = postmaster domains = +local_domains require verify = sender accept hosts = +relay_from_hosts control = submission # on accepte les gens qui auront passé le contrôle SMTP AUTH accept authenticated = * control = submission require message = relay not permitted domains = +local_domains : +relay_to_domains require verify = recipient # DNS RBL, il faut aimer... moi en tout cas j’aime bien ! deny message = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text dnslists = zen.spamhaus.org : xbl.spamhaus.org : dnsbl.njabl.org : bl.spamcop.net : cbl.abuseat.org accept acl_check_data: # on checke que le message ne contienne pas de virus (pas spécialement # nécéssaire pour l’instant si vous usagers sont sous UNIX deny message = This message contains a virus ($malware_name). set acl_m0 = clamd:/var/run/clamav/clamd malware = * accept
Là, ce sont des ACL au niveau SMTP, donc Exim va rejeter directement avec un code d’erreur définitif tous les gens qui ont un hôte se finissant par kornet.net ou dont l’adresse d’expéditeur (d’enveloppe bien sûr) est *@*.e546546546mv1.net ou *@*.cammander.com ou *@*.e65465465mv2.net ou dont l’hôte est présent dans une des RBL citées ci-dessous et, enfin, si leur mail contient un virus (vérifié par ClamAV). Les autres conditions de rejet sont des conditions déjà spécifiées dans la conf d’Exim, nous les recopions ici à titre d’exemple et afin d’avoir un fichier de configuration complet.
Nous allons maintenant nous occuper des routers. Comme l’indiquent les commentaires présents dans le fichier de configuration par défaut : « Order does matter », ce qui signifie que l’ordre des routers que nous allons utiliser est important.
begin routers dnslookup: driver = dnslookup domains = ! +local_domains transport = remote_smtp ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 no_more
Ici, nous définissons le début de la section routers.
Nous nous occupons ici de tous les mails non destinés à des domaines locaux (comme l’indique la condition domains = ! +local_domains). Nous spécifions que le transport à utiliser pour les mails matchant la condition est le transport nommé remote_smtp.
Comme vous pouvez vous en apercevoir, chaque router est défini par un nom arbitraire, suivi du caractère :.
dspam_error_spam_router: driver = accept domains = +local_domains local_part_suffix = -spam transport = dspam_error_spam_transport dspam_addspam_router: driver = accept domains = +local_domains local_part_prefix = spamtransport = dspam_error_spam_transport
Cette partie s‘occupe de classifier les faux négatifs (le spam n’étant pas marqué comme spam). Il y a deux routers afin que l’on puisse bouncer ou forwarder les mails à iouseur-spam@shinois.org ou à spamiouseur@shinois.org.
dspam_error_ham_router: driver = accept domains = +local_domains local_part_suffix = -ham : -nospam : -notspam transport = dspam_error_ham_transport dspam_falsepositive_router: driver = accept domains = +local_domains local_part_prefix = ham- : nospam- : notspamtransport = dspam_error_ham_transport
De la même manière, nous préparons ici deux routers qui permettent d’intercepter les faux positifs (les mails légitimes (le ham) qui ont été marqués comme spam).
Les mails sont à bouncer soit à ham-iouseur@shinois.org, soit à iouseur-ham@shinois.org.
ldap_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup ldap {user=USER pass=PASS
ldap://LDAPSERVER/ou=${domain},ou=mail_domains,LDAPBASE?mailRoutin
gAddress?sub?\
(&(objectClass=inetLocalMailRecipient)(mailLocalAddress=${quote_
ldap:$local_part}))}}
file_transport = address_file
pipe_transport = address_pipe
Nous allons ici nous occuper de développer les aliases définis dans l’annuaire LDAP.
ldap_lists:
driver = redirect
allow_fail
allow_defer
data = ${lookup ldap {user=USER pass=PASS
ldap://LDAPSERVER/ou=${domain},ou=mail_domains,LDAPBASE?rfc822MailMember?sub?\
(&(objectClass=nisMailAlias)(cn=${quote_ldap:$local_part}))}}
file_transport = address_file
pipe_transport = address_pipe
De la même manière, nous nous occupons ici des listes de diffusions définies dans le LDAP.
# pour spamassassin
sa_router:
driver = manualroute
no_verify
condition = «${if and { \
{!def:h_X-My-SA:} \
{!def:h_X-Spam-Flag:} \
{!eq {$received_protocol}{sa-checked}} \
{!eq {$received_protocol}{local}} \
{ <= {$message_size}{30M}} \
} {1}{0}}“
headers_add = „X-My-SA: scanned by $primary_hostname, $tod_full“
route_list = “* localhost byname”
transport = sa_spamcheck
# pour dspam
dspam_router:
driver = manualroute
no_verify
condition = «${if and { \
{!def:h_X-My-Dspam:} \
{!eq {$received_protocol}{local}} \
{!eq {$received_protocol}{ds-checked}} \
{ <= {$message_size}{30M}} \
}\
{1}{0}}»
headers_add = «X-My-Dspam: scanned by $primary_hostname, $tod_full»
route_list = «* localhost byname»
transport = dspam_spamcheck
Ces deux routers vont s’occuper de respectivement envoyer le mail entrant destiné à un utilisateur local (ou à une mailing-list) dans SpamAssassin, puis DSpam pour marquage. Le mail va faire comme trajet Exim -> SpamAssassin -> Exim -> DSpam -> Exim. À chaque fois, le mail passera d’un router à un autre, car, à chaque réinjection dans Exim, on tague le mail avec le protocole $received_protocol et on effectue également une vérification sur la présence des en-têtes X-My-SA et X-Spam-Flag (entre autres tests).
# stuff pour les mailing-lists ecartis: driver = accept domains = +local_domains local_parts = ecartis transport = ecartis_pipe mailing_list: driver = accept local_part_suffix = -request : -repost : -admins : -moderators : -bounce local_part_suffix_optional require_files = /usr/local/ecartis/domains/$domain/$local_part domains = +local_domains transport = ecartis_pipe
Ici, on s’occupe de gérer les mailing-lists évoluées, avec Ecartis. Le premier s’occupe de gérer l’interaction entre les mailing-lists et le(s) admin(s), et le deuxième s’occupe des mailings-lists en elles-mêmes (dont nous verrons plus tard comment elles sont implémentées sur le filesystem). Basiquement, le fichier /usr/local/ecartis/domains/ shinois.org/ma-super-liste doit exister pour que la liste de diffusion ma-super-liste@shinois.org soit considérée comme existante et que le mail soit transmis à ecartis_pipe.
# dernier des routers, attention,
# enlever ou remplacer la partie
# «localuser» qui s’occupe des comptes
# unix locaux, étant donné que l’on
# gère uniquement une plateforme de mails « virtuels ».
localuser:
driver = accept
condition = ${lookup ldap {user=USER pass=PASS \
ldap://LDAPSERVER/ou=${domain},ou=mail_
domains,LDAPBASE??sub? \
(mail=${local_part}@${domain})}{yes} {no} }
retry_use_local_part
transport = ldap_delivery
cannot_route_message = Unknown user
Le dernier des routers s’occupe (enfin !) de délivrer les mails dans les boîtes aux lettres des utilisateurs définis dans l’annuaire LDAP.
C’est maintenant le moment de s’occuper des transports !
begin transports # maintenant, on est dans les transports # nous rappelleons que l’ordre n’importe pas. address_pipe: driver = pipe return_output address_file: driver = appendfile delivery_date_add envelope_to_add return_path_add ecartis_pipe: driver = pipe return_output command = /usr/local/ecartis/run_ecartis.sh
Divers transports « génériques » pour gérer respectivement les envois dans des process externes (à travers donc un pipe), qui sont générés par les .forward, les alias et la gestion des mails destinés à Ecartis.
# spam stuff
sa_spamcheck:
driver = pipe
command = /usr/local/sbin/exim -oMr sa-checked -bS
use_bsmtp = true
transport_filter = /usr/local/bin/spamc
home_directory = «/tmp»
current_directory = «/tmp»
user = mailnull
group = mail
log_output = true
return_fail_output = true
return_path_add = false
message_prefix =
message_suffix =
dspam_spamcheck:
driver = pipe
command = /usr/local/sbin/exim -oMr ds-checked -bS
transport_filter = «/usr/local/bin/dspam --stdout --
deliver=innocent,spam --user ${lc:$local_part@$domain} «
use_bsmtp = true
user = mailnull
group = vmail
return_path_add = false
log_fail_output = true
log_defer_output = true
temp_errors = *
return_fail_output = true
home_directory = «/tmp»
current_directory = «/tmp»
message_prefix = “”
message_suffix = “”
Ici, nous avons les deux transports qui s’occupent de passer le mail à SpamAssassin et à DSpam, et qui ensuite renvoient eux-mêmes le mail sur leur sortie standard, qui est pipée à Exim qui s’occupe de le réinjecter dans le fl ux de mails locaux (ouf !).
Il y a diverses options de placées, la plus importante étant user et group, qui permettent de définir sous quelle identité est exécutée le process désigné par l’option command. Pour les autres options, je vous laisse regarder dans la documentation d’Exim, qui est très bien faite (oui, je me répète).
dspam_error_spam_transport:
driver = pipe
command = „/usr/local/bin/dspam --client --source=error --
class=spam --user ${lc:$local_part@$domain} -f ‚$sender_address‘
-oi -oMr despammed -- %u“
user = mailnull
group = vmail
log_output = true
return_fail_output = true
return_path_add = false
message_prefix =
message_suffix =
dspam_error_ham_transport:
driver = pipe
command = „/usr/local/bin/dspam --client --source=error --
class=innocent --user ${lc:$local_part@$domain} -f ‚$sender_
address‘ -oi -oMr despammed -- %u“
user = mailnull
group = vmail
log_output = true
return_fail_output = true
return_path_add = false
message_prefix =
message_suffix =
Ces deux transports permettent de traiter les FP et les FN (faux positifs et faux négatifs) de DSpam.
ldap_delivery: driver = appendfile check_string = «» create_directory delivery_date_add directory = /home/courier/$domain/$local_part/Maildir directory_mode = 0700 envelope_to_add user = vmail group = vmail maildir_format message_prefix = “” message_suffix = “” mode = 0660 no_mode_fail_narrower return_path_add
Enfin, ce transport délivre le mail dans le répertoire indiqué par l’option directory. On spécifie également l’UID sous lequel le mail est copié sur le système de fichiers.
On peut noter qu’Exim s’occupe de créer les répertoires manquants lors du dépôt du mail sur le filesystem. Voici maintenant deux sections du fichier de configuration dont on ne changera pas les valeurs par défaut. Nous les recopions ici à titre d’exemple.
begin retry * * F,2h,15m; G,16h,1h,1.5; F,4d,6h begin rewrite
Le fichier de configuration par défaut d’Exim sous FreeBSD contient un certain nombre de commentaires relatifs à ces deux sections. Nous vous laissons le soin d’aller regarder par vous-même.
Nous allons maintenant traiter la dernière section, qui concerne le relais authentifié de mails, avec la section authenticators.
begin authenticators
ldap_plain:
driver = plaintext
public_name = PLAIN
server_prompts = «Username:: : Password::»
server_condition = ${if eq {${lookup ldap \
{user=»uid=${extract{1}{@}{$auth2}},ou=${extract{2}{@}{$auth2}},o
u=mail_domains,LDAPBASE» pass=$auth3 \
ldap://LDAPSERVER/ou=${extract{2}{@}{$auth2}},ou=mail_domains,LDA
PBASE?uid?sub?(uid=${extract{1}{@}{$auth2}})} \
{$value}}} {${extract{1}{@}{$auth2}}} {yes}{no}}
server_advertise_condition = ${if def:tls_cipher }
ldap_login:
driver = plaintext
public_name = LOGIN
server_prompts = «Username:: : Password::»
server_condition = ${if eq {${lookup ldap \
{user=»uid=${extract{1}{@}{$auth1}},ou=${extract{2}{@}{$auth1}},o
u=mail_domains,LDAPBASE» pass=$auth2 \
ldap://LDAPSERVER/ou=${extract{2}{@}{$auth1}},ou=mail_domains,LDA
PBASE?uid?sub?(uid=${extract{1}{@}{$auth1}})} \
{$value}}} {${extract{1}{@}{$auth1}}} {yes}{no}}
server_advertise_condition = ${if def:tls_cipher }
Nous définissons ici deux authenticators, qui vont s’occuper d’authentifier les utilisateurs souhaitant relayer des mails suivant les méthodes PLAIN et LOGIN, respectivement. Nous souhaitons que cette capacité à relayer ne soit activée que s’il y a un chiffrement, c’est pour cela que l’option server_advertise_condition est à la valeur ${if def:tls_cipher}.
Comme les mots de passe des utilisateurs dans l’annuaire LDAP sont chiffrés avec un algorithme à sens unique (Mon dieu, que les gurus de la crypto me pardonnent pour les raccourcis et le vocabulaire utilisés !), l’utilisateur ne peut que nous envoyer son mot de passe en clair. En effet, les authentifications à base de CRAM-MD5 ou TRUC-MD5 ou BLASHA1 nécessitent que le serveur SMTP connaisse le mot de passe en clair. C’est pour cette raison que nous ne proposons que le SMTP AUTH avec les méthodes PLAIN et LOGIN par-dessus SSL/TLS.
Ouf, nous voici arrivé à la fin de la configuration d’Exim. Il reste maintenant à configurer Dovecot, notre serveur POP/IMAP, ainsi qu’Ecartis, notre gestionnaire de mailing-lists, et DSpam.
Configuration de Dovecot
Dovecot est un super serveur POP/IMAP et il est super entre autres parce qu’il est très facile à confi gurer.
Nous n’allons donc pas vous détailler le fichier de configuration principal, dont nous vous reproduisons la version épurée de tous ses commentaires.
% cat /usr/local/etc/dovecot.conf
protocols = imaps pop3s
listen = *
disable_plaintext_auth = yes
syslog_facility = local3
ssl_disable = no
ssl_cert_file = /etc/ssl/certs/dovecot.crt
ssl_key_file = /etc/ssl/private/dovecot.key
ssl_key_password = d0vec0t
ssl_ca_file = /etc/ssl/CA/certs/gcu-squad.org-ca.crt
login_process_size = 64
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s
mail_extra_groups = mail
verbose_proctitle = yes
first_valid_gid = 0
protocol imap {
imap_client_workarounds = delay-newmail outlook-idle netscape-eoh
tb-extra-mailbox-sep
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
auth default {
mechanisms = plain
passdb ldap {
args = /usr/local/etc/dovecot-ldap.conf
}
userdb prefetch {
}
}
protocol lda {
postmaster_address = postmaster@example.com
sendmail_path = /usr/sbin/sendmail
}
plugin {
}
La seule chose de spéciale dans ce fichier à noter est la partie authentification des utilisateurs, qui est reportée dans un autre fichier de configuration, dont nous allons tout de suite vous détailler le contenu.
% cat /usr/local/etc/dovecot-ldap.conf hosts = localhost dn = cn=reader,ou=admin,dc=gcu-squad,dc=org dnpass = reader ldap_version = 3 base = uid=%n,ou=%d,ou=mail_domains,dc=gcu-squad,dc=org deref = never scope = subtree user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid user_filter = (&(objectClass=posixAccount)(uid=%n)) pass_attrs = uid=user,userPassword=password,homeDirectory=userdb_ home,uidNumber=userdb_uid,gidNumber=userdb_gid pass_filter = (&(objectClass=posixAccount)(uid=%n))
Nous spécifions le DN de base sous lequel chercher les utilisateurs avec la variable base, puis nous défi nissons les masques de recherche de l’utilisateur et du mot de passe avec respectivement user_filter et pass_filter, et nous déterminons quels sont les attributs, à extraire de l’annuaire LDAP, nécessaires à Dovecot pour un bon fonctionnement.
Nous fi nissons la confi guration de Dovecot par un petit ajout de la ligne qui va bien dans rc.conf.
% echo ‘dovecot_enable=»YES»’ >> /etc/rc.conf
Vous pouvez maintenant démarrer Dovecot.
% /usr/local/etc/rc.d/dovecot start
Configuration d’Ecartis
Nous allons maintenant nous intéresser au programme Ecartis qui, comme son nom ne l’indique pas du tout, sert à traiter des listes de diffusion. Ecartis est composé d’un exécutable nommé... ecartis, d’un fichier de configuration associé, ecartis.cfg et de fichiers de configuration, eux-mêmes rangés dans des dossiers. Comme Ecartis est un logiciel très complet, avec beaucoup de fonctionnalités, nous allons nous contenter de la mise en place simple d’une liste de diffusion utilisateurs@gcu-squad.org.
Mais, avant même de mettre en place cette liste, nous allons créer le script shell run_ecartis.sh appelé par Exim à chaque fois que nous désirons faire appel à Ecartis.
% cat /usr/local/ecartis/run_ecartis.sh
#!/bin/sh
COMMAND=»/usr/local/ecartis/ecartis»
HOST_TEMPLATE=»domains»
case $LOCAL_PART_SUFFIX in
-bounce) opt=»-bounce» ;;
-moderators) opt=»-moderators» ;;
-admins) opt=»-admins» ;;
-repost) opt=»-a» ;;
-request) opt=»-r» ;;
*)
if [ $LOCAL_PART = «ecartis» ]; then
opt=»»
LOCAL_PART=»»
else
opt=»-s»
fi ;;
esac
exec ${COMMAND} -c ${HOST_TEMPLATE}/${DOMAIN}/vhost.cfg ${opt} ${LOCAL_PART}
C’est un simple script shell qui s’occupe d’appeler Ecartis avec les bonnes options suivant l’adresse mail de réception contenue dans le mail envoyé à Ecartis. N’oubliez pas de le rendre exécutable ! Ensuite, nous allons vous montrer deux autres scripts shells qui servent à créer l’arborescence nécessaire à la mise en place d’une liste sur le système de fi chiers.
% cat add_domain.sh
#!/bin/sh
HOST_TEMPLATE=»/usr/local/ecartis/domains»
host=${1:?Please specify a host}
base=»${HOST_TEMPLATE}/${host}»
if [ -e $base ]
then
echo «Looks like domain ${host} is already set up.»
exit
fi
mkdir -m og-w $base
mkdir -m og-w ${base}/SITEDATA
touch ${base}/SITEDATA/cookies
chown -Rv ecartis $base
chgrp -Rv ecartis $base
echo «Creating base config...»
cat >»${base}/vhost.cfg» <<EOF
hostname = $host
lists-root = domains/$host
logfile = domains/$host/ecartis.log
EOF
echo «All done!»
% cat add_list.sh
#!/bin/sh
ECARTIS=”/usr/local/ecartis/ecartis”
HOST_TEMPLATE=»/usr/local/ecartis/domains»
host=${1:?Please specify a host}
list=${2:?Please specify a list}
base=»${HOST_TEMPLATE}/${host}»
if [ ! -e $base ]
then
echo «Please run add-host.sh ${host}»
exit
fi
echo «Executing: ${ECARTIS} -c domains/${host}/vhost.cfg -newlist $list»
${ECARTIS} -c domains/${host}/vhost.cfg -newlist $list
echo «Done!»
Ces deux scripts se contentent (mais, c’est déjà pas mal !) de mettre en place l’arborescence nécessaire. N’oubliez pas de faire juste avant un mkdir /usr/ local/ecartis/domains, le répertoire sous lequel seront rangés tous nos domaines et toutes nos listes de diff usions s’y rattachant.
Nous allons donc vous détailler la mise en place d’une liste de diff usion en utilisant ces scripts :
% ./add-domain.sh gcu-squad.org /usr/local/ecartis/domains/gcu-squad.org/SITEDATA/cookies /usr/local/ecartis/domains/gcu-squad.org/SITEDATA /usr/local/ecartis/domains/gcu-squad.org Creating base config... All done! % ./add-list.sh gcu-squad.org utilisateurs Executing: /usr/local/ecartis/ecartis -c domains/gcu-squad.org/vhost.cfg -newlist utilisateurs Creating new list ‘utilisateurs’... List admin e-mail: root@gcu-squad.org Writing config file...done. Creating default user file...done. Sending aliases for sendmail/Exim/Postfix/Zmailer to stdout. # Aliases for ‘utilisateurs’ mailing list. utilisateurs: “|/usr/local/ecartis/ecartis -c domains/gcu-squad.org/ vhost.cfg -s utilisateurs” tilisateurs-request: “|/usr/local/ecartis/ecartis -c domains/gcusquad. org/vhost.cfg -r utilisateurs” utilisateurs-repost: “|/usr/local/ecartis/ecartis -c domains/gcusquad. org/vhost.cfg -a utilisateurs” utilisateurs-admins: “|/usr/local/ecartis/ecartis -c domains/gcusquad. org/vhost.cfg -admins utilisateurs” utilisateurs-moderators: “|/usr/local/ecartis/ecartis -c domains/ gcu-squad.org/vhost.cfg -moderators utilisateurs” utilisateurs-bounce: “|/usr/local/ecartis/ecartis -c domains/gcusquad. org/vhost.cfg -bounce utilisateurs” Done!
Il n’y a rien de spécial à signaler pour le premier script, la création du domaine s’étant bien passée. Pour la création de la liste, nous allons nous contenter de recopier la liste des aliases dans le fichier suivant : /usr/local/ecartis/domains/gcu-squad.org/utilisateurs/utilisateurs
Vous devriez vous retrouver avec une arborescence comme suit :
% ls -R domains/gcu-squad.org SITEDATA/ utilisateurs/ vhost.cfg domains/gcu-squad.org/SITEDATA: cookies domains/gcu-squad.org/utilisateurs: config text/ users domains/gcu-squad.org/utilisateurs/text:
Nous allons maintenant vous parler de la configuration de cette mailing-list. Il faut éditer le fichier /usr/local/ ecartis/domains/gcu-squad.org/utilisateurs/users pour s’occuper des utilisateurs de la mailing-list et le fichier /usr/local/ecartis/domains/gcu-squad.org/utilisateurs/config pour s’occuper de la configuration de la mailing-list.
Pour le fichier config, les réglages fournis par défaut par Ecartis sont satisfaisants. Cependant, si vous souhaitez changer le comportement par défaut de la mailing-list, il vous suffit d’éditer ce fichier. Étant donné que ce fichier est extrêmement bien commenté, et bien rangé également, nous allons juste vous donner quelques réglages qui nous semblent de bon aloi.
# notez que les réglages fournis ici ne sont pas rangés ni exhaustifs... reply-to = utilisateurs@gcu-squad.org subject-tag = [Utilisateurs] list-owner = r00t@gcu-squad.org
Nous allons maintenant passer au fichier des utilisateurs.
Ce fichier défi nit les adhérents à la mailing-list.
Chaque adhérent est défini par son adresse e-mail et les drapeaux lui étant affectés.
Voici un fichier type :
directeur@gcu-squad.org : |ADMIN|SUPERADMIN|MODERATOR|C CERRORS|REPORTS|ECHOPOST| comptable@shinois.org : |ECHOPOST| user-lambda@gcu-squad.org : |NOPOST|
Le premier utilisateur a tous les droits sur la mailing-list (avec les fl ags ADMIN et SUPERADMIN). Il a le pouvoir de modérer les posts sur une mailing-list (flag MODERATOR). Si la mailing-list est modérée, il reçoit les erreurs liées à la liste de diff usion (flag CCERROR), il reçoit les comptes-rendus d’actions effectuées sur la mailing-list (flag REPORTS) et, enfin, il a le droit de poster sur la mailing-list (flag ECHOPOST).
Le deuxième utilisateur, le comptable, a le droit d’émettre sur la mailing-list (fl ag ECHOPOST). Le troisième utilisateur est inscrit à la mailing-list, donc reçoit les posts des autres, mais n’a pas le droit d’envoyer par lui-même des posts (logiquement, fl ag NOPOST).
Configuration de DSpam
DSpam est un anti-spam extrêmement puissant écrit en C, qui se base sur une analyse statistique de l’entête et du contenu du message afin de déterminer si le message passé est un spam ou un ham. Le programme est capable d’apprendre à partir des classifications opérées par l’utilisateur.
Cependant, il est un peu délicat à mettre en place, notamment à cause du manque de documentation, obligeant à aller chercher sur Google de nombreuses informations. Nous allons utiliser DSpam avec MySQL comme backend (pour stocker les signatures des mails, les préférences et les UID virtuels rattachés aux mails), et donc commencer par documenter l’installation de MySQL. Nous verrons ensuite la configuration de DSpam à proprement parler, puis la configuration d’Apache qui servira le CGI de DSpam.
Configuration de MySQL pour DSpam
Nous allons créer un utilisateur dspam et une base de données dspam afin de stocker ce que Dspam désire.
% mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3872 Server version: 5.0.45-log FreeBSD port: mysql-server-5.0.45_1 Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer. mysql> use mysql; Database changed mysql> CREATE DATABASE dspam; Query OK, 1 row affected (0.12 sec) mysql> GRANT ALL ON dspam.* to ‘dspam’@’localhost’ IDENTIFIED BY ‘dspamrulez’; Query OK, 0 rows affected (0.12 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.08 sec) mysql> quit Bye %
Vous venez de créer une base de données dspam, dont tous les droits sont accordés à l’utilisateur dspam@localhost dont le mot de passe est dspamrulez. Nous allons maintenant créer les tables nécessaires à DSpam pour stocker les informations dont il aura besoin.
% mysql -udspam -p dspam < /usr/local/share/examples/ dspam/mysql/virtual_users.sql % mysql -udspam -p dspam < /usr/local/share/examples/ dspam/mysql/mysql_objects-speed.sql
N’oubliez pas de taper deux fois le mot de passe lorsque le client mysql vous le demandera. Nous allons maintenant ajouter la ligne suivante dans la crontab d’un utilisateur quelconque (vous ou root), afin de purger la base de données DSpam toutes les nuits.
0 3 * * * /usr/local/bin/mysql -udspam -pdspamrulez dspam < /usr/local/share/examples/dspam/mysql/purge.sql
Toutes les nuits à 03h00, les tables MySQL seront nettoyées. N’oubliez pas de mettre cela dans la crontab, sinon votre base de données dspam grandira à vue d’oeil. Et voilà votre base de données MySQL est prête à accueillir DSpam.
Configuration de DSpam lui-même
Lors de l’installation de DSpam, le port FreeBSD a normalement créé toute l’arborescence nécessaire au bon fonctionnement de DSpam. N’oubliez pas de rendre inscriptible par le groupe vmail le répertoire /var/db/dspam.
% chgrp -R vmail /var/db/dspam
% find /var/db/dspam -type d -exec chmod 770 {} \;
Il faut également que le groupe vmail soit capable de lire le fichier de configuration.
% chgrp vmail /usr/local/etc/dspam.conf % chmod 640 /usr/local/etc/dspam.conf
Enfin, n’oubliez pas d’ajouter DSpam au démarrage de votre machine.
% echo ‘dspam_enable=»YES»’ >> /etc/rc.conf
Voici le fichier de configuration de DSpam épuré de ses commentaires.
Home /var/db/dspam StorageDriver /usr/local/lib/libmysql_drv.so TrustedDeliveryAgent «/usr/local/sbin/exim» OnFail error Trust root Trust mail Trust mailnull Trust smmsp Trust daemon Trust vmail TrainingMode toe TestConditionalTraining on Feature chained Feature whitelist Algorithm graham burton PValue graham Preference «signatureLocation=message» # ‘message’ or ‘headers’ Preference «showFactors=off» Preference «spamAction=tag» Preference «spamSubject=SPAM» AllowOverride trainingMode AllowOverride spamAction spamSubject AllowOverride statisticalSedation AllowOverride enableBNR AllowOverride enableWhitelist AllowOverride signatureLocation AllowOverride showFactors AllowOverride optIn optOut AllowOverride whitelistThreshold MySQLServer /tmp/mysql.sock MySQLUser dspam MySQLPass dspamrulez MySQLDb dspam MySQLCompress true MySQLConnectionCache 50 MySQLVirtualTable dspam_virtual_uids MySQLVirtualUIDField uid MySQLVirtualUsernameField username HashRecMax 98317 HashAutoExtend on HashMaxExtents 0 HashExtentSize 49157 HashMaxSeek 100 HashConnectionCache 10 Notifications off PurgeSignatures 14 # Stale signatures PurgeNeutral 90 # Tokens with neutralish probabilities PurgeUnused 90 # Unused tokens PurgeHapaxes 30 # Tokens with less than 5 hits (hapaxes) PurgeHits1S 15 # Tokens with only 1 spam hit PurgeHits1I 15 # Tokens with only 1 innocent hit LocalMX 127.0.0.1 SystemLog on UserLog on Opt out MaxMessageSize 307200 ProcessorBias on
On note la définition du répertoire de base de DSpam, le driver qu’il va utiliser pour son backend (MySQL dans notre cas), et les utilisateurs « de confiance » (qui auront le droit de lancer DSpam afin d’insérer de nouveaux enregistrements dans la base de données). Les préférences sont à régler comme on le désire, mais les choix proposés ici sont raisonnables et apporteront de bons résultats. On peut noter également les paramètres MySQL ainsi que la possibilité pour les utilisateurs de choisir leurs propres préférences.
Vous pouvez maintenant lancer le daemon dspam.
% /usr/local/etc/rc.d/dspam start
Confi guration d’Apache pour le CGI DSpam
Une fois qu’Apache a été installé par les ports, rajoutez le au démarrage de la machine dans rc.conf.
% echo ‘apache22_enable=»YES»’ >> /etc/rc.conf
Éditez ensuite le fi chier /usr/local/etc/apache22/extra/https-vhosts.conf comme suit :
<VirtualHost *:80> DocumentRoot «/usr/local/www/vhosts/dspam» ServerName dspam.gcu-squad.org ServerAdmin root@gcu-squad.org ErrorLog /var/log/dspam/error_log TransferLog /var/log/dspam/access_log SuexecUserGroup vmail vmail <Directory “/usr/local/www/vhosts/dspam”> DirectoryIndex dspam.cgi Options FollowSymLinks ExecCGI AllowOverride All Order deny,allow Deny from all #SSLRequireSSL #Turn on IMAP Authentication Auth_IMAP_Enabled on #Give a name to the authentication #domain, whatever you want: AuthName “Bonjour, login: prenom.nom@domaine.tld” #Only basic authentication is supported for now: AuthType Basic #If you feel like it, restrict the users #or allow all valid users: Require valid-user AuthBasicAuthoritative off #Make IMAP Authentication authoritative #for this .htaccess file: Auth_IMAP_Authoritative on #Set the IMAP Server to which you want #to connect (default=localhost): Auth_IMAP_Server localhost #Set the port on which the imap server #is running (default=143): Auth_IMAP_Port 143 #Turn on some extra logging (login #attempts, etc.) in Apache’s Error Log Auth_IMAP_Log on Require valid-user Satisfy Any </Directory> </VirtualHost>
Vous devez ensuite changer le propriétaire des CGI comme suit :
% chown -R vmail:vmail /usr/local/www/vhosts/dspam
Vous n’avez plus qu’a redémarrer Apache, et faire pointer votre navigateur sur http://dspam.gcu-squad.org/ afin de vous servir de l’interface web de contrôle de DSpam.
Configuration de SpamAssassin
SpamAssassin étant déjà livré bien confi guré, nous n’allons régler que quelques paramètres.
% grep ^spamd /etc/rc.conf spamd_enable=»YES» spamd_flags=»-u spamd -g spamd -H /var/spool/spamd -A 193.24.25.26/32,127 .0.0.1/32 -i --min-children=5 -m 15 --min-spare=10 --max-spare=12 -l»
On indique combien d’enfants le processus spamd doit forker à son démarrage, et nous ajoutons l’IP 193.24.25.26 pour utiliser SpamAssassin à travers internet. Nous allons maintenant nous intéresser à la manière dont SpamAssassin va traiter nos mails. Nous allons dans le répertoire /usr/local/etc/mail/spamassassin.
Dans le local.cf, nous nous contentons d’ajouter (ou décommenter) les réglages suivants :
rewrite_header Subject [SPAM] add_header spam Flag _YESNOCAPS_ add_header all Status _YESNO_, score=_SCORE_ required=_ REQD_ tests=_TESTS _autolearn=_AUTOLEARN_ add_header all Level _STARS(*)_ add_header all Checker-Version SpamAssassin
Nous indiquons à SpamAssassin qu’il doit réécrire le sujet en le préfi xant de la chaîne [SPAM] (dans le cas où c’est du spam bien sûr), et nous lui indiquons le formatage des headers que nous désirons.
Il ne reste plus qu’a redémarrer SpamAssassin :
% /usr/local/etc/rc.d/spamd restart
Configuration de ClamAV
Voici le fichier de confi guration utilisé :
% grep -v ‘^#’ /usr/local/etc/clamd.conf| sed -E ‘/^$/d’ LogFile /var/log/mail/clamd.log PidFile /var/run/clamav/clamd.pid DatabaseDirectory /var/db/clamav LocalSocket /var/run/clamav/clamd FixStaleSocket yes User clamav
AllowSupplementaryGroups yes ScanMail yes
Pour FreshClam, voici le fi chier de confi guration utilisé :
% grep -v \^# /usr/local/etc/freshclam.conf| sed -E ‘/^$/d’ DatabaseDirectory /var/db/clamav UpdateLogFile /var/log/clamav/freshclam.log PidFile /var/run/clamav/freshclam.pid DatabaseOwner clamav AllowSupplementaryGroups yes DatabaseMirror database.clamav.net NotifyClamd /usr/local/etc/clamd.conf
Il ne vous reste plus qu’à indiquer ceci dans /etc/rc.conf :
clamav_clamd_enable=»YES» clamav_freshclam_enable=»YES»
et à redémarrer les daemons :
% /usr/local/etc/rc.d/clamd restart % /usr/local/etc/rc.d/freshclam restart
Si vous avez des problèmes...
Il y a plusieurs points à vérifier :
- les permissions, notamment pour lire les fichiers de configuration, ou alors pour écrire dans certaines parties du système de fi chiers ;
- n’oubliez pas d’aller jeter un coup d’oeil dans les fichiers de logs, situés dans
/var/log/mailet dans/var/log/exim.
Vous avez la possibilité de vérifi er le routage des mails avec une commande comme celle-ci :
% exim -bt -d+all utilisateur@gcu-squad.org 2>&1 | less
afin de vérifier comment Exim traite votre mail.
D’autre part, nous ne garantissons pas qu’une coquille ne se soit pas glissée dans la confi guration d’un des daemons présents dans cet article et nous vous invitons donc à redoubler de prudence lors de la mise en oeuvre. Nous vous proposons même de vous reporter à la documentation offi cielle en cas de doute (ouaaaah l’aut’ eh, ça serait pas un RTFM déguisé ?).
C’est la fin ?
Eh bien non ! Malgré le fait que vous disposiez à l’heure actuelle d’une super plate-forme de mails, on peut toujours dire qu’il reste des points à améliorer. Par exemple, nous n’avons pas parlé de la réplication de l’annuaire LDAP, qu’il serait pourtant judicieux d’eff ectuer si nous désirons avoir une plate-forme de haute-disponibilité. Ou alors l’utilisation d’un daemon HTTP alternatif à Apache (vu que c’est la mode en ce moment...).
En conclusion, je souhaite remercier Denis Bodor alias Lefinnois qui m’a permis d’écrire dans ce magnifique magazine qu’est GNU/Linux Magazine France, ainsi que toute l’équipe de ce superbe magazine. Je salue notamment le courage de Dominique, qui a la patience de relire nos anglicismes/barbarismes/néologismes jusqu’au bout sans devenir fou. Je fais également plein de bisous à toute la secte GCU-Squad en les remerciant pour leur support et leurs nombreux conseils de VIEU^W^Wnon rien.
Retrouvez cet article dans : Linux Magazine 100


