Table des matières

Installer le serveur IMAP Cyrus sur Debian 4.0 Etch et 5.0 Lenny

Par Pierre-Yves Landuré ( http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-le-serveur-imap-cyrus-sur-debian-4-0-etch-et-5-0-lenny )

Installation du serveur Cyrus IMAP et le client MySQL:

Cyrus :

 apt-get install cyrus-imapd-2.2 cyrus-admin-2.2 mysql-client libsasl2-modules-sql openssl apg

MySQL :

Mise en place de la base de données Nous allons utiliser MySQL pour stocker les domaines et les utilisateurs de notre serveur e-mail. Pour ce faire, installez un serveur MySQL et créez une base de données CYRUS. Cela peut être fait en suivant mon guide:

Une fois la base de donnée créée, nous plaçons une valeur par défaut pour le nom d'hôte du serveur de la base de données:

if [ -z "$MYSQL_HOST" ]; then
  MYSQL_HOST=localhost
fi

Attention : Si vous avez suivi mon guide sur le même hôte que votre serveur Cyrus Imap, vous pouvez passer ces lignes de commandes, sinon, remplacer les informations en gras par celles correspondant à votre base de données MySQL :

MYSQL_HOST=localhost
MYSQL_DB=CYRUS
MYSQL_USERNAME=cyrus
MYSQL_USERPWD=cyrus_password

Puis, nous créons les tables nécessaires:

/usr/bin/wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-le-serveur-imap-cyrus-sur-debian-4-0-etch/cyrus-schema.sql \
    --output-document=/tmp/cyrus-schema.sql
/bin/cat /tmp/cyrus-schema.sql | /usr/bin/mysql --user=$MYSQL_USERNAME --password=$MYSQL_USERPWD --host=$MYSQL_HOST $MYSQL_DB

Création des certificats SSL

Pour accéder à votre serveur IMAP, je vous recommande de créer le sous-domaine suivants:

Pour compléter ces sous-domaines, créez le certificat SSL correspondant à ces deux sous-domaines en suivant mon guide:

Créer un certificat SSL multi-domaines

De même, pour accéder à votre serveur SMTP, je vous recommande la création du sous-domaine suivant ainsi que du certificat SSL associé:

Et nous rendons les clefs privées uniquement lisibles par les utilisateurs qui en ont besoin:

/bin/chmod go+rx /etc/openssl/PRIVATE_KEYS
/bin/chown cyrus:mail /etc/openssl/PRIVATE_KEYS/imap_key.pem
/bin/chmod go-rwx /etc/openssl/PRIVATE_KEYS/imap_key.pem
/bin/chown Debian-exim:mail /etc/openssl/PRIVATE_KEYS/smtp_key.pem
/bin/chmod go-rwx /etc/openssl/PRIVATE_KEYS/smtp_key.pem

Configuration du serveur IMAP

Création de l'administrateur

En premier lieu, nous configurons le domaine par défaut de notre serveur e-mail:

DEFAULT_DOMAIN=main-domain.com

Et nous configurons l'utilisateur destiné à administrer notre serveur:

ADMIN_USERNAME=cyrus
ADMIN_PASSWORD=`/usr/bin/apg -q -a  0 -n 1 -M NCL`

Nous affichons les informations de connexion ainsi créées:

/bin/echo "L'administrateur de votre serveur IMAP a pour identifiant '$ADMIN_USERNAME' et pour mot de passe '$ADMIN_PASSWORD'."

Nous insérons ces informations dans la base de données MySQL:

/bin/echo "INSERT INTO domain(name) VALUES ('$DEFAULT_DOMAIN');
INSERT INTO user (domain_id, username, password, enabled, has_mailbox) VALUES (
  (SELECT id FROM domain WHERE name='$DEFAULT_DOMAIN'),
  '$ADMIN_USERNAME', '$ADMIN_PASSWORD', 1, 0);" \
    | /usr/bin/mysql --user=$MYSQL_USERNAME --password=$MYSQL_USERPWD --host=$MYSQL_HOST $MYSQL_DB

Configuration de Cyrus

Nous faisons en sorte que Cyrus puisse se servir de la base de données de SASL:

/usr/sbin/adduser cyrus sasl

Nous configurons les services de Cyrus que nous allons utiliser (ou pour être plus exact, ceux que nous n'allons pas désactiver):

/bin/sed -i -e 's/^\([ \t]*\)\(pop3[ \t]\{1\}.*\)$/\1#\2/' \
            -e 's/^\([ \t]*\)\(nntp[ \t]\{1\}.*\)$/\1#\2/' \
            -e 's/^\([ \t]*\)\(imaps[ \t]\{1\}.*\)$/\1#\2/' \
            -e 's/^\([ \t]*\)\(pop3s[ \t]\{1\}.*\)$/\1#\2/' \
            -e 's/^#*\([ \t]*\)#*\(imap[ \t]\{1\}.*imapd.*\)$/\1\2/' \
            -e 's/^#*\([ \t]*\)#*\(lmtp[ \t]\{1\}.*lmtpd.*\)$/\1\2/' \
            -e 's/^#*\([ \t]*\)#*\(lmtpunix[ \t]\{1\}.*lmtpd.*\)$/\1\2/' \
         /etc/cyrus.conf

Nous faisons en sorte que l'authentification ne soit pas nécessaire pour les connexions TCP au port lmtp :

/bin/sed -i -e 's/^\(.*lmtp[ \t]\{1\}.*cmd="\)[^"]*\(".*$\)/\1lmtpd -a\2/' \
         /etc/cyrus.conf

Nous définissons le port pour lmtp :

/bin/echo -e "lmtp\t\t2003/tcp\t\t\t# Cyrus IMAP lmtp" | /usr/bin/tee -a /etc/services

Nous configurons Cyrus pour autoriser les points dans les noms d'utilisateurs (c.a.d. les points dans les adresses électroniques) :

/bin/sed -i -e 's/^\(unixhierarchysep:\).*/\1 yes/' /etc/imapd.conf

Nous configurons le serveur IMAP pour utiliser l'identification via SASL, ainsi pour que l'utilisateur cyrus soit parmis les administrateurs:

/bin/sed -i -e "s/^[#]*\(admins:\).*/\1 $ADMIN_USERNAME/" \
            -e 's/^[#]*\(sasl_mech_list:\).*/\1 PLAIN DIGEST-MD5 CRAM-MD5/' \
            -e 's/^[#]*\(sasl_minimum_layer:\).*/\1 0/' \
            -e 's/^[#]*\(sasl_pwcheck_method:\).*/\1 auxprop/' \
            -e 's/^[#]*\(sasl_pwcheck_method:\).*/\1 auxprop/' \
            -e 's/^[#]*\(sasl_pwcheck_method:\).*/\1 auxprop/' \
            -e 's/^[#]*\(virtdomains:\).*/\1 userid/' \
            -e "s/^[#]*\(defaultdomain:\).*/\1 $DEFAULT_DOMAIN/" \
 /etc/imapd.conf

Nous configurons maintenant le serveur Cyrus pour récupérer les utilisateurs dans la base de données MySQL:

/bin/sed -i -e 's/^[#]*\(sasl_auxprop_plugin:\).*/\1 sql/' \
            -e "/^[#]*\(sasl_auxprop_plugin:\).*/a\\
sasl_sql_engine: mysql\\
sasl_sql_hostnames: $MYSQL_HOST\\
sasl_sql_user: $MYSQL_USERNAME\\
sasl_sql_passwd: $MYSQL_USERPWD\\
sasl_sql_database: $MYSQL_DB\\
sasl_sql_select: SELECT user.password AS userPassword FROM user JOIN domain ON (user.domain_id = domain.id) WHERE (domain.name='%r' OR ('%r' =  'cyrus' AND domain.name='$DEFAULT_DOMAIN')) AND user.username='%u' AND user.enabled=1;\\
sasl_sql_update: UPDATE user SET user.password = '%v' FROM domain WHERE user.username = '%u' AND user.domain_id = domain.id AND (domain.name='%r' OR ('%r' = 'cyrus' AND domain.name='$DEFAULT_DOMAIN')) AND user.enabled=1;" \
         /etc/imapd.conf

Nous configurons maintenant le cryptage TLS:

/bin/sed -i -e 's|^[#]*\(tls_cert_file:\).*|\1 /etc/openssl/CERTIFICATES/imap_cert.cert|' \
            -e 's|^[#]*\(tls_key_file:\).*|\1 /etc/openssl/PRIVATE_KEYS/imap_key.pem|' \
            -e 's|^[#]*\(allowplaintext:\).*|\1 no|' \
         /etc/imapd.conf

Nous redémarrons le serveur afin de prendre en compte ces modifications:

/etc/init.d/cyrus2.2 restart

Gestion des filtres de messages depuis un client distant

Cyrus dispose d'un langage de description des filtres de messages : Sieve. Ainsi, il est possible de configurer des filtres de message coté serveur à l'aide de certain clients (Thunderbird, Horde, etc). Personnellement, je me sert du Webmail Horde (que vous pouvez installer en suivant mon guide ) pour ce faire. Cependant, si le webmail (ou le client) est installé sur une machine différente de celle du serveur, il est nécessaire de configurer le démon timsieved pour qu'il écoute les connexions en provenance du réseau. Cela se fait à l'aide de cette ligne de commande :

/bin/sed -i -e 's/localhost:sieve/sieve/' /etc/cyrus.conf

Une fois ceci fait, redémarrez Cyrus pour prendre en compte les modifications :

/etc/init.d/cyrus2.2 restart

Création automatique des boîtes e-mails

La base de données permet de stocker de manière simple et lisibles les informations de connexion des utilisateurs. Il faut cependant explicitement créer une boîtes e-mail une fois l'utilisateur ajouté à la base de données.

Nous allons donc mettre en place un script qui effectue cette manipulation automatiquement:

/usr/bin/wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-le-serveur-imap-cyrus-sur-debian-4-0-etch/cyrus_create_mailboxes \
    --output-document=/etc/cron.hourly/cyrus_create_mailboxes
/bin/sed -i -e "s/MSQL_HOST/$MYSQL_HOST/" \
            -e "s/MSQL_DB/$MYSQL_DB/" \
            -e "s/MSQL_USERNAME/$MYSQL_USERNAME/" \
            -e "s/MSQL_USERPWD/$MYSQL_USERPWD/" \
            -e "s/ADMIN_LOGIN/$ADMIN_USERNAME/" \
            -e "s/ADMIN_PWD/$ADMIN_PASSWORD/" \
         /etc/cron.hourly/cyrus_create_mailboxes
/bin/chmod 500 /etc/cron.hourly/cyrus_create_mailboxes