Mise en place nginx + https + zpush avec Zimbra OpenSource

Billet posté le 12 mai 2016

Contexte

J’utilise Zimbra en version OpenSource pour ma messagerie personnelle, de ma famille ainsi que pour quelques amis.

Nous allons décrire très rapidement ici la mise en place d’un reverse proxy nginx avec utilisation de HTTPS afin de pouvoir fournir une synchronisation de type ActiveSync à un téléphone intelligent.

Certificat SSL

J’utilise startssl qui a le mérite de fournir un certificat SSL gratuitement et bien reconnu dans les navigateurs du marché.

Le processus est le suivant :

  • inscrivez-vous sur startssl
  • générer une clé privée
  • générer une demande de certificat (CSR)
  • soumettez votre CSR à startssl et en échange vous obtenez un certificat SSL (CRT)

Génération de la clé privée ainsi que du CSR :

openssl req -new -newkey rsa:2048 -nodes -sha256 -out zpush.lovetux.net.csr -keyout zpush.lovetux.net.key -subj "/C=FR/ST=Indre-Et-Loire/L=Tours/O=Lovetux/CN=zpush.lovetux.net"

Le fichier à soumettre est “zpush.lovetux.net.csr” et surtout pas le fichier zpush.lovetux.net.key qui est la clé privée. La clé privée comme son nom l’indique ne doit jamais sortir de votre serveur et ne jamais être divulguée.

Votre autorité de certification, ici startssl, va donc générer votre certificat SSL.

Le VirtualHost nginx

Nous allons créer le dossier /etc/nginx/ssl afin de pouvoir y déposer la clé privée, ainsi que le certificat SSL.

server {
        listen 443;
        listen [::]:443;
        server_name zpush.lovetux.net;
        client_max_body_size 100m;

        access_log  /var/log/nginx/zpush.lovetux.net.access.log;
        error_log  /var/log/nginx/zpush.lovetux.net.error.log;

        root /srv/sites/hindy/zpush.lovetux.net;

        location /Microsoft-Server-ActiveSync {
                rewrite ^(.*)$  /index.php last;
        }

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

        ssl on;
        ssl_certificate /etc/nginx/ssl/zpush.lovetux.net.chained.crt;
        ssl_certificate_key /etc/nginx/ssl/zpush.lovetux.net.key;

        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
        ssl_prefer_server_ciphers   on;
        ssl_session_cache shared:SSL:10m;

}

Il est à noter plusieurs éléments dans ce fichier de configuration :

  • nginx écoute à la fois en ipv4 et en ipv6 (on est in ou on ne l’est pas)
  • le serveur répond au nom de zpush.lovetux.net
  • zpush est déployé dans un dossier particulier (/srv/sites/hindy/zpush.lovetux.net)
  • utilisation de php5 fpm avec une socket unix
  • on utilise ssl en précisant la clé privée ainsi que le certificat SSL
  • on désactive / active un certain nombre d’algorithmes qui permettent d’avoir une sécurité renforcée dans les échanges entre le client et le serveur (on se base sur ssllabs)

Activation du VirtualHost

ln -s /etc/nginx/sites-available/zpush.lovetux.net /etc/nginx/sites-enabled/zpush.lovetux.net
nginx -t
/etc/init.d/nginx restart

Configuration du serveur Zimbra

Le serveur Zimbra est sur le même serveur que nginx. Du coup il peut y avoir un conflit de port. Voici comment s’en sortir :

su - zimbra
zmprov ms $(zmhostname) zimbraMailPort 81
zmcontrol restart

Configuration du backend Zimbra pour zpush

Dans le fichier de configuration appelé config.php (du backend Zimbra pour zpush) voici les informations importantes à configurer :

define('TIMEZONE', 'Europe/Paris');
define('ZIMBRA_URL','http://192.168.0.252:81');

Configuration du téléphone intelligent

Nous avons un serveur nginx en tant que reverse proxy qui est capable de faire passer le serveur Zimbra OpenSource via zpush en tant que serveur Exchange. Cela veut donc dire que notre téléphone intelligent est donc capable d’être paramétré en utilisant le protocole ActiveSync avec le nom de serveur du VirtualHost, son adresse de messagerie en tant que login ainsi que son mot de passe.

Les logs

Il existe plusieurs fichiers de logs :

  • ceux de nginx
  • ceux de zpush
  • ceux de Zimbra

Logs de nginx

Les logs de nginx (du moins sur ma distribution Linux) sont dans /var/log/nginx/

Logs de zpush

Par défaut les logs de zpush sont dans /var/log/z-push/

Logs de Zimbra

Les logs intéressants de Zimbra seront /opt/zimbra/log/audit.log et /opt/zimbra/log/mailbox.log