Page 1 sur 1

Prosody : un serveur XMPP à découvrir...

Publié : mer. 21 févr. 2018, 02:47
par le Manchot Masqué
Je n'aborde pas ici l'installation et le maniement du client XMPP Pidgin que beaucoup connaissent déjà, cette partie étant plutôt réservé aux administrateurs qui veulent installer rapidement un serveur XMPP léger mais déjà complet...
Sinon il y a ejabberd, plus complet encore que prosody, mais plus difficile à configurer et à manipuler.

La partie qui suit est donc un récapitulatif de test en machine virtuelle, pour configurer et appréhender rapidement l'outil.

Ports réseaux à ouvrir :
TCP 5222 pour les communications clients/serveur
TCP 5269 pour les communications serveur/serveur

On créé un hôte virtuel sur l'IP du réseau dans /etc/hosts :

Code : Tout sélectionner

192.168.0.XXX	toto.lan toto
Téléchargement et installation de l'outil :
Soit l'outil est déjà disponible sur votre distribution, soit il faut aller le rechercher comme suit.

Code : Tout sélectionner

# wget https://prosody.im/files/prosody-debian-packages.key -O- | apt-key add -
# apt-get update && apt-get dist-upgrade
# apt-get install prosody
Configuration

Code : Tout sélectionner

cd /etc/prosody
Dans prosody.cfg.lua, on active tous les modules la section "Generally required", "Not essential, but recommended" et "Nice to have".
On laisse le module "admin_adhoc" mais on commente le "admin_telnet".
Les modules HTTP restent commentés.
On peut activer les modules de "Other specific functionality", et notamment le module "groups" que l'on utilise plus loin.

Si vous voulez que les contacts s'enregistrent eux-mêmes directement, via Pidgin (ou tout autre client XMPP), ne pas oublier de modifier le paramètre :

Code : Tout sélectionner

allow_registration = true;
sinon il faut créer manuellement les usagers sur le serveur avec :

Code : Tout sélectionner

# prosodyctl adduser toto1@toto.lan
# prosodyctl adduser toto2@toto.lan
...
et s'il faut demain changer le mot de passe de toto1 :

Code : Tout sélectionner

# prosodyctl passwd toto1@toto.lan
Génération de l'hôte virtuel

Code : Tout sélectionner

# cd /etc/prosody/certs
# openssl req -new -x509 -nodes -out toto.lan.crt -keyout toto.lan.key -days 3650
Répondre aux questions posées pour générer le certificat auto-signé.

On créé le fichier de configuration de notre hôte virtuel /etc/prosody/conf.avail/toto.lan.cfg.lua :

Code : Tout sélectionner

-- attention à bien mettre les tabulations !
VirtualHost "toto.lan"
	groups_file="/etc/prosody/toto.groups.txt"
	ssl = {
		key = "/etc/prosody/certs/toto.lan.key";
		certificate = "/etc/prosody/certs/toto.lan.crt";
		}
Component "muc.toto.lan" "muc"
On a ici indiqué un fichier qui contient une liste de groupes d'utilisateurs spécifiques à notre hôte virtuel. Son contenu sera automatiquement envoyé aux clients XMPP à chaque connexion, sans avoir besoin de confirmation côté usager, contrairement à ce qui se passe en mode manuel, où le contact doit d'abord valider la demande d'inscription avant d'apparaître dans la liste du demandeur.

On crée donc notre fichier de groupe dans /etc/prosody/toto.groups.txt comme indiqué - en donnant bien entendu les bons droits sur le fichier :

Code : Tout sélectionner

# chown prosody:prosody /etc/prosody/toto.groups.txt
Puis on remplie le fichier avec les groupes et les membres de chaque groupe (ici on s'est retreint à un groupe avec deux usagers) :

Code : Tout sélectionner

# cat toto.groups.txt 
[Groupe des TOTOS]
toto1@toto.lan=toto1
toto3@toto.lan=toto3
On fait ensuite le lien symbolique comme pour Apache :

Code : Tout sélectionner

# cd /etc/prosody/conf.d/
# ln -s ../conf.avail/toto.lan.cfg.lua .
et on redémarrage le programme :

Code : Tout sélectionner

# prosodyctl restart
ou

Code : Tout sélectionner

# service prosody restart
On vérifie l'état du processus :

Code : Tout sélectionner

# prosodyctl status
ou

Code : Tout sélectionner

# service prosody status
Si tout s'est bien passé, on a quelque chose du genre

Code : Tout sélectionner

# ll /var/lib/prosody/toto%2elan/
total 24
drwxr-x--- 6 prosody prosody 4096 févr. 20 23:12 ./
drwxr-x--- 3 prosody prosody 4096 févr. 20 12:13 ../
drwxr-x--- 2 prosody prosody 4096 févr. 20 12:44 accounts/
drwxr-x--- 2 prosody prosody 4096 févr. 20 12:45 offline/
drwxr-x--- 2 prosody prosody 4096 févr. 21 00:05 roster/
drwxr-x--- 2 prosody prosody 4096 févr. 20 12:45 vcard/
Le serveur enregistre les paramètres des comptes dans le sous-dossier "account/", la liste des contacts/salons dans "roster/", etc

Exemples de contenus :

Code : Tout sélectionner

# cat /var/lib/prosody/toto%2elan/accounts/toto1.dat 
return {
	["password"] = "toto1";
};

# cat /var/lib/prosody/toto%2elan/roster/toto3.dat 
return {
	[false] = {};
	["pending"] = {};
	["toto1@toto.lan"] = {
		["subscription"] = "both";
		["groups"] = {
			["Groupe des TOTOS"] = true;
			["Buddies"] = true;
		};
		["name"] = "toto1";
	};
};
Prosody peut aussi utiliser LDAP avec le paquet aditionnel "prosody-modules", et peut utiliser une base SQL classique au lieu de stocker ses informations dans des fichiers texte. En cas d'utilisation de SQL, il faut juste penser à bien remettre ses tables à jour à chaque évolution de Prosody...

En cas de problème :

1 / vérifier la syntaxe du fichier de configuration avec :

Code : Tout sélectionner

# luac -p /etc/prosody/prosody.cfg.lua

2 / changer la ligne

Code : Tout sélectionner

info = "/var/log/prosody/prosody.log";
en

Code : Tout sélectionner

debug = "/var/log/prosody/prosody.log";
dans le fichier /etc/prosody/prosody.cfg.lua, relancer le service, et surveiller les journaux en temps réel :

Code : Tout sélectionner

# tail -f /var/log/prosody/prosody.*
3 / activer le module "admin_telnet", et se connecter directement dans l'outil pour y lancer des commandes (la liste est disponible sur https://prosody.im/doc/console :

Code : Tout sélectionner

# telnet localhost 5582
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
|                    ____                \   /     _       
                    |  _ \ _ __ ___  ___  _-_   __| |_   _ 
                    | |_) | '__/ _ \/ __|/ _ \ / _` | | | |
                    |  __/| | | (_) \__ \ |_| | (_| | |_| |
                    |_|   |_|  \___/|___/\___/ \__,_|\__, |
                    A study in simplicity            |___/ 


| Welcome to the Prosody administration console. For a list of commands, type: help
| You may find more help on using this console in our online documentation at 
| http://prosody.im/doc/console

module.reload("groups")
| OK: Module reloaded on 0 hosts
module.reload("pep")
| OK: Module reloaded on 0 hosts
config:reload()
| OK: Config reloaded (you may need to reload modules to take effect)
c2s:show("toto.lan")
| toto.lan
|    toto3@toto.lan/405ecd4e-dd2c-4dc2-8a29-4abfc6173672 - available(1)
|    toto1@toto.lan/f9465597-9829-44b5-9678-6651c1adad80 - available(1)
| OK: Total: 2 clients

CTRL-D pour quitter la session telnet