Pour la majorité des migrations de messagerie sur lesquels je suis intervenu, j’utilise pour la migration de messagerie un outil libre : ImapSync. Je l’utilise maintenant depuis un certains nombres d’années et je dois dire qu’il ne finit pas de me surprendre. Voici quelques fonctionnalités :
– Migration Imap à Imap,
– Migration d’une adresse de messagerie vers une autres,
– Modification des Headers,
– Pré-synchronisation,
– etc…
et en plus c’est développé par un français 🙂

Installation ImapSync depuis le repository GIT :

Tout d’abord on installe les repository EPEL pour plus de confort :
rpm -Uvh http://mirror.ibcp.fr/pub/epel/6/i386/epel-release-6-8.noarch.rpm

Puis on installe IMAPSync :
yum -y update (ça mange pas de pain)
yum install git perl-Mail-IMAPClient.noarch perl-Digest-HMAC.noarch perl-TermReadKey.x86_64 perl-NTLM.noarch perl-Net-SSLeay.x86_64 perl-IO-Socket-SSL.noarch perl-File-Copy-Recursive.noarch perl-Time-HiRes.x86_64 perl-Test-Simple
git clone https://github.com/imapsync/imapsync
cd imapsync
make install
imapsync -v
1.547

Pour plus d’info sur ImapSync : http://imapsync.lamiral.info/

Exemples de commandes : http://imapsync.lamiral.info/FAQ

Je continue sur ma lancé avec la supervision de NGINX avec zabbix. Plusieurs sites effectue cette opération via des scripts. Comme je l’ai dis dans mon précédent article, je préfèré une solution qui fonctionne « out of the box » (comme dirait les commerciaux).

Nginx dispose d’un module de status (a la apache) . Si vous voulez avoir plus d’informations sur ce qu’il monitore, je vous conseil de lire la documentation officiel.

Maintenant que l’on sais ce que l’on va monitorer, voici comment il faut faire :

Création d’un virtualhost spécifique accessible uniquement par l’agent zabbix :

Au niveau de votre serveur NGINX, il faut créer un virtualhost avec la configuration suivante :

server {
      listen 127.0.0.1:8080; # écoute en local sur un port différent
      location / {
          stub_status on; # on charge le module de status
          access_log off; # on ne logge pas inutilement les accès
          allow 127.0.0.1; # autorisation uniquement depuis le localhost
          deny all; # on refuse tout le reste
       }
 }

et bien sur faire un reload de NGINX a la fin de votre configuration

Modification du fichier zabbix_agentd.conf

Afin que le système prenne en compte les futurs checks contenu dans le template on ajoute ces paramètres utilisateurs à la configuration de l’agent zabbix (zabbix_agentd.conf):

UserParameter=nginx.active[*],wget -O- -q $1:$2 | awk ‘/^Active/ {print $NF}’
UserParameter=nginx.reading[*],wget -O- -q $1:$2 | awk ‘/Reading/ {print $$2}’
UserParameter=nginx.writing[*],wget -O- -q $1:$2 | awk ‘/Writing/ {print $$4}’
UserParameter=nginx.waiting[*],wget -O- -q $1:$2 | awk ‘/Waiting/ {print $$6}’
UserParameter=nginx.accepted[*],wget -O- -q $1:$2 | awk ‘/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$1}’
UserParameter=nginx.handled[*],wget -O- -q $1:$2 | awk ‘/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$2}’
UserParameter=nginx.requests[*],wget -O- -q $1:$2 | awk ‘/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$3}’

Il ne reste plus qu’a importer et associer à vos hosts le template Zabbix qui suit : Template_nginx

J’ai eu un petit souci lors de mes installations de Debian sur ESXi, la machine invité (ici un Debian 6) rempli les logs de ce message d’avertissement :

mpt-statusd: detected non-optimal RAID status

En effet, lorsque Debian s’installe sur un ESXi, il considère que les disques en dessous sont en RAID et installe les modules de vérification du RAID

Afin que cela cesse, il faut simplement désinstaller le paquet suivant :

apt-get remove mpt-status

Pourquoi ?

Effectivement, pourquoi installer un proxy IMAP/POP plutot que de laisser le serveur de messagerie faire son travail. Plusieurs points (ceci peut être purement subjectif) :

  • Assurer une zone d’étanchéité entre les utilisateurs provenant de l’externe et le serveur de messagerie IMAP situé en interne
  • Faire de la répartition de charge sur X backend
  • Assurer une migration sur différent service
  • etc.

Mon besoin personnel est la création d’une zone DMZ dans mon infrastructure, je ne voulais donc pas que les utilisateurs parviennent directement sur mon serveur de messagerie. Mais je me sert aussi de cette solution pour assurer des migrations de messagerie.

Je suis parti sur une installation sur Centos, mais le principe reste le même sur Debian-like.

Installation sur Centos-6

Tout d’abord on créer un fichier de configuration de yum, ainsi nous pourrons installer le proxy plus simplement que par la compilation. Le repository le plus a jour que j’ai trouvé est celui d’OpenSuse, les paquets datant du 30 Septembre 2012.

vim /etc/yum.repos.d/perdition.repo
[perdition]
 name=perdition repo
 baseurl=http://download.opensuse.org/repositories/home:/horms:/perdition/CentOS_CentOS-6/
 gpgcheck=0
 enabled=1

Puis on installe l’application :

yum install perdition

si vous souhaitez utiliser le backend LDAP (ou autre) il suffit d’installer la librairie correspondante. Dans mon cas je vais faire des interrogations LDAP afin de dire a Perdition sur quel backend aller se connecter.

yum install libperditiondb_ldap0.x86_64

Fichiers de configuration de Perdition

Explications des fichiers de configuration se trouve dans /etc/perdition/

Makefile  Makefile.popmap  perdition.conf  popmap  popmap.re

Le fichier popmap est un fichier a plat qui pourrai s’apparenter au aliases de Postfix avec une syntaxe de type user:destination

Il en va de même pour le fichier popmap.re qui lui prend en charge les expressions régulières.

Le fichier Makefile est un lien symbolique vers Makefile.popmap

Le fichier Makefile.popmap sert a générer le fichier db a partir du fichier popmap pour cela il suffit de faire la commande make all. Celle-ci va générer le fichier popmap.gdbm.db qui sera a intégrer dans la configuration de perdition. Pour plus d’informations je vous recommande le site de perdition ici

Enfin le fichier perdition.conf pour toute la configuration du logiciel. C’est ce que je vais détailler ci dessous. Cette configuration fonctionne en mode LDAP et n’utilisera pas le fichier map.

Configuration de perdition

Tout d’abord on va activer/desactiver les services qui ne nous interesse pas. Pour mon compte, je ne vais juste activer que l’IMAPS. Pour cela, il faut éditer le fichier /etc/sysconfig/perdition et modifier les occurrence pour correspondre a notre besoin :

RUN_PERDITION=yes
 POP3=no
 POP3_FLAGS=
 POP3S=no
 POP3S_FLAGS=
 IMAP4=no
 IMAP4_FLAGS=
 IMAP4S=yes
 IMAP4S_FLAGS=
 MANAGESIEVE=no
 MANAGESIEVE_FLAGS=

ET maintenant on va éditer le fichier perdition.conf afin de correspondre a notre besoin.

On commence par une copie de sauvegarde

cp /etc/perdition/perdition.conf  /etc/perdition/perdition.conf.bak

puis on édite le fichier. Voici la configuration que j’ai mis en place pour mon système

 no_bind_banner
 bind_address 192.x.x.x
 imap_capability IMAP4 IMAP4rev1 LITERAL+ ID STARTTLS AUTH=PLAIN SASL-IR COMPRESS=DEFLATE
 no_lookup
 server_resp_line
 ssl_cert_file /path/to/certificate.cert
 ssl_cert_verify_depth 9
 ssl_key_file /path/to/certificate.key
 ssl_no_cert_verify
 ssl_no_cn_verify
 M /usr/lib64/libperditiondb_ldap.so.0
 m "3:ldap://zimbra-ldap.domain.tld/?zimbraMailDeliveryAddress,zimbraMailHost?sub?(&(objectClass=zimbraAccount)(zimbraMailDeliveryAddress=%25s))?!BINDNAME=uid=zmpostfix%2ccn=appaccts%2ccn=zimbra,X-BINDPW=mypassword"

Explications des options :

no_bind_banner : On résoud l’adresse stipulé dans l’option « bind_address »
bind_address : adresse d’écoute du service
imap_capability : Capacité IMAP présenté aux clients se connectant à Perdition
no_lookup : On ne fait pas de lookup sur le serveur
server_resp_line : plutôt que de générer un message de bienvenue lors de la connexion, on affiche le message du backend
ssl_cert_file : chemin vers le certificat
ssl_cert_verify_depth : Profondeur de vérification du certificat
ssl_key_file : chemin vers la clef du certificat
ssl_no_cert_verify : On ne vérifie pas la cryptographie inclus dans le certificat du backend
ssl_no_cn_verify : On ne vérifie pas le nom inclus dans le CN du certificat du backend
M : libairie utilisé pour rechercher le backend
m : recherche LDAP utilisé avec les options ci-dessous :

  • 3 : version de protocole a utiliser
  • ldap://zimbra-ldap.domain.tld : adresse du serveur LDAP
  • zimbraMailDeliveryAddress,zimbraMailHost : attribut de retour
  • sub : scope de la recherche LDAP
  • (&(objectClass=zimbraAccount)(zimbraMailDeliveryAddress=%25s)) : la recherche envoyé au serveur LDAP
  • !BINDNAME=uid=zmpostfix%2ccn=appaccts%2ccn=zimbra,X-BINDPW=mypassword : pour le LDAP de Zimbra il faut se binder

Une fois le fichier enregistré, on place le service au démarrage du système puis on le démarre :

chkconfig perdition on
service perdition start

Test

Faisons un test avec l’utilitaire fournit par Openssl

openssl s_client -connect 127.0.0.1:993
* OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID AUTH=PLAIN SASL-IR COMPRESS=DEFLATE] perdition ready on imap.domain.tld 0002eec5
A login login@domain.tld password
A OK [CAPABILITY IMAP4rev1 ACL BINARY CATENATE CHILDREN CONDSTORE ENABLE ESEARCH ESORT I18NLEVEL=1 ID IDLE LIST-EXTENDED LIST-STATUS LITERAL+ LOGIN-REFERRALS MULTIAPPEND NAMESPACE QRESYNC QUOTA RIGHTS=ektx SASL-IR SEARCHRES SORT THREAD=ORDEREDSUBJECT UIDPLUS UNSELECT WITHIN XLIST] LOGIN completed

Et voila un proxy IMAP/POP qui ronronne !

J’ai enfin pris le temps de configurer un serveur de monitoring; pour diverses raisons j’ai choisi zabbix.Je vais détailler dans une suite d’article les différents check que j’ai mis en place afin de garder une trace et qui sait aider quelqu’un 🙂 Je ne traiterai pas de l’installation de Zabbix, de multiple tutoriaux étant disponible sur le web; cela serai une perte de temps.

Mysql & Zabbix
Par défaut Zabbix propose un template pour monitorer la base de données. Comme je n’ai pas de gros besoins en terme de supervision sur Mysql, j’ai décidé de partir sur quelque chose de simple plutôt que des check plus lourds qui font appel à des scripts externes.

Voici comment utiliser le template par défaut :
Dans un premier temps on va créer utilisateur dédié sur chaque serveur Mysql que l’on souhaite monitorer :

Linux#> Mysql -u root -p
Mysql#> GRANT USAGE ON *.* TO 'zabbix'@'%' IDENTIFIED BY 'super_password';

Une fois celui-ci créé on va paramétrer l’agent Zabbix pour qu’il prenne en compte les « Key » fourni par le serveur.

CentOS

On commence par copier le fichier d’exemple fourni par les repository EPEL :

cp /usr/share/doc/zabbix20-agent-2.0.5/userparameter_mysql.conf /var/lib/zabbixsrv/

Puis à la fin du fichier on ajoute les lignes suivantes :

UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
UserParameter=mysql.uptime,HOME=/var/lib/zabbix mysqladmin status | cut -f2 -d":" | cut -f1 -d"T"
UserParameter=mysql.threads,HOME=/var/lib/zabbix mysqladmin status | cut -f3 -d":" | cut -f1 -d"Q"
UserParameter=mysql.questions,HOME=/var/lib/zabbix mysqladmin status | cut -f4 -d":" | cut -f1 -d"S"
UserParameter=mysql.slowqueries,HOME=/var/lib/zabbix mysqladmin status | cut -f5 -d":" | cut -f1 -d"O"
UserParameter=mysql.qps,HOME=/var/lib/zabbix mysqladmin status | cut -f9 -d":"

Afin que le fichier soit pris en compte on l’inclus dans le fichier de configuration de l’agent :

Include=/var/lib/zabbix/userparameter_mysql.conf

A ce moment précis le check fonctionne, mais sans utilisateur; il faut donc stipuler à l’utilisateur zabbix quel utilisateur utiliser lors de la connexion à la base. Pour cela je vais reprendre ce qu’a fait Tiramiseb car à mon sens c’est la plus correcte et surtout la plus élégante !

On créer le fichier /var/lib/zabbix/dot.my.cnf  (home directory de votre user zabbix) puis on ajoute le contenu suivant :

[client]
user= »zabbix »
password= »super_password »

Ensuite, on fait un lien symbolique pour qu’il soit reconnu par MySQL :

cd /var/lib/zabbix
ln -s dot.my.cnf .my.cnf
chown zabbix.zabbix dot.my.cnf .my.cnf
chmod 600 dot.my.cnf

Et enfin on redémarre l’agent Zabbix

service zabbix-agent restart

Debian

Sur Debian on créer le fichier Mysql pour l’agent avec le contenu suivant :

UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/etc/zabbix mysql -N | awk '{print $$2}'
UserParameter=mysql.size[*],echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema='$1'")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name='$2'");" | HOME=/etc/zabbix mysql -N
UserParameter=mysql.ping,HOME=/etc/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
UserParameter=mysql.uptime,HOME=/etc/zabbix mysqladmin status | cut -f2 -d":" | cut -f1 -d"T"
UserParameter=mysql.threads,HOME=/etc/zabbix mysqladmin status | cut -f3 -d":" | cut -f1 -d"Q"
UserParameter=mysql.questions,HOME=/etc/zabbix mysqladmin status | cut -f4 -d":" | cut -f1 -d"S"
UserParameter=mysql.slowqueries,HOME=/etc/zabbix mysqladmin status | cut -f5 -d":" | cut -f1 -d"O"
UserParameter=mysql.qps,HOME=/etc/zabbix mysqladmin status | cut -f9 -d":"

Et comme pour la configuration sous CentOS on l’inclus dans le fichier de configuration de l’agent:

Include=/etc/zabbix/userparameter_mysql.conf

Et enfin on reprend l’astuce de Tiramiseb :

Création du fichier /etc/zabbix/dot.my.cnf avec le contenu :

[client]
user="zabbix"
password="super_password"

Ensuite, on fait un lien symbolique pour qu’il soit reconnu par MySQL :

cd /var/lib/zabbix
ln -s dot.my.cnf .my.cnf
chown zabbix.zabbix dot.my.cnf .my.cnf
chmod 600 dot.my.cnf

Et enfin on redémarre l’agent Zabbix

/etc/init.d/zabbix-agent restart

Et maintenant il ne reste plus qu’a affecter le template Mysql dans l’interface web a notre serveur Mysql.

Il a longtemps de cela j’avais installé un z-push pour attaquer mon serveur Zimbra. A l’époque javais pas mal galéré avec l’intégration de z-push. 3 ans plus tard (ah ouai quand même 🙂 ) j’ai de nouveau tenté l’expérience avec la nouvelle version de z-push avec le backend pour zimbra.

Je refait un petit tuto pour le monter sur un nginx. Pour ça on commence par télécharger l’archive, la décompacter et la renommer :


cd /var/www/
wget http://zarafa-deutschland.de/z-push-download/final/2.0/z-push-2.0.6-1616.tar.gz
tar xzvf z-push-2.0.6-1616.tar.gz
mv z-push-2.0.6-1616 z-push

Puis le backend pour Zimbra:

wget http://downloads.sourceforge.net/project/zimbrabackend/Release55/zimbra55-zpush2--zimbra54-zpush1-as12.1.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fzimbrabackend%2F
tar xzvf zimbra55-zpush2--zimbra54-zpush1-as12.1.tgz
mkdir z-push/backend/zimbra
cp zimbra55/z-push-2/* z-push/backend/zimbra/

une fois le système mis en place on modifie le config.php situé dans le dossier de z-push


define('BACKEND_PROVIDER', "BackendZimbra");
define('ZIMBRA_URL', 'http://zimbra.domain.tld');
define('ZIMBRA_USER_DIR', 'zimbra');
define('ZIMBRA_SYNC_CONTACT_PICTURES', true);
define('ZIMBRA_VIRTUAL_CONTACTS',true);
define('ZIMBRA_VIRTUAL_APPOINTMENTS',true);
define('ZIMBRA_VIRTUAL_TASKS',true);
define('ZIMBRA_IGNORE_EMAILED_CONTACTS',true);
define('ZIMBRA_HTML',true);
define('ZIMBRA_ENFORCE_VALID_EMAIL',true);
define('ZIMBRA_SMART_FOLDERS',false);
define('ZIMBRA_RETRIES_ON_HOST_CONNECT_ERROR',5);
define('ZIMBRA_DEBUG',false);
define('ZIMBRA_LOCAL_CACHE', false);

Puis on modifie la timezone dans le fichier z-push/lib/core/zpush.php

date_default_timezone_set('Europe/Amsterdam');
vers date_default_timezone_set('Europe/Paris');

Enfin on créé les fichiers/dossiers nécessaires au bon fonctionnement de z-push :
mkdir /var/log/z-push/ && touch /var/log/z-push/z-push.log /var/log/z-push/z-push-error.log && chown nginx: /var/log/z-push/z-push.log /var/log/z-push/z-push-error.log

et cela fonctionne directement ! Plus besoin de modifier le code pour qu’il fonctionne avec nginx 🙂

Référence : ZimbraBackend