Introduction
Dans un article précédent, nous avons vu comment mettre en place un serveur Matrix Synapse. Bien qu’étant un système de communication très complet, je trouve que le fait d’avoir plusieurs modules à mettre en place pour avoir une infrastructure pleinement auto-hébergée avec de la messagerie, de l’authentification et la gestion de flux le rend assez compliqué à administrer dans un homelab.
Lors d’une discussion sur les problématiques de vie privée des systèmes de messagerie “grand-public”, un pote de promo m’a parlé de XMPP, un protocole similaire à Matrix mais plus ancien.
Ce qui m’a donné envie de tester ce protocole c’est sa maturité, en effet, on peut trouver de nombreuses implémentations de serveurs et clients écris dans grande variété de langages.
Pour tester XMPP, j’ai choisi d’installer une instance de Prosody, réputé pour être simple à mettre en place et léger.
Fonctionnement général
XMPP est l’accronyme de eXtensible Messaging and Presence Protocol.
Le protole est basé sur XML et fonctionne sur un modèle client-serveur (c2s).
Chaque utilisateur a un compte sur un serveur XMPP identifé par un identifiant unique nommé JID.
L’échange de messages entre utilisateurs présents sur différents serveurs se fait via des connexions serveur à serveur (s2s).
- Les connexions client-serveur utilisent le port 5222
- Les connexions serveur-serveur utilisent le port 5269. Les services HTTP comme l’upload de fichiers par exemple utilisent les ports 5280 et 5281 pour l’HTTPS.
Le JID
Les JID (Jabber ID) sont utilisés pour identifier des ressources sur le réseau XMPP et sont structurés ainsi : localpart@domain/resource
Exemple : bob@nobell.fr/laptop
bob-> utilisateurnobell.fr-> serveur XMPPlaptop-> appareil / session
Les stanzas
XMPP échange des stanzas XML, il y en a 3 types fondamentaux :
<message>-> Messages, salons, fichiers<presence>-> Statut (en ligne, absent, occupé…)<iq>-> Requêtes / réponses (config, roster, disco…)
Les XEP
XMPP est volontairement minimal à la base, puis enrichi via des extensions appelées XEP (XMPP Extension Protocols). Chaque serveur, choisit lesquels il implémente.
En voici quelques exemples :
- XEP-0045 -> Salons (MUC)
- XEP-0384 -> Chiffrement OMEMO
- XEP-0198 -> Reprise de session
- XEP-0363 -> Upload de fichiers
- XEP-0313 -> Historique de messages côté serveur (MAM)
Sécurité et chiffrement
Les échanges c2s et s2s utilisent du chiffrement TLS ou StartTLS.
Il est aussi possible d’avoir du chiffrement de bout en bout via des extensions comme OMEMO ou OpenPGP.
Avantages d’XMPP
Après avoir testé XMPP, je dirais que les principaux atouts d’XMPP sont :
- L’absence de serveur central
- Son extensibilité et sa modularité via XEPs
- Sa légèreté
- Ses méchanismes de sécurité avec chiffrement
- Et biensur, sa maturité
Installation d’un serveur XMPP avec Prosody
Maintenant, nous allons voir comment mettre en place son serveur XMPP pour communiquer avec d’autres personnes sur le réseau.
J’ai oublié de mentionner mais si vous souhaitez tester le réseau sans mettre en place de serveur, vous pouvez créer un compte sur movim.eu.
Pour pouvoir communiquer avec l’extérieur, il est nécessaire que votre instance soit accessible depuis internet sur les ports 5222, 5269, 5280 et 5281. Pour cela, je vous recommanderais d’utiliser un VPS sous Debian ou Ubuntu. Il est aussi possible de l’héberger sur un raspberry pi et de faire une redirection de ports NAT sur votre box internet ou routeur.
Prosody se veut être un serveur de communication XMPP moderne et simple à mettre en place. Il est codé en Lua.
Dans ce guide, nous allons mettre en place un serveur Prosody simple avec un stockage local. Nous mettrons aussi en place un stockage de fichiers ainsi qu’une instance de conférence pour pouvoir créer des salons de discussion avec plusieurs personnes.
Installation de Prosody sous Debian/Ubuntu
L’installation de Prosody est très simple et peut se faire via le gestionnaire de paquets APT
apt install prosody
Configuration de Prosody
Le fichier de configuration principal du serveur se trouve dans /etc/prosody/prosody.cfg.lua
Le fichier de configuration est assez bien documenté avec une description pour l’ensemble des options disponibles.
Vous pouvez vous promener dans le fichier de configuration et modifier les champs comme vous le souhaitez.
Après chaque modification de config, le serveur Prosody devra être relancé avec la commande systemctl restart prosody.
Pour mettre en place du chiffrement TLS, vous pouvez ajouter vos certificats dans /etc/prosody/certs av format <domaine>.crt pour le certificat et <domaine>.key pour la clé.
Le serveur est fourni avec un shell, accessible via la commande prosodyctl shell qui permet d’administrer le serveur.
La création d’un utilisateur sur le serveur se fait avec la commande :
prosodyctl adduser user@domain.tld
Activation du partage de fichiers
Il est possible d’activer le partage de fichiers en ajoutant cette ligne dans la config :
modules_enabled = { "http_file_share"; }
Activation des notifications push
Pour que le serveur puisse envoyer des notifications push aux clients, il faudra ajouter ces lignes dans la config.
modules_enabled = { "cloud_notify" } -- Activation du module
push_notifications_important_body = "New Message !" -- Message affiché par défaut lors de la réception d'un message
push_max_errors = 16 -- Nombre max d'échecs de notifications avant de désactiver l'envoi vers un appareil
push_max_devices = 5 -- Nombre maximum d'appareils par utilisateur
push_max_hibernation_timeout = 259200 -- Temps maximal pendant lequel un appareil peut rester inactif
push_notification_with_body = false -- Indique si la notification doit inclure le contenu du message
push_notification_with_sender = false -- Indique si la notification doit inclure le nom de l'auteur
Finalement, il faudra installer le module avec la commande
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_cloud_notify
Activation des salons de discussion
Le module muc permet aux utilisateurs de créer des salons de discussion.
Pour cela il est possible de définir une instance de conférence avec un domaine spécifique.
Chaque salon présent sur le serveur aura un JID lié à l’instance de conférence comme par exemple salon1@rooms.domain.tld.
Pour activer ce module, il faudra ajouter ces lignes à la configuration.
modules_enabled = { "muc_mam" }
Component "rooms.domain.tld" "muc"