Installation du serveur XMPP / Jabber Metronome

Mon amie vient de quitter la France pour passer 6 mois en Argentine, loin de moi… Inconcevable donc de ne pas mettre en place un moyen fiable, sûre et libre pour que nous puissions rester en contact

Il y a Skype ! Me direz-vous… Sauf qu’en tant qu’adepte (amoureux ?) du libre et de sa philosophie, et très méfiant de Microsoft, je n’ai absolument pas envie de partager mes appels entre ma copine et moi avec Microsoft ou la NSA. J’ai donc commencé à chercher un moyen d’établir des appels audio / vidéo à distance, en passant par un serveur ou non et j’ai découvert beaucoup mieux : XMPP.

XMPP, c’est quoi ?

Wikipédia vous le dira mieux que moi, XMPP (pour Extensible Messaging and Presence Protocol) est un ensemble de protocoles standards ouverts permettant entre autres les discussions instantanées, la VoIP, visioconférence, échange de fichiers… Ces protocoles fonctionnent tellement bien que des centaines d’organisations privées et publiques les utilisent de manière fermée ou non : Apple, Google, Facebook, IBM…

XMPP fonctionne sur la pile TCP/IP selon une architecture Client / Serveur et comme c’est libre, des dizaines (centaines ?) d’implémentations existent, tant côté serveur que côté client. Globalement on pourrait comparer XMPP à un système de messagerie avancé. D’autant plus qu’une adresse XMPP est de la forme utilisateur@domaine.com. Et tout comme vous pouvez héberger votre propre serveur de messagerie, vous pouvez très bien héberger votre serveur XMPP. C’est ce que je vous propose de faire aujourd’hui.

Alors il en existe un certain nombre et parmi les plus connus vous trouverez Prosody. Il existe un fork de Prosody, spécialement conçu pour Jappix (un client web XMPP) qui s’appelle Mêtronôme. Et comme nous verrons plus tard l’installation de Jappix, autant partir sur de bonnes bases.

Installation de Mêtronôme

Toutes les commandes suivantes sont à effectuer avec les droits root.

Préparation de votre serveur

Comme d’habitude je suis sur Debian. Par contre je l’utilise en testing mais les manipulations suivantes devraient fonctionner sur une version stable.

La première étape consiste à créer un utilisateur et un groupe « metronome » qui vont être utilisés pour lancer et manipuler le service.

adduser --no-create-home --disabled-login --gecos 'Metronome' metronome

La compilation va aussi nécessiter un certain nombre de dépendances, dont nous allons trouver les dernières versions sur le dépôt officiel de Prosody (comme Mêtronôme est un fork de Prosody ils ont beaucoup en commun…).

echo "deb http://packages.prosody.im/debian wheezy main" >> /etc/apt/sources.list
wget http://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add -

Et enfin les dépendances dont nous avons besoin :

apt-get update && apt-get install lua5.1 liblua5.1-dev liblua5.1-filesystem0 libidn11-dev libssl-dev lua-zlib lua-expat lua-event lua-bitop lua-socket lua-sec-prosody

Récupérer les sources du projet et les compiler

Mêtronôme ayant un cycle de développement un peu spécial, il n’existe pas de paquet tout prêt à installer (ou alors je ne l’ai pas trouvé…). On va donc récupérer les sources du projet directement depuis Github. Si vous ne l’avez pas déjà, pensez à installer git (apt-get install git). Je vous propose de les mettre dans /usr/src.

cd /usr/src
git clone https://github.com/maranda/metronome.git metronome

On se place maintenant dans le répertoire du projet et on compile !

cd metronome
./configure --ostype=debian && make clean && make && make install

Script de démarrage

Il reste un petit script d’arrêt / démarrage et on sera bon. Celui fourni par Jappix fonctionne et est lui aussi disponible sur Github.

wget https://raw.githubusercontent.com/jappix/jappix-tools/master/metronome/configs/init.d_metronome -O /etc/init.d/metronome
chmod +x /etc/init.d/metronome
update-rc.d metronome defaults

Et voilà !

Configuration de Mêtronôme

C’est la deuxième grosse partie de ce tutoriel. Tout comme Prosody, Mêtronôme ne permet pas de faire grand chose avec une configuration par défaut. C’est pourquoi il est livré avec un ensemble très complet de modules avec lesquels nous allons pouvoir jouer un peu. Vous pouvez trouver un aperçu de ces modules dans le dossier plugins du code source.

La configuration de Mêtronôme passe par l’édition du fichier /usr/local/etc/metronome/metronome.cfg.lua. Jappix fourni gracieusement le sien toujours sur Github, que vous pouvez récupérer et adapter à votre configuration. Si vous êtes moins à l’aise ou si vous découvrez XMPP, suivez le guide !

Configuration globale du serveur

La configuration suivante est celle que j’utilise pour mon usage personnel. Elle fonctionne mais ne propose qu’un nombre restreint de fonctionnalités (les bases en fait). Si les commentaires du code ne sont pas suffisants, n’hésitez pas à commenter cet article !

-- Liste des comptes administrateurs du serveur
-- Example: admins = { "valerian@jappix.com", "julien@jappix.com" }
admin = { "admin@mon-domaine.fr" }
 
-- Server PID
pidfile = "/var/run/metronome/metronome.pid";
 
-- ulimit
metronome_max_files_soft = 200000;
metronome_max_files_hard = 200000;
 
use_libevent = true;
 
-- Liste des modules charges par Metronome au demarrage.
-- Ils sont normalement places dans le dossier plugins de Metronome sous la forme mod_modulename.lua
modules_enabled = {
 
        -- Plugins generallement requis
        "saslauth";     -- Authentification des clients et serveurs
        "tls";          -- Support de TLS sur les connections C2S / S2S
        "dialback";     -- Support du dialback S2S
        "disco";        -- Decouverte des services
 
        -- Modules HTTP
        "bosh";         -- Autorise les clients BOSH (Jabber sur HTTP)
 
        -- Modules facultatifs mais interessants
        "version";      -- Repond aux requetes de version
        "uptime";       -- Indique l'uptime serveur
        "time";         -- Permet de connaitre la date serveur
        "ping";         -- Repond aux pings XMPP par des pongs
 
        -- Autres fonctionnalites specifiques
        "posix";        -- Fonctionnalites POSIX (run in background, syslog, etc)
};
 
-- Mod_disco permet l'auto-configuration de certains services
-- Facultatif si les services en question ne sont pas actifs...
disco_items = {
        { 
            "muc.mon-domaine.fr" -- Multi-User Chat 
        },
        { 
            "vjud.mon-domaine.fr" -- Jabber Users Directory (annuaire de recherche) 
        },
        { 
            "pubsub.mon-domaine.fr" -- Fonctions de micro-blogging XMPP 
        }
};
 
allow_registration = false;
 
https_ports = { 5281 };
 
bosh_ports = {
        {
                port = 5281;
                path = "http-bind";
        }
};
 
force_https_bosh = true
cross_domain_bosh = true
bosh_max_inactivity = 30
consider_bosh_secure = true
 
-- Configuration SSL
ssl = {
        key = "/usr/local/etc/metronome/certs/mon-domaine.fr.key";
        certificate = "/usr/local/etc/metronome/certs/mon-domaine.cert";
};
 
-- Chiffrement requis Client to Server (c2s)
-- Chiffrement requis Server to Server (s2s)
c2s_require_encryption = true;
s2s_require_encryption = true;
 
authentication = "internal_hashed";
 
-- Gestion des logs
log = {
        info  = "/var/log/metronome/metronome.log";     -- Pour le debugging, modifier info par debug
        error = "/var/log/metronome/metronome.err";
        -- "*syslog";
};

Voilà pour la première partie. Je n’ai pas encore parcouru la documentation de Prosody / Mêtronôme de manière approfondie donc certaines zones de flou demeurent, mais normalement ça marche.

La deuxième partie de la configuration concerne les Virtual Hosts qui ne seront pas sans rappeler les vHosts Apache ou Nginx… Adaptez évidemment à votre nom de domaine !

----------- Virtual hosts -----------
-- Il est necessaire d'ajouter un vhost par domaine que Metronome doit servir
-- Configuration sensible a l'indentation
VirtualHost "mon-domaine.fr"
        enabled = true;
 
        modules_enabled = {
                -- Modules importants
                "roster";       -- Liste de contacts
 
                -- Pas indispensables, mais recommandes
                "vcard";        -- Autorise les vcards (vcard = profil)
 
                -- Modules facultatifs mais interessants
                "pep";          -- Permet aux utilisateurs de publier leur activite, ecouter de la musique...
                "register";     -- Permet aux utilisateurs de s'enregistrer sur le serveur et modifier leur mdp
 
        };
 
        allow_registration = false;
 
VirtualHost "anonymous.mon-domaine.fr"
        enabled = true;
        authentication = "anonymous";
        allow_anonymous_multiresourcing = true;
        allow_anonymous_s2s = true;
        anonymous_jid_gentoken = "XMPP Anonymous User";
        anonymous_randomize_for_loopback = true;
 
------ Components ------
-- You can specify components to add hosts that provide special services,
-- like multi-user conferences, and transports.
 
---Set up a MUC (multi-user chat) room server on muc.mon-domaine.fr:
Component "muc.mon-domaine.fr" "muc"
        name = "Salons de discussion du serveur XMPP !";
 
        modules_enabled = {
                "muc_limits";
        };
 
        muc_event_rate = 0.5;
        muc_burst_factor = 10;
 
Component "vjud.mon-domaine.fr" "vjud"
        ud_disco_name = "Répertoires d'utilisateurs";
        synchronize_to_host_vcards = "mon-domaine.fr";
 
Component "pubsub.mon-domaine.fr" "pubsub"
        name = "Service de publication / Souscription";
 
Component "bosh.mon-domaine.fr" "http"
        modules_enabled = { "bosh" };

Le mode anonyme permet à des personnes n’ayant pas de compte Jabber / XMPP d’utiliser quand même vos services. Il est bien évidemment facultatif… Je pense que le reste est suffisamment clair.

Configuration des clés de chiffrement

Vous avez sans doute remarqué que Mêtronôme vous permet de chiffrer votre trafic et nécessite donc la création de clés de chiffrement. J’ai déjà longuement parlé du système de clés publiques et si tout comme moi vous utilisez plusieurs services auto-hébergés, il va falloir songer à :

  1. Installer votre propre autorité de certification afin de gérer précisément…
  2. … vos propres certificats et clés de chiffrement.

Là encore si vous avez des questions sur ces notions par forcément évidentes à appréhender n’hésitez pas. Une fois votre certificat et votre clé prêts, placez-les dans le dossier correspondant à votre configuration (/usr/local/etc/metronome/certs/) et vous êtes bons ! Un redémarrage du service devrait recharger la configuration :

service metronome restart

Votre serveur est prêt !

Vérifier que tout fonctionne

L’exemple classique pour vérifier que tout fonctionne est d’ajouter un utilisateur avec la commande metronomectl

sudo metronomectl adduser test@guillaume-leduc.fr
Enter new password: 
Retype new password: 
User successfully added

Utilisez comme nom d’utilisateur l’adresse du compte administrateur que vous avez précédemment spécifié dans le fichier de configuration…

Configuration de la zone DNS

Comme nous avons ajouté un certain nombre de services liés à des sous-domaines, il va falloir les déclarer dans notre zone DNS. Chez OVH, tout se passe dans le manager. Voici à quoi ressemble les enregistrements que j’ai ajouté :

_xmpp-client._tcp        IN SRV    5 0 5222 mon-domaine.fr.
_xmpp-server._tcp        IN SRV    5 0 5269 mon-domaine.fr.
muc                      IN A      XXX.XXX.XXX.XXX
pubsub                   IN A      XXX.XXX.XXX.XXX
vjud                     IN A      XXX.XXX.XXX.XXX
Les enregistrements de type SRV (les deux premiers) sont des enregistrements de type service.

Pour le premier enregistrement par exemple, on indique que le service _xmpp est disponible en _tcp avec un TTL de 3600 secondes. Cet enregistrement est de classe IN pour « Internet » et de type SRV. Les trois numéros suivants indiquent respectivement la priorité, le poids, puis le port auquel le service est disponible, et enfin le domaine à joindre.

La propagation DNS peut prendre jusqu’à une semaine en fonction des DNS que vous utilisez mais met généralement 24 à 48h pour les DNS de votre FAI.

La suite…

Notre serveur est prêt, nous allons pouvoir l’essayer via de multiples façons (autant de façons qu’il y a de clients en fait). Les prochains articles concernant XMPP traiteront de l’installation et de la configuration de ces clients. D’ici là portez-vous bien !

Bonus : mise à jour de Mêtronôme

Le projet étant assez actif, vous allez être amené à mettre à jour votre serveur assez régulièrement si vous voulez profiter des dernières fonctionnalités. Et comme il est livré avec un makefile, l’opération se résume en quelques commandes :

cd /opt/metronome
sudo git pull
sudo make clean
sudo make
sudo make install

Sans oublier un petit redémarrage du service :

sudo service metronome restart


Sources :

  • Pour l’installation et la compilation de Mêtronôme : open-freax.fr (Que je vous recommande d’ajouter dans votre agrégateur de flux RSS par ailleurs !

Cet article vous a plu ? Partagez-le sur les réseaux sociaux !

Twitter Facebook Google Plus email