Catégorie : Administration système     Tags :      

    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/mail et 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

    Posté par Mathieu Launay (mat) | Signature : Mathieu Launay | Article paru dans Creative Commons License

    Il y a actuellement un commentaire dans “Mise en oeuvre d’une plate-forme mail avec FreeBSD et Exim4”

    1. 1 Le 14 mai 2008, BlackShade[10] ecrivait:

      Juste pour signaler une petite coquille :)

      # ClamAV, car c’est la seule solution anti-spam libre à ma connaissance ;

      Or ClamAV est un anti-virus.

      Sinon dans l’ensemble, très bon article, très utile.

    Laissez une réponse

    Vous devez avoir ouvert une session pour écrire un commentaire.


    • Il y a actuellement

    • 666 articles/billets en ligne.