Sommaire

Dans un premier temps, il nous faudra installer Openssl et LDAP qui sont la base de notre serveur.

Ensuite, nous procéderons par étapes :

Installation de dovecot

Nous allons utiliser le gestionnaire de paquets Debian, aptitude, pour faire toutes les installations :

monserveur:/etc/dovecot# aptitude install dovecot-common dovecot-imapd dovecot-pop3d

L'installation est rapide et simple. Durant cette phase, un certificat et une clé privée openssl sont crées dans /etc/ssl/certs/dovecot.pem et /etc/ssl/key/dovecot.pem. Nous les supprimerons plus tard pour créer nos propres clé et certificat.

Dovecot se configure via le fichier /etc/dovecot/dovecot.conf. Celui-ci comporte pas mal d'options, mais seules quelques unes sont vitales. Nous allons créer un fichier de configuration minimal à partir du fichier existant pour que dovecot fonctionne et s'appuie sur l'annuaire LDAP pour authentifier les utilisateurs :

monserveur:/etc/dovecot# cp dovecot.conf dovecot-sample.conf
monserveur:/etc/dovecot# cat dovecot-sample.conf | grep -v '#' > dovecot.conf
monserveur:/etc/dovecot# vi dovecot.conf

protocols = imap pop3 imaps pop3s
listen = *

login_greeting = Server @antiseches.net ready...
mail_location = maildir:~/Maildir
disable_plaintext_auth = no

log_path = /var/log/mail.log
log_timestamp = "%Y-%m-%d %H:%M:%S "

protocol pop3 {
   # Pour ne pas avoir l'erreur "pop3_uidl_format setting is missing from config file" en pop3
   pop3_uidl_format = %08Xu%08Xv
}

auth default {
   passdb ldap {
      args = /etc/dovecot/dovecot-ldap.conf
      }
   userdb ldap {
      args = /etc/dovecot/dovecot-ldap.conf
      }
}

Le fichier dovecot-sample.conf peut être supprimé ou conservé comme sauvegarde. Il ne servira pas pour la bonne marche du système.

Dans le fichier dovecot.conf, on fait appel à un autre fichier de configuration, /etc/dovecot/dovecot-ldap.conf qui décrit comment interroger l'annuaire LDAP. Il doit ressembler à ca :

monserveur:/etc/dovecot# cat dovecot-ldap.conf

hosts = 127.0.0.1
auth_bind = yes
ldap_version = 3
base = dc=antiseches,dc=net

La ligne auth_bind = yes permet d'utiliser le nom et le mot de passe de l'utilisateur qui veut se connecter au lieu de faire la requête (binding) avec un compte super utilisateur.

Maintenant que Dovecot est configuré, on le relance :

monserveur:/etc/dovecot# /etc/init.d/dovecot restart

On peut faire un test en simulant une connexion imap en telnet. Voici par exemple le déroulement d'une connexion en utilisant le protocole IMAP :

monserveur:/etc/dovecot# telnet 127.0.0.1 143
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ’^]’.
* OK Server ready.
. a login remi azerty
. OK Logged in.
. a logout
* BYE Logging out
. OK Logout completed.

Pour faire un test de connexion en POP3 au lieu de IMAP, il faut utiliser la commande telnet 127.0.0.1 110.

Note : dans l'exemple ci dessous, remi est le nom de l'utilisateur qui désire interroger sa boite aux lettres, et azerty est son super mot de passe.

Pour avoir des échanges sécurisés, il faut utiliser les protocoles imaps ou pop3s. Et pour utiliser imaps et pop3s, on a besoin de certificats ssl. Les chemins vers ces certificats seront définis plus tard dans le fichier /etc/dovecot/dovecot.conf.

Normalement les certificats ont été créés lors de l'installation de Dovecot et ils ont une validité de 1 an. Nous allons les recréer mais avec une validité de 10 ans. De plus, on va faire en sorte que les certificats soient les mêmes pour imaps, pop3s et smtps.

Il faudra veiller à ce que les nom DNS des machines imaps.antiseches.net, pop3s.antiseches.net et smtps.antiseches.net existent pour pouvoir utiliser le certificat avec ces services.

Avant de lancer la création des certificats, il faut créer un fichier de configuration dans le répertoire de openssl :

monserveur:/etc/ssl# vi conf/mails.cnf

[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /etc/ssl
certs = $dir/ca
new_certs_dir = $dir/ca/newcerts
database = $dir/ca/index.txt
certificate = $dir/ca/ca.pem
serial = $dir/ca/serial
private_key = $dir/ca/ca.key
default_days = 3650
default_md = sha1
preserve = no
policy = policy match
[ policy_match ]
organizationName = match
commonName = supplied
emailAddress = optional
[ req ]
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
organizationName = Organisation (obligatoire)
organizationName_default = antiseches.net
commonName = Nom CN (obligatoire)
commonName_max = 64
emailAddress = Adresse mail (optionnel)
emailAddress_max = 40
[CA]
nsComment = "AC"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:alway
basicConstraints = critical,CA:TRUE,pathlen:0
keyUsage = keyCertSign, cRLSign
[SERVEUR]
nsComment = "Certificat Messagerie"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
issuerAltName = issuer:copy
basicConstraints = critical,CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
nsCertType = server
extendedKeyUsage = serverAuth
subjectAltName = @ALIASES
[ALIASES]
DNS.1 = pop3s.antiseches.net
DNS.2 = imaps.antiseches.net
DNS.3 = smtps.antiseches.net

Ce sont la directive subjectAltName = @ALIASES et la section [ALIASES] qui vont nous permettre de n'utiliser qu'un seul certificat pour les 3 services cités plus haut. On peut rajouter autant de lignes que l'on a besoin et utiliser cette technique pour faire du https avec www.antiseches.net ou encore webmail.antiseches.net. La seule contrainte est de s'assurer que le nom DNS existe.

Création de la clé privée key/mails.key et de la demande de certificat csr/mails.csr pour le serveur :

monserveur:/etc/ssl# openssl req -new -config ./conf/mails.cnf -newkey rsa:4096 -nodes -keyout key/mails.key -out csr/mails.csr

Generating a 4096 bit RSA private key
..++++++
...++++++
writing new private key to 'key/mails.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Organisation (obligatoire) [antiseches.net]:
Nom CN (obligatoire)[]: mails.antiseches.net
Adresse email (optionnel) []:.

Explication des paramètres de la ligne de commande :

- req : Création de la demande de certificat à l'AC
- config ./conf/mail.cnf : Fichier de configuration à utiliser
- newkey rsa:4096 : On génére la clé privée en même temps que le certificat. Ce sera une clé RSA de 4096 bits
- days 3650 : La validité de la signature est de 10 ans (3650 jours)
- keyout key/mails.key : Chemin relatif où sera stocké la clé privée
- nodes : La clé ne sera pas encodée
- out csr/mails.csr : Fichier qui sert à créer la requete. Il pourra être supprimé plus tard

Ensuite on crée le certificat (la clé publique signée) à partir de la demande faite plus haut :

monserveur:/etc/ssl# openssl ca -config ./conf/mails.cnf -extensions SERVEUR -in csr/mails.csr -out cert/mails.pem

Using configuration from ./conf/mails.cnf
Check that the request matches the signature

Signature ok

The Subject's Distinguished Name is as follows

organizationName :PRINTABLE:'antiseches.net'

commonName :PRINTABLE:'mails.antiseches.net'

Certificate is to be certified until Dec 8 15:00:18 2019 GMT (3650 days)

Sign the certificate? [y/n]: y

1 out of 1 certificate requests certified, commit? [y/n] y

Write out database with 1 new entries

Data Base Updated

Explication des paramètres de la ligne de commande :

- ca : Commande ca pour créer la clé publique
-config ./conf/mails.conf : Fichier de configuration à utiliser
-extensions SERVEUR : Section du fichier de configuration à utiliser
- in csr/mails.csr : Chemin relatif du fichier de requète qui a été créé précédement.
- out out cert/mails.pem : Chemin relatif du certificat créé

On peut maintenant supprimer le fichier csr/mails.csr qui n'est plus utile :

monserveur:/etc/ssl# rm csr/mails.csr

Une fois les commandes exécutées et les certificats créés, il faut compléter le fichier de configuration de dovecot /etc/dovecot/dovecot.conf pour qu'il ressemble à ça :

protocols = imap pop3 imaps pop3s
listen = *

login_greeting = Server @antiseches.net ready...
mail_location = maildir:~/Maildir
disable_plaintext = no

log_path = /var/log/mail.log
log_timestamp = "%Y-%m-%d %H:%M:%S "

protocol pop3 {
   # Pour ne pas avoir l'erreur "pop3_uidl_format setting is missing from config file" en pop3
   pop3_uidl_format = %08Xu%08Xv
}

auth default {
   passdb ldap {
      args = /etc/dovecot/dovecot-ldap.conf
      }
   userdb ldap {
      args = /etc/dovecot/dovecot-ldap.conf
      }
}

# Certificats pour les échanges en imaps ou pop3s :
ssl_cert_file = /etc/ssl/cert/mails.cert
ssl_key_file = /etc/ssl/key/mails.key

Une fois le démon dovecot relancé (/etc/init.d/dovecot restart), on peut simuler une connexion en pop3s ou en imaps. La commande openssl s_client remplace la commande telnet utilisée plus haut, mais une fois connecté la syntaxe des commandes imap reste identique :

monserveur:/etc/ssl# openssl s_client -connect 127.0.0.1:993
---
* OK Dovecot ready.
.
a login remi azerty
. OK Logged in.
.
a logout
* BYE Logging out
. OK Logout completed.
read:errno=0

Installation de Postfix

Maintenant que dovecot est opérationnel, on installe Postfix et mailx. Postfix est le logiciel serveur smtp, et mailx fournit la commande mail qui nous servira à envoyer éventuellement des mails en ligne de commande pour faire des tests ou dans des scripts.

Comme pour Dovecot, on utilise aptitude pour faire l'installation.

monserveur:/# aptitude install postfix mailx vacation

Une fois les commandes entrées, on valide l'installation en entrant Y. Ensuite, on suit les copies d'écran ci-dessous en répondant aux questions posées par le programme d'installation :

Ci-dessous, entrer le nom de l'utilisateur qui recevra toutes les alertes administratives par email. Il faudra que son compte email existe :

Aprés l'installation, il faut terminer la configuration de postfix à travers ses fichiers de configuration. Le fichier principal est /etc/postfix/main.cf. De base il doit avoir cette allure :

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

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

myhostname = monserveur.antiseches.net
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
myorigin = /etc/postfix/mailname
mydestination = antiseches.net, monserveur.antiseches.net,localhost.antiseches.net, localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

Pour que tous les fichiers de configuration de Postfix se trouvent au même endroit, on déplace les fichiers /etc/mailname,/etc/aliases et aliases.db dans le répertoire /etc/postfix :

monserveur:/# mv /etc/mailname /etc/postfix
monserveur:/#
mv /etc/aliases /etc/postfix
monserveur:/#
mv /etc/aliases.db /etc/postfix

Il faut bien sur éditer le fichier /etc/posfix/main.cf pour qu'il reflete la modification:

monserveur:/# vi /etc/postfix/main.cf

myorigin = /etc/postfix/mailname
alias_maps = hash:/etc/postfix/aliases

Tant qu'on y est, on complète la ligne suivante pour ajouter la liste des adresses IP des réseaux qui pourront envoyer un mail. Cette liste est à adapter en fonction de votre réseau local :

mynetworks = 127.0.0.0/8, 192.168.0.0/24

A ce stade, le ficher de configuration /etc/postfix/mail.cf ressemble à ceci :

monserveur:/# cat/etc/postfix/main.cf

smtpd_banner = $myhostname ESMTP $mail_name(Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
readme_directory = no
myhostname = monserveur.antiseches.net
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
myorigin = /etc/postfix/mailname
mydestination = antiseches.net, monserveur.antiseches.net,localhost.antiseches.net, localhost
relayhost =
mynetworks = 127.0.0.0/8, 192.168.0.0/24
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

Puis on relance le démon Postfix par la commande /etc/init.d/postfix restart

Maintenant que le démon Postfix fonctionne, on peut tenter la commande echo test | mail -s "test 1" remiremi est un utilisateur qui a un compte de messagerie sur la machine. Si tout fonctionne, on voit apparaitre les lignes suivantes dans le fichier /var/spool/mail/remi qui vient de se créer :

monserveur:/# cat /var/spool/mail/remi

From root@antiseches.net Wed Dec 9 12:46:15 2009
Return-Path: <root@antiseches.net>
X-Original-To: remi
Delivered-To: remi@antiseches.net
Received: by monserveur.antiseches.net (Postfix, from userid 0)
id 659571D2187; Wed, 9 Dec 2009 12:46:15 +0100 (CET)
To: remi@antiseches.net
Subject: test 1
Message-Id: <20091209114615.659571D2187@monserveur.antiseches.net>
Date: Wed, 9 Dec 2009 12:46:15 +0100 (CET)
From: root@antiseches.net (root)

test

Ca fonctionne. Cependant, les emails sont délivrés dans /var/spool/mail sous la forme d'un seul fichier et dovecot va les chercher dans un autre endroit. Il faut donc modifier le fichier de configuration de postfix /etc/postfix/mail.cf pour qu'il délivre les mails là ou dovecot ira les chercher en rajoutant la ligne suivante :

home_mailbox = Maildir/

Puis redémarrer postfix avec la commande /etc/init.d/postfix restart

On peut maintenant relancer la commande echo test |mail -s "test 1" remi et voir que le mail a été délivré dans le répertoire /home/remi/Maildir/new :

monserveur:/# ls/home/toto/Maildir/new/
1260360524.V801I362028M265092.monserveur

Si on édite le contenu de ce fichier on verra la même chose que précédement. Il est à noter que dans cette configuration chaque nouveau mail arrivera sous forme d'un fichier séparé.

A ce stade de l'installation, les démons POP3, POP3S, IMAP, IMAPS et SMTP sont opérationnels. L'authentification SMTP n'est pas encore configurée et SMTPS ne fonctionne pas encore lui non plus.

Cependant, on peut paramètrer un compte sur un client de messagerie comme Outlook ou Thunderbird et tester l'envois et la réception de mail en s'envoyant un message à soi-même. Pour tester les différents cas, on peut utiliser les paramètres suivants :

- Test 1 : protocoles smtp et pop3
- Test 2 : protocoles smtp et imap
- Test 3 : protocoles smtp et pop3s
- Test 4 : protocoles smtp et imaps

Dans les tests 3 et 4, le client de messagerie peut nous alerter que le certificat utilisé ne peut pas être vérifié :

Pour ne plus avoir ce message, il faut importer le certificat de l'AC du serveur sur la machine cliente. Voir l'article sur openssl pour plus de détails sur cette étape.

Note : je me suis rendu compte que en paramétrant un compte Outlook avec mailss.antiseches.net dans les champs pop, imap ou smtp, celui ci prévient que le certificat ne peut pas être vérifié à chaque lancement. Par contre, en utilisant les aliases pop3s.antiseches.net, imaps.antiseches.netou smtps.antiseches.net, Outlook ne donne pas d'avertissement. Pourtant les enregistremens DNS sont corrects sur le LAN...

Authentification smtp

Postfix est configuré pour que seules les personnes qui se trouvent sur notre réseau local puissent envoyer des messages vers l'extérieur. Si ce n'était pas le cas, le serveur serait un relais smtp public et tout le monde pourrait s'en servir pour envoyer du spam. Au bout de quelques temps, il serait inscrit sur des blacklists et plus personne n'accepterait de mail en provenance de celui-ci.

Pour qu'un utilisateur de confiance puisse utiliser ce serveur depuis l'extérieur du réseau local, il faudra d'abord qu'il s'authentifie. C'est cette partie authentification que nous allons maintenant mettre en oeuvre.

L'authentification smtp se paramètre au niveau du serveur et peut se faire de 2 façons différentes :

  • En utilisant le démon saslauth. C'est la méthode classique, mais un peu complexe à mettre en oeuvre dans le sens où il faut installer le démon, le paramétrer, puis créer et/ou modifier quelques fichiers.
  • En utilisant le mécanisme natif de Dovecot. C'est la méthode la plus simple et la plus rapide.

Dans les 2 cas, ce sera notre annuaire LDAP qui sera mis à contribution pour la vérification des comptes utilisateur et des mots de passe.

Dans la pratique, je préfère largement la deuxième et je vous la conseille vivement.

Technique n° 1 : Installation et configuration de saslauth

On commence par installer le paquet nécessaire :

monserveur:/# aptitude install sasl2-bin

Pour des raisons de sécurité, Postfix fonctionne dans une cage (chroot). Ceci va nous obliger à faire des manips supplémentaires pour faire fonctionner l'authentification. Lire le fichier /usr/share/doc/sasl2-bin/README.Debian.

Créer l'arborescence suivante :

monserveur:/# mkdir/var/spool/postfix/var
monserveur:/#
mkdir/var/spool/postfix/var/run
monserveur:/#
mkdir/var/spool/postfix/var/run/saslauthd

Conformément au fichier /usr/share/doc/sasl2-bin/README.Debian, taper les commandes suivantes.

monserveur:/etc/ssl# dpkg-statoverride --add root sasl 710/var/spool/postfix/var/run/saslauthd
monserveur:/etc/ssl# adduser postfix sasl

On supprime le répertoire /var/run/saslauth d'origine et on le remplace par un lien vers /var/spool/postfix/var/run/saslauthd :

monserveur:/# cd /var/run/
monserveur:/var/run/# rm -rf saslauthd/
monserveur:/var/run/# ln -s/var/spool/postfix/var/run/saslauthd

Enfin, éditer le fichier /etc/default/saslauthd :

START=yes
MECHANISMS="ldap"
OPTIONS="-O /etc/saslauthd.conf -r -c -m/var/spool/postfix/var/run/saslauthd"

Puis on édite le fichier de configuration /etc/saslauthd.conf :

ldap_servers: ldap://localhost
ldap_search_base: ou=Users,dc=antiseches,dc=net

Création du répertoire /etc/postfix/sasl et du fichier /etc/postfix/sasl/smtpd.conf qui doit contenir ceci :

pwcheck_method: saslauthd
mech_list: plain login

Note : le fichier /etc/postfix/sasl/smtpd.conf fait suite à la ligne smtpd_sasl_path = smtpd de /etc/postfix/main.cf (voir plus bas).

Maintenant il suffit de rédémarrer le démon saslauthd et de tester :

monserveur:/var/run/# /etc/init.d/saslauthd restart

Note : le premier démarrage du démon saslauthd demande un peu de temps à cause de la création des fichiers qui sont dans le répertoire.

Pour voir si le démon saslauthd est bien configuré, on teste l'authentification en simulant une demande de connexion avec l'outil testsaslauthd :

monserveur:/var/run/# testsaslauthd -u remi -p azerty
0: OK "Success."

La portion du fichier de configuration /etc/postfix/main.cf relative à saslauth doit ressembler à ceci :

smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_path = smtpd

saslauth est maintenant capable d'identifier l'utilisateur, mais quand on teste la connexion avec un client de messagerie, on a un message d'erreur disant que le mot de passe est refusé. De plus le contenu de /var/log/syslog montre les erreurs suivantes:

warning: SASL authentication problem: unable to openBerkeley db /etc/sasldb2: No such file or directory
warning: SASL authentication failure: Password verification failed
warning: unknown[193.253.141.90]: SASL PLAIN authentication failed: authentication failure
lost connection after AUTH from unknown[xxx.xxx.xxx.xxx]

Cette erreur est dûe au fait que Postfix fonctionne dans un environnement chrooté. Il ne peut donc pas trouver le fichier /etc/sasldb2 même si celui-ci existe. Pour corriger ca, faire la manip suivante :

monserveur:/# cd /etc/
monserveur:/etc/# mv sasldb2/var/spool/postfix/etc/
monserveur:/etc/# ln -s/var/spool/postfix/etc/sasldb2 .

Normalement, tout devrait maintenant fonctionner correctement après un redémarrage des services.

Technique n° 2 : authentification smtp en utilisant Dovecot

Avant tout, if faut savoir si Postfix a été compilé avec le support de l'authentification Dovecot SASL. Pour le savoir, il faut lancer la commande suivante :

monserveur:/#postconf -a
dovecot
...

C'est bon, on peut y aller...

Si on veut utiliser Dovecot pour l'authentification smtp, il n'est pas nécessaire d'utiliser le démon saslauth. Si il est installé, on peut désactiver son démarrage automatique en mettant START=No à la place de START=yes dans le fichier /etc/default/saslauthd.

Ensuite dans le fichier /etc/postfix/main.cf, créer les lignes suivantes :

# SMTPD auth avec dovecot :
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

Dans le fichier /etc/dovecot/dovecot.conf, ajouter les lignes suivantes dans la section authdefault :

mechanisms = plain login
socket listen {
  client {
    path = /var/spool/postfix/private/auth
    mode = 0600
    user = postfix
    group = postfix
  }
}

On reboote et on teste.

On remarque que si on essaie d'envoyer un email à l'extérieur du domaine antiseches.net avec le client de messagerie employé plus haut, le message ne peut pas partir et dans les logs /var/log/mail.log on voit la ligne suivante :

Dec 9 14:17:31 monserveur postfix/smtpd[2097]:NOQUEUE: reject: RCPT from unknown[172.16.204.170]: 554 5.7.1<toto@hotmail.com>: Relay access denied; from=<remi@antiseches.net>to=<toto@hotmail.com> proto=ESMTP helo=<pc-de-remi>

C'est parce que le serveur demande une authentification et le client de messagerie n'est pas encore configuré pour l'authentification smtp. Il faut donc modifier les paramètres du client messagerie de la façon suivante :

Une fois cette modif effectuée, les emails partiront sans problèmes. Cette fois ci dans le journal de log on verra les informations suivantes :

Dec 9 15:57:41 monserveur postfix/smtpd[2064]:B5BB01D218E: client=unknown[172.16.204.170], sasl_method=LOGIN,sasl_username=remi

On voit que la configuration est plus simple que la précédente. De plus l'avantage de cette technique est d'utiliser moins de ressources sytème il y a un processus actif en moins.

Configuration de smtps pour Postfix

L'authentification fonctionne, mais le couple login/password est envoyé en clair sur le réseau et risque d'être intercepté. Pour régler ce problème, il faut chiffrer les échanges en utilisant ssl. Bien que l'installation de postfix a aussi créé un certificat et une clé privée, nous allons réutiliser les certificats ssl créés plus haut lors de la configuration de Dovecot.

On vérifie que les informations suivantes se trouvent bien dans les fichiers de configurations de Postfix et de Dovecot :

Dans /etc/dovecot/dovecot.conf :

socket listen {
   client {
      path = /var/spool/postfix/auth
      mode = 0666
      user = postfix
      group = postfix
      }
   }
# Certificats pour les échanges en imaps ou pop3s :
ssl_cert_file = /etc/ssl/cert/mails.pem
ssl_key_file = /etc/ssl/key/mails.key

Dans /etc/postfix/main.cf :

smtpd_tls_cert_file=/etc/ssl/cert/mails.pem
smtpd_tls_key_file=/etc/ssl/key/mails.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

Derniére étape, éditer le fichier /etc/postfix/master.cf pour y ajouter la ligne suivante:

smtps  inet     n     -     n     -     -     smtpd -o smtpd_tls_wrappermode=yes

On peut maintenant redémarrer les serveurs Postfix et Dovecot et tester le smtps avec un client de messagerie. On peut aussi tester avec la commande openssl s_client -connect 127.0.0.1:465 pour simuler un échange entre un client de messagerie et le serveur SMTP.

Si on veut utiliser Outlook pour envoyer et recevoir un mail avec SMTPS et IMAPS, il faut configurer les paramètres avancés du compte comme ceci :

Pour utiliser Outlook avec SMTPS et POP3S, voiçi les paramètres qu'il faut utiliser :

Installation du filtrage des emails

Avant l'installation de la partie filtrage, le cheminement d'un email venant d'un expéditeur extérieur est le suivant :

  1. PC expéditeur
  2. Serveur mail de l'expéditeur
  3. Serveur mail local (celui qu'on est en train d'installer)
  4. Boite aux lettres

Nous allons mettre en place un système de filtrage pour que les courriers indésirables n'arrivent pas à l'étape 4.

Pour mettre en place un tel système, il y a encore une fois plusieurs possibilités, et il faudra essayer de choisir la meilleure en fonction de la capacité du serveur et de son utilisation. Parmis ces possibilités, voici les principales :

  1. Utilisation de amavisd-new qui est un démon qui écoute sur un port TCP particulier et à qui postfix sous-traite les taches de filtrage. C'est une solution éprouvée et trés robuste mais elle a l'inconvénient de consommer pas mal de mémoire.
  2. Utilisation des possibilités de filtrage de postfix, sans utiliser amavisd-new. Certains disent que cette solution est moins bonne pour un serveur qui traite de grosses quantité de mails par jour. Personnellement, je n'ai jamais eu de problèmes.

Nous allons voir ici les 2 méthodes. Dans un premier temps, on va installer l'antispam (spamassassin) et l'antivirus (clamav) puis on configurera le lien entre ces 2 logiciels et Postfix.

Installation de l'antispam

L'installation se fait grâce à la commande aptitude :

monserveur:~# aptitude install spamassassin

Une fois la phase d'installation terminée, il faut éditer le fichier /etc/default/spamassasin pour que les lignes ENABLED et CRON soient à 1 :

ENABLED=1
CRON=1

Il n'y a rien d'autre à faire pour l'instant.

Installation de l'antivirus

Encore une fois, on utilise aptitude :

monserveur:~# aptitude install clamav clamav-daemon clamav-freshclam gzip bzip2 unzip p7zip-full unrar unrar-free zoo arj lha arc cabextract lzop pax ar tnef

L'installation se déroule sans difficulté. Il suffit de suivre les copies d'écran ci-dessous :

Pour la mise à jour de l'antivirus, on choisit cron. Bien que démon soit plus efficace, le fait de faire tourner un service en plus sur notre système va nous faire consommer plus de mémoire et de ressources système. Choisir cron permet donc d'automatiser les mises à jour sans consommer de la mémoire en permanence. C'est un bon compromis.

Bien entendu on choisit le serveur de mise à jour le plus proche possible de manière à ce que les transferts de fichiers se fassent rapidement :

Normalement, on n'utilise pas de proxy pour faire la mise à jour d'un serveur :

Comme nous utilisons clamd (l'antivirus fonctionne en démon, contrairement à freshclam), on répond oui :

Pour tester si clamav est à jour, entrer la commande suivante :

monserveur:~# clamscan -v

La commande donne la version de clamav et de ses fichiers de définitions. Il se peut que le message suivant apparaisse :

LibClamAV Warning:***********************************************************
LibClamAV Warning: *** This version of the ClamAV engine is outdated. ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq***
LibClamAV Warning:***********************************************************

Dans ce cas, il faut modifier le fichier des sources de debian qui se trouve dans /etc/apt/sources.list et ajouter la ligne suivante :

deb http://volatile.debian.org/debian-volatilelenny/volatile main contrib non-free

Si cette ligne existe mais n'est pas complète, il faut la modifier.

Ensuite il faut mettre à jour les paquets par la commande aptitude update && aptitude safe-upgrade puis re-tester avec la commande clamscan -v

Maintenant que les logiciels antivirus et antispam sont installés, il faut faire en sorte qu'ils communiquent avec Postfix, en fonction de notre choix d'utiliser amavisd-new ou pas.

Configuration du filtrage

Technique n°1 : utilisation de amavisd-new

Avant d'installer amavisd-new, il faut faire une lien symbolique de /etc/postfix/mailname vers /etc/mailname car lors de l'installation de postfix, nous avions déplacé ce fichier dans /etc/postfix pour que tous les fichiers de config soient dans le même répertoire. Cependant, amavis ne reconnait le fichier que s'il est à son emplacement d'origine.

monserveur:~# ln -s /etc/postfix/mailname /etc/mailname

Ensuite, il est conseillé de lire la documentation de amavisd-new qui setrouve dans le fichier /usr/share/doc/amavisd-new/README.postfix

Puis on installe amavisd-new :

monserveur:~# aptitude install amavisd-new

A la fin de l'installation, amavisd a démarré. Pour analyser certains type de fichiers (doc, etc.) on a besoin de ripole en plus des binaires ci-dessus. Pour ce faire, il faut le télécharger et le compiler car il n'est pas présent dans les paquets debian :

monserveur:~# cd /usr/local/src
monserveur:/usr/local/src# wget -c http://www.pldaniels.com/ripole/ripole-0.2.0.tar.gz
monserveur:/usr/local/src# tar -zxvf ripole-0.2.0.tar.gz
monserveur:/usr/local/src# cd ripole-0.2.0
monserveur:/usr/local/src/ripole-0.2.0# make && mv ripole /usr/bin
monserveur:/usr/local/src/ripole-0.2.0#/etc/init.d/amavisd restart

Si on regarde le contenu du fichier de log /var/log/mail.log on peut voir les messages laissés par le démarrage de amavis. Ces messages montrent entre autre les décodeurs qu'il prend en charge pour analyser les fichiers, et ceux qu'il ne prend pas en charge. On voit notament que malgrés l'installation de unrar, le décodeur d'Amavis ne le prend pas en charge pour des raisons de licence :

monserveur amavis[7553]: No decoder for .rar

Pour changer ce comportement, éditer le fichier /etc/amavis/conf.d/01-debian et remplacer les lignes

#$unrar = ['rar', 'unrar']; #disabled (non-free, nosecurity support)
unrar = undef;

par

$unrar = ['rar', 'unrar']; #disabled (non-free, nosecurity support)
#$unrar = undef;

Maintenant si on relance amavis (/etc/init.d/amavis restart) et qu'on regarde le contenu de /var/log/mail.log, on doit voir la ligne suivante :

monserveur amavis[7553]: Found decoder for .rar at/usr/bin/unrar

Pour vérifier que Amavis fonctionne bien on peut entrer le jeu de commandes suivantes pour simuler une connexion :

monserveur:~# telnet localhost 10024
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
quit
221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel
Connection closed by foreign host.

Pour l'instant, il fonctionne mais ne communique pas encore avec Postfix.

Pour le faire communiquer, il faut modifier les fichiers de configuration de ce dernier. A la fin du fichier /etc/postfix/master.cf, ajouter les lignes suivantes:

# Configuration pour amavisd-new
smtp-amavis  unix  -     -     y     -     10     smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20

127.0.0.1:10025 inet n     -     y     -     -     smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -oreceive_override_options=no_header_body_checks,no_unknown_recipient_checks

Note : ne pas faire un copier/collé des lignes ci-dessus dans le fichier car la présence de caractères invisibles risque de faire que le fichier soit invalide....

Ensuite, on recharge la configuration de postfix avec la commande /etc/init.d/postfix reload.

Pour vérifier que postfix et amavis communiquent bien on peut comme tout à l'heure tenter une connexion en telnet, mais cette fois si sur le port 10025 :

monserveur:~# telnet localhost 10025
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Server @antiseches.net ready...
quit
221 2.0.0 Bye
Connection closed by foreign host.

Maintenant, il faut dire à postfix de forwarder tous les emails qu'il recoit à amavis pour que leur contenu soit inspecté. On peut le faire :

- soit en rajoutant la ligne suivante dans le fichier de configuration /etc/postfix/main.cf :

content_filter=smtp-amavis:[127.0.0.1]:10024

- soit en tapant la commande suivante :

monserveur:~# postconf -e ' content_filter=smtp-amavis:[127.0.0.1]:10024'

Une fois encore, on recharge la configuration de postfix avec la commande postfix reload.

Jusqu'ici, tout fonctionne. Quand on recoit un email de l'extérieur, l'entête du message doit contenir une ligne qui ressemble à ca :

by localhost (monserveur.antiseches.net [127.0.0.1])(amavisd-new, port 10024)

Cela siginifie bien que amavisd-new teste le message. Pour l'instant, le cheminement d'un message venant de l'extérieur est le suivant :

  1. PC expéditeur
  2. Serveur expéditeur
  3. Serveur local (Postfix)
  4. Serveur local (Amavisd-new)
  5. Serveur local (Postfix envore une fois)
  6. Boite aux lettres

A cette étape, amavis et postfix communiquent, mais la liaison avec l'antivirus et l'antispam n'est pas faîte.

Il faut maintenant configurer le dialogue avec l'antivirus. Tout d'abord, on rajoute l'utilisateur clamav au groupe amavis :

monserveur:/# addgroup clamav amavis

Ensuite, on décommente les lignes suivantes du fichier /etc/amavis/conf.d/15-content_filter_mode :

monserveur:/# vi/etc/amavis/conf.d/15-content_filter_mode

@bypass_virus_checks_maps = (
    \%bypass_virus_checks, \@bypass_virus_checks_acl,\$bypass_virus_checks_re);

Maintenant, on relance les services :

monserveur:/# /etc/init.d/clamav-daemon restart
monserveur:/# /etc/init.d/amavis restart
monserveur:/# postfix reload

A partir de maintnenant si on recoit un email de l'extérieur, l'entête du message doit contenir une ligne supplémentaire qui ressemble à ça :

X-Virus-Scanned: Debian amavisd-new at monserveur.antiseches.net

Cette ligne nous montre que les emails sont scannés. Pour tester l'antivirus, il suffit d'envoyer un email avec en pièce jointe le fichier de test EICAR qui permet de tester les antivirus. EICAR n'est pas un virus, mais une simple suite de caractères qui est reconnue par tous les antivirus.

Maintenant que l'antivirus est opérationnel, on s'attaque à la lutte antispam. Dans les fichiers de configuration de postfix, on a mis un certain nombre de filtres mais ca ne suffira pas. Pour complèter l'installation il faut configurer spamassassin.

Il faut à nouveau éditer le fichier /etc/amavis/conf.d/15-content_filter_mode pour décommenter les lignes suivantes :

@bypass_spam_checks_maps = (
    \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

On démarre spamassassin et amavis :

monserveur:/#/etc/init.d/spamassassin restart
monserveur:/#/etc/init.d/amavis restart

Le contenu de /var/mail/log doit montrer les lignes suivantes lors du démarrage de amavis :

monserveur amavis[6799]: ANTI-VIRUS code loaded
monserveur amavis[6799]: ANTI-SPAM code loaded
monserveur amavis[6799]: ANTI-SPAM-SA code loaded

Si on essaie d'envoyer un email de test avec la chaine de caractère XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X, le mail est considéré comme du spam et donc est rejeté. Dans le journal de log /var/log/mail.log on verra apparaitre une ligne qui commence par le message suivant :

monserveur amavis[6801]: (06801-01) Blocked SPAM ...

C'est signe que le message a bien été bloqué.

Les emails rejetés par amavis sont stockés dans /var/lib/amavis/virusmails/
La configuration peut être modifiée grâce au fichier /etc/amavis/conf.d/20-debian_defaults

Technique n° 2 : filtrage sans amavisd

Cette technique est issue du wiki de spamassassin. Nous allons créer le script suivant : /usr/sbin/spamfilter :

#!/bin/sh
# Variables
SENDMAIL="/usr/sbin/sendmail -i"
EGREP=/bin/egrep
# Exit codes from <sysexits.h>
EX_UNAVAILABLE=69
# Number of *'s in X-Spam-level header needed to sideline message:
# (Eg. Score of 5.5 = "*****" )
SPAMLIMIT=5
# Clean up when done or when aborting.
trap "rm -f /tmp/out.$$" 0 1 2 3 15
# Pipe message to spamc
cat | /usr/bin/spamc -u nobody > /tmp/out.$$
# Are there more than $SPAMLIMIT stars in X-Spam-Level header? :
if $EGREP -q "^X-Spam-Level: \*{$SPAMLIMIT,}" < /tmp/out.$$
then
    # Option 1: Move high scoring messages to sideline dir so
    # a human can look at them later:
    # mv out.[1]
    # Option 2: redirection du message indésirable vers une adresse mailspéciale
    $SENDMAIL xyz@domaine.com < /tmp/out.$$
    # Option 3: On peut aussi supprimer simplement le message, mais c'estdangereux
    #rm -f /tmp/out.$$
else
    # Si ce n'est pas du spam, il part chez le bon destinataire
    $SENDMAIL "$@" < /tmp/out.$$
fi
# Postfix returns the exit status of the Postfix sendmail command.
exit $?

Ensuite on rend le script exécutable :

monserveur:/# chmod 755 /usr/sbin/spamfilter

On modifie le fichier /etc/postfix/master.cf pour qu'il ressemble à ca :

Sur la ligne qui commence par smtp, on ajoute la directive -o content_filter=spamfilter. (Attention, il peut y avoir plusieurs arguments -o)

smtp   inet     n     -     -     -     -     smtpd -o content_filter=spamfilter

A la fin du fichier on rajoute la ligne suivante :

spamfilter  unix        -        n        n        -        10        pipe
    flags=Rq user=nobody argv=/usr/sbin/spamfilter -f ${sender} -- ${recipient}

On recharge postfix

monserveur:/# postfix reload

Normalement, les spams devraient maintenant être redirigés vers l'adresse email prévue à cet effet, xyz@domaine.com

Il faut maintenant ajouter le filtrage des virus avec clamav. Cette fois encore, on va suivre les indications du wiki de spamassassin en l'adaptant à notre configuration.

On commence par installer le plugin clamav pour spamassassin qui peut être téléchargé sur cette page :

monserveur:/# cd/usr/local/src
monserveur:/usr/local/src# wget -c http://search.cpan.org/CPAN/authors/id/C/CF/CFABER/File-Scan-ClamAV-1.8.tar.gz
monserveur:/usr/local/src# tar -zxvfFile-Scan-ClamAV-1.8.tar.gz
monserveur:/usr/local/src# cd /usr/local/src/File-Scan-ClamAV-1.8
monserveur:/usr/local/src# mkdir /usr/share/perl5/File/Scan
monserveur:/usr/local/src# mv ./lib/File/Scan/ClamAV.pm /usr/share/perl5/File/Scan

Une fois que le plugin est en place, il faut créer les 2 fichiers suivants:

monserveur:/etc/spamassassin# vi /etc/spamassassin/clamav.cf

loadplugin ClamAV clamav.pm
full CLAMAV eval:check_clamav()
describe CLAMAV Clam Antivirus detected a virus
score CLAMAV 10

monserveur:/etc/spamassassin# vi /etc/spamassassin/clamav.pm

package ClamAV;
use strict;
use warnings;

use Mail::SpamAssassin;
use Mail::SpamAssassin::Plugin;
use File::Scan::ClamAV;

our @ISA = qw(Mail::SpamAssassin::Plugin);
our $CLAMD_SOCK = "/var/run/clamav/clamd.ctl";

sub new {
    my ( $class, $mailsa ) = @_;
    my $self = $class->SUPER::new( $mailsa );
    bless( $self, $class );
    $self->register_eval_rule( "check_clamav" );
    return $self;
}

sub _set_header {
    my ( $msgstatus, $header ) = @_;
    $sgstatus->{ main }->{ conf }->{ $_ }->{ "Virus" } = $header
    for qw( headers_spam headers_ham );
}

sub check_clamav {
    my ( $self, $permsgstatus, $fulltext ) = @_;
    my $clamav = File::Scan::ClamAV->new( port => $CLAMD_SOCK );
    my ( $code, $virus ) = $clamav->streamscan( ${ $fulltext } );
    if ( !$code ) {
        my $errstr = $clamav->errstr();
        Mail::SpamAssassin::Plugin::dbg( "ClamAV: Error scanning: $errstr");
        _set_header( $permsgstatus, "Error ($errstr)" );
        }
    elsif ( $code eq 'OK' ) {
        Mail::SpamAssassin::Plugin::dbg( "ClamAV: No virus detected" );
        _set_header( $permsgstatus, "No" );
        }
    elsif ( $code eq 'FOUND' ) {
        Mail::SpamAssassin::Plugin::dbg( "ClamAV: Detected virus: $virus" );
        _set_header( $permsgstatus, "Yes ($virus)" );
        return 1;
        }
    else {
        Mail::SpamAssassin::Plugin::dbg( "ClamAV: Error, unknown return code:$code" );
        _set_header( $permsgstatus, "Error (Unknown return code from ClamAV:$code)" );
        }
    return;
}
1;

Il faudra veiller à adapter la ligne our $CLAMD_SOCK= "/var/run/clamav/clamd.ctl" pour qu'elle pointe bien sur le bon socket. Maintenant que les fichiers sont créés, il n'y a plus qu'a redémarrer spamassassin pour que clamav teste tous les emails. Dés qu'un virus sera détecté, spamassassin lui attribuera un score de 10 et il sera rejeté.

Installation de postgrey

Postgrey est une solution de greylisting qui permet de faire un filtrage systématique des emails entrant en partant du principe suivant :

- Tous les emails entrants sont systèmatiquement rejetés
- Si la machine qui envoie le mail est convenablement configurée (cas d'un serveur "normal"), elle représentera le message au bout de quelques minutes
- Si la machine qui envoie le mail est mal configurée (cas d'un script qui envois du spam), le message ne sera pas représenté

Installation :

monserveur:/# aptitude install postgrey

Le démon postgrey écoute maintenant sur le port 6000 du serveur. L'étape suivant consiste à modifier le /etc/postfix/main.cf pour que Posftix Dialogue avec Postgrey. Pour cela, il suffit de rajouter la ligne check_policy_service inet:127.0.0.1:60000 à la directive smtpd_recipient_restrictions du fichier main.cf.

Installation du webmail

Maintenant que le serveur de messagerie est opérationnel, il faut installer la partie webmail.

Installation de LAMP

LAMP signifie Linux Apache MySQL PHP. Le webmail va donc fonctionner grâce au serveur Apache et des modules MySQL et PHP.

Il faut installer les paquets suivants :

monserveur:~# aptitude install apache2 php5 mysql-server-5.0 libapache2-mod-php5 php5-mysql libapache2-mod-auth-mysql

Comme on peut le voir sur la capture d'écran ci dessous, certains paquets complémentaires sont automatiquement installés comme mysql-client-5.0 :

Pendant la phase d'installation il faut répondre à quelques questions pour paramètrer les programmes.

Mode de passe du serveur Mysql :

Sauf cas particulier, ne pas gérer les comptes issus de Debian Sarge :

Aprés ces quelques écrans de configuration le serveur web est installé. On peut le vérifier en ouvrant un navigateur web et en tapant son nom ou son adresse IP.

Pour vérifier que le serveur MySql fonctionne également, on peut taper les commandes suivantes :

monserveur:~# mysql -uroot -p

Enter password: ********
Welcome to the MySQL monitor. Commands end with ;or \g.
Your MySQL connection id is 33
Server version: 5.0.51a-24+lenny2 (Debian)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
2 rows in set (0.00 sec)

mysql>
exit;
Bye

Par défaut ssl n'est pas actif et on ne pourra pas faire de https. Pour charger le module ssl, taper les commandes suivantes :

monserveur:~# a2enmod ssl && /etc/init.d/apache2 restart

Installation de Horde

Horde est un framework, c'est à dire une base qui va ensuite permettre d'installer d'autres outils comme :

- IMP (interface webmail)
- DIMP (interface webmail avec support AJAX)
- etc.

Installation des outils complémentaires au serveur LAMP

Pour que Horde puisse fonctionner, il faut installer d'autres paquets en complément à LAMP.

monserveur:~# aptitude install geoip-bin libmagic-dev libgeoip-dev memcached php5-dev php5-memcache php5-cli php-pear php5-imap php5-imagick php5-gd php5-mcrypt php5-ldap aspell-fr aspell-en

Le fait d'installer ces paquets nous oblige à installer tout un tas de dépendances. Il faudra répondre aux questions suivantes :

On continue avec les prérequis en mettant à jour PEAR et en installant quelques modules PEAR supplémentaires :

monserveur:~# pearchannel-update pear.php.net
Updating channel "pear.php.net"
Channel "pear.php.net" is up to date

monserveur:~# pear upgrade-all
Will upgrade channel://pear.php.net/pear
Will upgrade channel://pear.php.net/archive_tar
Will upgrade channel://pear.php.net/structures_graph
downloading PEAR-1.9.0.tgz ...
Starting to download PEAR-1.9.0.tgz (291,634 bytes)
.............................................done: 291,634 bytes
downloading Archive_Tar-1.3.3.tgz ...
Starting to download Archive_Tar-1.3.3.tgz (18,119 bytes)
...done: 18,119 bytes
downloading Structures_Graph-1.0.3.tgz ...
Starting to download Structures_Graph-1.0.3.tgz (30,191 bytes)
...done: 30,191 bytes
downloading XML_Util-1.2.1.tgz ...
Starting to download XML_Util-1.2.1.tgz (17,729 bytes)
...done: 17,729 bytes
upgrade-all ok: channel://pear.php.net/Archive_Tar-1.3.3
upgrade-all ok: channel://pear.php.net/Structures_Graph-1.0.3
upgrade-all ok: channel://pear.php.net/XML_Util-1.2.1
upgrade-all ok: channel://pear.php.net/PEAR-1.9.0
PEAR: Optional feature webinstaller available (PEAR's web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-basedinstaller)
PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-basedinstaller)
PEAR: To install optional features use "pear installpear/PEAR#featurename"

monserveur:~# pecl install fileinfo
monserveur:~# echo "extension=fileinfo.so" > /etc/php5/conf.d/fileinfo.ini
monserveur:~# pecl install lzf
monserveur:~# echo "extension=lzf.so" > /etc/php5/conf.d/lzf.ini
monserveur:~# pecl install geoip
monserveur:~# echo "extension=geoip.so" > /etc/php5/conf.d/geoip.ini
monserveur:~# pecl install json
monserveur:~# echo "extension=json.so" > /etc/php5/conf.d/json.ini
monserveur:~# /etc/init.d/apache2 restart

Téléchargement et paramétrage de horde-webmail

On télécharge horde-webmail sur le site ftp de horde.

monserveur:~# cd /var/www
monserveur:/var/www/horde# wget -c ftp://ftp.horde.org/pub/horde-webmail/horde-webmail-latest.tar.gz
monserveur:/var/www/horde# tar -zxvf horde-webmail-latest.tar.gz
monserveur:/var/www/horde# mv horde-webmail-1.2.5/ horde
monserveur:/var/www/horde# chown -R www-data:www-data horde

Ensuite on configure un hote virtuel dans Apache pour lui dire d'aller pointer sur bon répertoire du serveur quand on va aller sur le site http://webmail.antiseches.net. Pour ce faire on crée un fichier dans le répertoire /etc/apache2/sites-available :

monserveur:~# cd/etc/apache2/sites-available
monserveur:/etc/apache2/sites-available# vi horde

<VirtualHost *:80>
  ServerAdmin postmaster@localhost
  ServerName mail.antiseches.net
  DocumentRoot /var/www/horde
  CustomLog /var/log/apache2/horde combined
</VirtualHost>

<VirtualHost *:443>
  ServerAdmin postmaster@localhost
  ServerName mail.antiseches.net
  DocumentRoot /var/www/horde
  CustomLog /var/log/apache2/horde combined
  SSLEngine On
  # SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
  SSLCertificateFile /etc/ssl/cert/mails.pem
  SSLCertificateKeyFile /etc/ssl/key/mails.key
</VirtualHost>

On voit que pour la partie https, on ré-utilise les mêmes certificats.

Une fois le fichier créé, il faut relancer Apache avec la commande :

monserveur:~# /etc/init.d/apache2 restart

Maintenant, il est temps de configurer horde. Il faut aller dans le répertoire /var/www/horde/scripts et lancer le fichier setup.php. Ce script ne peut fonctionner que si php5-cli est installé.

monserveur:~# cd /var/www/horde/scripts
monserveur:/var/www/horde/scripts# ./setup.php

What is the root path on your weh server for this installation [/horde] ? horde

Horde Groupware Webmail Edition Configuration Menu
   (0) Exit

   (1) Configure database settings
   (2) Create database or tables
   (3) Configure administrator settings
   (4) Update PEAR for a new or changed location
   (5) Update from an older Horde Groupware Webmail Edition version

Type your choice:

Il faut maintenant lancer les menus 1 &2 et répondre aux différentes questions posées:

(1) Configure database settings :

- What database backend should we use : mysql
- Request persistent connections ? 0
- Username to connect to the database as* [] hordeuser
- Password to connect with [] hordepwd
- How should we connect to the database? [unix]tcp
- Database server/host*[] localhost
- Database name to use* [] horde
- Port the DB is running on, if non-standard[3306] 3306
- Internally used charset* [utf-8] utf-8
- Use SSL to connect to the server? [0]: 0
- Certification Authority to use for SSL connections[]
- Split reads to a different server?[false] false

Le fait d'avoir répondu à toutes ces questions va renseigner le fichier /var/www/horde/config/conf.php.

(2) Create database or tables

- Should we create the database for you? yes
- Le script demande ensuite le nom et le mot de passe de l'administrateur mysql et crée la base de données et les tables. Il demande également si on veut configurer METAR weather :

Loading database module...
Creating database...
[ OK ] Successfully created the database.
[ OK ] Successfully created the tables for Address Book (turba).
[ OK ] Successfully created the tables for Calendar (kronolith).
[ OK ] Successfully created the tables for Tasks (nag).
[ OK ] Successfully created the tables for Notes (mnemo).

Should we build the database with METAR weather stations now? This is necessary if you want to display METAR weather information. Building the database requires a network connection. [y]
(y) Yes
(n) No

Type your choice: y

Cannot find the location of your PHP CLI program. Please specify the full path to your PHP CLI or hit Enter if PHP is in your path. [/usr/bin/php] /usr/bin/php

Creating METAR database...
PHP Warning: Module 'json' already loaded in Unknown on line 0
PHP Warning: Module 'json' already loaded in Unknown on line 0
Done creating database.

On configure maintenant le compte administrateur :

(3) Configure administrator settings

Specify an existing mail user who you want to give administrator permissions (optional): remi

Writing main configuration file
Done configuring administrator settings.

Le fichier de configuration /var/www/horde/config/conf.php est maintenant créé, il ne reste plus qu'a upgrader PEAR :

(4) Update PEAR for a new or changed location

Updating PEAR commands...
Updating PEAR configuration...
Updating PEAR packages...
Updated 1 files.
Done updating PEAR location.

On peut maintenant quitter en sélectionnant le menu 0.

Note : Si le script de création de la base de données plante pour une raison quelconque, il faudra alors éditer le fichier groupware.mysql.sql qui se trouve dans /var/ww/horde/scripts/sql pour mettre à jour le nom du user (hordeuser) et le mot de passe (hordepwd) puis lancer la commande suivante :

monserveur:/var/www/horde/scripts/sql# mysql -uroot -p < create.mysql.sql

On peut vérifier que la base de données est créé avec la commande suivante:

monserveur:/var/www/horde/scripts/sql# mysql -uhordeuser -p

Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or\g.
Your MySQL connection id is 30
Server version: 5.0.51a-24+lenny2 (Debian)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| horde              |
+--------------------+
2 rows in set (0.00 sec)

On peut se connecter à l'adresse http://webmail.antiseches.net/test.php pour vérifier que tout soit correct.

Si aucun message d'erreur apparait, on peut se connecter au webmail avec l'adresse http://webmail.antiseches.net.

Note : en cas de problèmes de connexion, éditer le fichier /www/horde/config/conf.php et mettre à false la ligne $conf['session']['use_only_cookies'] =false;.

Installation de vacation

Vacation est un module qui permet de configurer un répondeur automatique. On peut par exemple s'en servir pour dire qu'on est parti en vacances et que l'on ne lira pas ses emails pendant quelques temps. D'où son nom ...

Pour que Vacation puissent fonctionner, il faut qu'un serveur ftp fonctionne sur la machine.

Télécharger l'archive sur le serveur ftp de horde et la décompresser :

monserveur:~# cd /var/www/
monserveur:/var/www# wget -c ftp://ftp.horde.org/pub/vacation/vacation-latest.tar.gz
monserveur:/var/www# tar -zxvf vacation-latest.tar.gz
monserveur:/var/www# mv vacation-h3-3.2 /var/www/horde/vacation
monserveur:/var/www# chown -R www-data:www-data /var/www/horde/vacation/

Parametrage de vacation

Aller dans le fichier /var/www/horde/config/registry.php et chercher la section applications['vacation']. Normalement les réglages par défaut doivent convenir sauf si le chemin relatif de vacation par rapport à la racine de horde a changé. Vérifier quand même que le statut soit active.

Ensuite, il faut se connecter sur l'interface web de horde en administrateur et aller dans le menu Administration / Configuration / Vacation pour remplir ou modifier le questionnaire, puis cliquer sur le bouton Generate Vacation Configuration pour créer le fichier vacation/config/conf.php.

Note : j'ai laissé la configuration par défaut sauf les items suivant :

- $conf[vacation][from] : Décocher la case pour ne pas que les utilisateurs puissent changer le nom de l'expéditeur.
- $conf[server][params][default][hordeauth] : Yes with Full Username pour que les utilisateurs n'aient pas à entrer leur mot de passe pour mettre en place le message d'absence.
- $conf[aliases][show] : Décocher la case pour ne pas que les utilisateurs puissent changer l'alias.

Lors d'un test de vacation, il y a le message d'erreur suivant : Call to a member function hasCapability() on a non-object in /var/www/horde/vacation/lib/Driver.php on line 255. Ceci est dû à un bug dans le module vacation/lib/Driver.php. Voir à l'adresse http://bugs.horde.org/ticket/8808. Il faut donc patcher le ou le modifier (la solution la plus simple) en modifiant la ligne n° 255 du fichier de :

$driver->hasCapability('changeFrom')) {

en :

$this->hasCapability('changeFrom')) {

Le module fonctionne maintenant correctement.

Installation de forwards

A l'instat de Vacations, Forwards est un module qui permet de configurer une redirection automatique des emails dés leur réception.

Pour que Forwards puissent fonctionner, il faut qu'un serveur ftp fonctionne sur la machine.

Télécharger l'archive sur le serveur ftp de horde et la décompresser :

monserveur:~# cd /var/www/
monserveur:/var/www# wget -c ftp://ftp.horde.org/pub/forwards/forwards-latest.tar.gz
monserveur:/var/www# tar -zxvf forwards-latest.tar.gz
monserveur:/var/www# mv forwards-h3-3.2 /var/www/horde/forwards
monserveur:/var/www# chown -R www-data:www-data /var/www/horde/forwards/

Parametrage de forwards

Aller dans le fichier /var/www/horde/config/registry.php et chercher la section applications['forwards']. Normalement les réglages par défaut doivent convenir sauf si le chemin relatif de forwards par rapport à la racine de horde a changé. Vérifier quand même que le statut soit active.

Ensuite, il faut se connecter sur l'interface web de horde en administrateur et aller dans le menu Administration / Configuration / Forwards pour remplir ou modifier le questionnaire, puis cliquer sur le bouton Generate Vacation Configuration pour créer le fichier forwards/config/conf.php.

Note : j'ai laissé la configuration par défaut sauf les items suivant :

- $conf[enabled][authenticate] : Décocher la case pour ne pas que les utilisateurs soient obligés de confirmer par leur mot de passe.

Note sur les permissions des fichiers de Horde : pour sécuriser un peu l'installation, il faut lancer le script bash qui se trouve dans /var/www/horde/scripts/set_perms.sh.

Annexes

Quelques commandes de traitement de la file d'attente Postfix

Lister tous les mails en attente :

mailq ou postqueue -p

Supprimer un message de la file d'attente :

postsuper -d DBA1F1A8

Supprimer tous les messages en attente dans la file :

postsuper -d ALL

Lire le contentu d'un message qui se trouve en attente :

postcat -q DBA1F1A8

Mettre un messages en attente :

postsuper -h DBA1F1A8

Remettre le messages en mode normal actif :

postsuper -H DBA1F1A8

Remettre en Queue un message :

postsuper -r DBA1F1A8

Remettre en queue tous les messages :

postsuper -r ALL

Forcer l'envoie des messages en Queue (flush) :

postqueue -f

Téléchargement des fichiers de configuration

Dovecot

/etc/dovecot/dovecot.conf
/etc/dovecot/dovecot-ldap.conf

Postfix

/etc/postfix/main.cf