Installation d'un serveur de mail Zimbra 6.0 sous debian lenny

De Linux Server Wiki
Sauter à la navigation Sauter à la recherche


  • Cette page n'est plus maintenue, les informations contenues ici sont potentiellement obsolètes

Zimbra est un serveur collaboratif (groupware) Open Source. Il permet d'échanger des emails, gérer et partager son calendrier, ses contacts, documents. Il est livré par défaut avec un webmail en ajax ainsi qu'une version mobile en html. Compatible avec les protocoles IMAP, POP et iCal, Zimbra permet d'utiliser n'importe quel client email graphique.

Nous allons voir comment déployer la solution Zimbra Open Source Edition sur un serveur sous debian lenny 64 bits avec quelques spécificités qui ne sont pas supportés officiellement par zimbra dans sa version 6 :

  • support ipv6
  • utilisation d'une seule adresse ip (par défaut, zimbra bind ses services sur toutes les ips configurés sur le serveur)


1 Prérequis

Pour commencer, installer les paquets nécessaire à zimbra ainsi que le paquet file :

aptitude install sudo libidn11 libpcre3 libexpat1 sysstat libperl5.10 file

A faire sinon zimbra fail a la détection de rsyslogd Ensuite, créez le fichier /etc/rsyslog.d/50-default.conf (vide). Si ce fichier n'existe pas, l'installateur de zimbra ne détectera pas rsyslog.

echo "" > /etc/rsyslog.d/50-default.conf

Redémarrez rsyslog :

/etc/init.d/rsyslog restart

2 Installation de Zimbra

Pour commencer, téléchargez la dernière version de zimbra 6 pour debian lenny sur http://www.zimbra.com/downloads/os-downloads.html

Extrayez l'archive et lancez l'installeur :

tar xf zcs-6.0.10_GA_2692.DEBIAN5_64.20101215161159.tgz
cd zcs-6.0.10_GA_2692.DEBIAN5_64.20101215161159
./install.sh

L'installation est assez triviale. Lorsque zimbra vous demandera le mode http à utiliser, définissez le en mode redirect. Ainsi, zimbra forcera l'utilisation de https. Une fois l'installation terminée, Zimbra sera lancé automatiquement. Les différents fichiers ont été installés dans /opt/zimbra.

Ajoutez l'utilisateur zimbra a la liste des utilisateurs autorisés a se connecter en ssh dans la configuration de openssh (directive allowusers) (c'est nécessaire pour certaines fonctions de l'interface d'administration de zimbra).
Redémarrez ssh :

/etc/init.d/ssh restart

3 Création de son propre certificat ssl signé par son autorité de certification

Nous allons supposer que vous avez déjà créé votre autorité de certification root ainsi qu'une autorité intermédiaire (nommée onyx dans mon cas). Si ce n'est pas le cas, je vous renvoi ici. Ajouter les lignes suivante dans la configuration de openssl :

[ZIMBRA]
nsComment                       = "ONYX Zimbra Server"
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always
issuerAltName                   = issuer:copy
subjectAltName                  = DNS:onyx.csnu.org, DNS:imap.csnu.org, DNS: pop.csnu.org, DNS: smtp.csnu.org, DNS:webmail.csnu.org, DNS:mail.csnu.org
basicConstraints                = critical,CA:FALSE
keyUsage                        = critical, digitalSignature, nonRepudiation, keyEncipherment
nsCertType                      = server
extendedKeyUsage                = serverAuth

Puis créez le certificat et signés le avec votre autorité intermédiaire :

cd /etc/ssl/ca_onyx/
openssl req -config /etc/ssl/openssl.cnf -nodes -newkey rsa:2048 -keyout zimbra.key -out zimbra.req
openssl ca -config /etc/ssl/openssl.cnf -name onyx_ca -extensions ZIMBRA -in zimbra.req -out zimbra.pem

Les fichiers nécessaires au déploiement du certificat ssl dans zimbra sont les suivants :

  • root_ca.pem : le certificat root
  • onyx_ca.pem : le certificat de l'autorité intermédiaire ayant déployé le certificat zimbra
  • zimbra.pem : le certificat zimbra généré précédemment
  • zimbra.key : la clé privé zimbra générée précédemment

Attention, veillez a ce que ces différents fichiers ne contiennent rien d'autre que les certificats et clés pures (entre le begin et le end inclut) sans aucun commentaire ou autre !
Pour un certificat :

-----BEGIN CERTIFICATE-----
blahblah
-----END CERTIFICATE-----

Pour une clé :

-----BEGIN RSA PRIVATE KEY-----
blahlah
-----END RSA PRIVATE KEY-----

Nous allons maintenant déployer le certificat ssl dans zimbra.
Pour commencer, créez le fichier ca_chain.pem contenant la chaine de certification complète :

cat root_ca.pem onyx_ca.pem > ca_chain.pem

Déplacez la clé privée :

mv zimbra.key /opt/zimbra/ssl/zimbra/commercial/commercial.key

Vous pouvez vérifier que vos certificats sont valides avec zmcertmgr :

/opt/zimbra/bin/zmcertmgr verifycrt comm /opt/zimbra/ssl/zimbra/commercial/commercial.key zimbra.pem ca_chain.pem

Puis déployez le certificat dans zimbra avec zmcertmgr :

/opt/zimbra/bin/zmcertmgr deploycrt comm zimbra.pem ca_chain.pem

Enfin, ajoutez manuellement les certificats dans la base de donnée de zimbra (et oui, le password est bien changeit par défaut) :

/opt/zimbra/java/bin/keytool -import -alias onyxzimbra -keystore /opt/zimbra/java/jre/lib/security/cacerts -storepass changeit -file /opt/zimbra/conf/ca/commercial_ca.pem
/opt/zimbra/java/bin/keytool -import -alias rootca -keystore /opt/zimbra/java/jre/lib/security/cacerts -storepass changeit -file root_ca.pem
/opt/zimbra/java/bin/keytool -import -alias onyxca -keystore /opt/zimbra/java/jre/lib/security/cacerts -storepass changeit -file onyx_ca.pem

Redémarrez zimbra :

/etc/init.d/zimbra restart

4 Support de l'ipv6 et bind sur une seule ip

Zimbra 6 ne supporte pas officiellement l'ipv6. Cependant, les différentes applications dont zimbra est composé supportent toute l'ipv6.

4.1 Imap et pop

Les serveurs imap et pop de zimbra sont en java. Ils chargent leur configuration par ldap. Par défaut, ils écoutent sur toutes les ips configurés sur le serveur (et donc les ipv6 aussi). N'ayant pas besoin de limiter les ips du serveur imap et pop, j'ai préféré ne pas toucher à la configuration.
A titre d'information, vous pouvez modifier la configuration imap et pop en vous connectant avec un client ldap sous le répertoire cn=server,cn=<hostname de votre zimbra>. Les champs à modifier sont les suivants :

zimbraPop3BindAddress
zimbraPop3SSLBindAddress
zimbraImapBindAddress
zimbraImapSSLBindAddress
zimbraLmtpSSLBindAddress

4.2 postfix (smtp)

Modifiez le fichier /opt/zimbra/postfix/conf/main.cf :

inet_protocols = all
inet_interfaces = 127.0.0.1, [::1], 87.98.144.196, [2001:41d0:1:bcdc::196]

Selon la doc de postfix : When inet_interfaces specifies just one IPv4 and/or IPv6 address that is not a loopback address, the Postfix SMTP client will use this address as the IP source address for outbound mail. Support for IPv6 is available in Postfix version 2.2 and later.

Postfix ne bindera donc que sur les 4 ips précisés, et utilisera l'ip locale OU internet selon qu'il doive s'adresser à un service local (antispam, ...) ou externe.

L'intérêt de forcer les ips de postfix est notamment de simplifier les champs dns SPF.

4.3 jetty

Jetty est le serveur http utilisé par zimbra pour le webmail.

Les fichiers a éditer sont les suivants :

  • /opt/zimbra/jetty/etc/jetty.xml.in : la configuration de jetty
  • /opt/zimbra/mailboxd/etc/zimbra.web.xml.in : ce fichier fait le lien entre le service mail de zimbra et l'interface webmail
  • /opt/zimbra/mailboxd/etc/zimbraAdmin.web.xml.in : ce fichier fait le lien entre le service mail de zimbra et l'interface admin

Nous allons réaliser les actions suivantes :

  • forcer le webmail a binder sur une seule adresse ipv4 sur les ports 80 et 443
  • forcer le webmail a binder sur une seule adresse ipv6 sur les ports 80 et 443
  • l'interface admin continuera à binder sur toutes les ips (a ma dernière tentative, zimbra il était impossible de supporter à la fois l'ipv6 et binder sur une seule ip avec l'interface admin)

Ainsi, si votre serveur dispose -comme le mien- de plusieurs ips, vous pourrez lancer sans problème un autre serveur web sur l'une des autres ips.

4.3.1 Modification de la configuration de jetty

Le fichier /opt/zimbra/jetty/etc/jetty.xml.in défini différents connector qui vont se charger de binder sur les différentes ips/ports. Par défaut, il y en a trois : user services connector, no SSL, user services connector, SSL et Admin services connector; requires SSL. Je rappel encore une fois que ma dernière tentative de binder le connector admin sur une seule ipv4 et une seule ipv6 a échouée.

Pour chacun de ces connecteurs (sauf le connecteur admin), il faudra ajouter une ligne de ce type afin de forcer l'ip :

<Set name="Host">XX.XX.XX.XX</Set>

De plus, il faudra dupliquer ces différents connecteurs afin d'y définir l'ipv6. On passera donc de 2 connecteurs (user no ssl et user ssl) à 4.

En gros, vous devriez avec une configuration de ce type :

    <!-- =========================================================== -->
    <!-- Set connectors                                              -->
    <!-- =========================================================== -->

    <!-- user services connector, no SSL -->
    <!-- HTTPBEGIN -->
    <Call name="addConnector">
      <Arg>
        <New id="http" class="org.mortbay.jetty.nio.SelectChannelConnector">
          <Set name="port"><SystemProperty name="jetty.port" default="%%zimbraMailPort%%"/></Set>
          <Set name="maxIdleTime">30000</Set>
          <Set name="lowResourceMaxIdleTime">1000</Set>
          <Set name="Acceptors">2</Set>
          <Set name="confidentialPort">%%zimbraMailSSLPort%%</Set>
          <Set name="useDirectBuffers">%%zimbraMailUseDirectBuffers%%</Set>
          <Set name="Host">87.98.144.196</Set>
        </New>
      </Arg>
    </Call>

<!-- HTTPEND -->
    <!-- user services connector, no SSL, ipv6 -->
    <!-- HTTPBEGIN -->
    <Call name="addConnector">
      <Arg>
        <New id="http" class="org.mortbay.jetty.nio.SelectChannelConnector">
          <Set name="port"><SystemProperty name="jetty.port" default="%%zimbraMailPort%%"/></Set>
          <Set name="maxIdleTime">30000</Set>
          <Set name="lowResourceMaxIdleTime">1000</Set>
          <Set name="Acceptors">2</Set>
          <Set name="confidentialPort">%%zimbraMailSSLPort%%</Set>
          <Set name="useDirectBuffers">%%zimbraMailUseDirectBuffers%%</Set>
          <Set name="Host">2001:41d0:1:bcdc::196</Set>
        </New>
      </Arg>
    </Call>
<!-- HTTPEND -->

    <!-- user services connector, SSL -->
    <!-- HTTPSBEGIN -->
    <Call name="addConnector">
      <Arg>
        <New id="ssl" class="org.mortbay.jetty.security.SslSelectChannelConnector">
          <Set name="Port">%%zimbraMailSSLPort%%</Set>
          <Set name="useDirectBuffers">%%zimbraMailUseDirectBuffers%%</Set>
          <Set name="maxIdleTime">30000</Set>
          <Set name="lowResourceMaxIdleTime">1000</Set>
          <Set name="Acceptors">2</Set>
          <Set name="keystore"><SystemProperty name="jetty.home" default="."/>/etc/keystore</Set>
          <Set name="password">@@mailboxd_keystore_password@@</Set>
          <Set name="KeyPassword">@@mailboxd_keystore_password@@</Set>
          <Set name="ExcludeCipherSuites">
            <Array type="java.lang.String">
              %%zimbraSSLExcludeCipherSuitesXML%%
            </Array>
          </Set>
          <Set name="Host">87.98.144.196</Set>
        </New>
      </Arg>
    </Call>
<!-- HTTPSEND -->

    <!-- user services connector, SSL,v6 -->
    <!-- HTTPSBEGIN -->
    <Call name="addConnector">
      <Arg>
        <New id="ssl" class="org.mortbay.jetty.security.SslSelectChannelConnector">
          <Set name="Port">%%zimbraMailSSLPort%%</Set>
          <Set name="useDirectBuffers">%%zimbraMailUseDirectBuffers%%</Set>
          <Set name="maxIdleTime">30000</Set>
          <Set name="lowResourceMaxIdleTime">1000</Set>
          <Set name="Acceptors">2</Set>
          <Set name="keystore"><SystemProperty name="jetty.home" default="."/>/etc/keystore</Set>
          <Set name="password">@@mailboxd_keystore_password@@</Set>
          <Set name="KeyPassword">@@mailboxd_keystore_password@@</Set>
          <Set name="ExcludeCipherSuites">
            <Array type="java.lang.String">
              %%zimbraSSLExcludeCipherSuitesXML%%
            </Array>
          </Set>
          <Set name="Host">2001:41d0:1:bcdc::196</Set>
        </New>
      </Arg>
    </Call>
<!-- HTTPSEND -->

4.3.2 Modification de la configuration de mailboxd

Éditez le fichier /opt/zimbra/mailboxd/etc/zimbra.web.xml.in et localisez les lignes suivantes :

    <!-- =============
        <context-param>
           <param-name>zimbra.soap.url</param-name>
           <param-value>http://localhost:7070/service/soap</param-value>
        </context-param>
    -->

Et remplacez les par les suivantes :

        <context-param>
           <param-name>zimbra.soap.url</param-name>
           <param-value>https://87.98.144.196/service/soap</param-value>
        </context-param>

Notez bien que http est devenu https ainsi que la disparition du port.

N'oubliez pas de supprimer  ! Ce sont les marqueurs qui définissent la section comme commentaire.

A titre d'information, si on avait modifié la configuration de l'interface d'administration dans la configuration de jetty, il aurait fallu modifier /opt/zimbra/mailboxd/etc/zimbraAdmin.web.xml.in de la même manière.

4.4 Redémarrage

Enfin, redémarrez zimbra afin qu'il prenne en compte la configuration.

/etc/init.d/zimbra restart

Je vous conseil vivement de sauvegarder les différents fichiers que vous avez modifié au cas où une mise à jour de zimbra viendrait les écraser.

5 Migration des comptes imap d'un ancien serveur à notre installation zimbra

Installez l'outil imapsync:

aptitude install imapsync

Commencez par créer les différents comptes et leurs alias et vous connectant à l'interface d'administration de zimbra (https://votre-domaine:7071). Ensuite, utilisez l'outil imapsync pour répliquer les comptes :

imapsync --host1 serveur1.domain.com --user1 utilisateur@domain.com --password1 <pass> \
  --host2 serveurzimbra.domain.com --user2 utilisateur@domain.com --authmecH2 PLAIN --password2 <pass2> --ssl2

6 Ajouter des zimlets

Une galerie de zimlets (extension pour zimbra) est disponible sur http://gallery.zimbra.com/

Pour les installer, rien de plus simple :

su - zimbra
zmzimletctl deploy <zimlet>

7 Mise a jour de sécurité de zimbra

télécharger le .tgz, l'extraire, puis lancer le ./install.sh

8 Réaliser des backups des comptes mails de zimbra

Je vous renvoi sur http://wiki.zimbra.com/wiki/Backing_up_and_restoring_Zimbra_%28Open_Source_Version%29#Another_option

9 Activer les mails de crontab du serveur

Vous avez installé un serveur mail, mais debian n'en est pas conscient. Pour recevoir les mails de crontab par exemple, il faut créer un lien symbolique de /usr/sbin/sendmail vers /opt/zimbra/postfix/sbin/sendmail

ln -s /opt/zimbra/postfix/sbin/sendmail /usr/sbin/sendmail

10 Configuration de spamassassin

N'oubliez pas d'ajouter les directives internal_networks et trusted_networks dans /opt/zimbra/conf/spamassassin/local.conf. Ces directives doivent contenir les ips de vos différents mx secondaires.