Dans cet article, je vous présente jabber, le protocole de messagerie instantanée libre.
Une visite sur le site de la Jabber Software Foundation nous apprend que jabber est un ensemple de protocoles, basés sur le XML. C'est un peu vague ... Dans la majorité des cas, ce qui nous intéressera de jabber est son aspect IM (instant messager). Jabber permet donc à des utilisateurs de dialoguer en ligne, de savoir qui est en ligne, si ses amis sont disponibles pour une discussion, mais jabber permet également les échanges de fichiers, les discussions en salons (à la IRC). Le transport des données est assuré par un flux XML over TCP (dans une conversation entre chefs de projet, cette phrase fait bien ; pour des développeurs, cette connaissance est indispensable ; entre utilisateurs, on s'en moque).
Alors pourquoi jabber ? Parce que c'est un standard, ouvert, dont il existe de nombreuses implémentations, libres ou non. Parce que ce protocole est "facilement" extensible (ça ne se fait pas tout seul non plus, hein). Parce qu'un serveur jabber peut également servir de passerelle vers les autres protocoles de messagerie instantanée (Yahoo, AOL, MSN, ICQ, SMS ...) etc ...
Nous allons voir au cours de cet article la mise en place d'un serveur jabber pour un association, le Rochelug, au hasard.
Ce serveur permettra
aux membres de l'association de communiquer de façon instantanée entre eux et avec n'importe quel autre internaute
inscrit sur un serveur jabber et de "chatter" dans des salons ... Je reviens brièvement sur cette notion de salon en la comparant
avec IRC.
Sur IRC vous vous connectez à un serveur, choisissez un pseudo et un salon (channel). Vous discutez alors avec
tous les inscrits au salon mais ils doivent être connectés à ce serveur. Vous pouvez également engager une discussion privée avec
un membre mais là encore il doit être connecté au même serveur que vous.
Avec jabber, vous vous créez un compte sur un serveur et pouvez communiquer avec toutes les personnes ayant un compte jabber,
au sein de salons ou en discussion privée.
Un serveur jabber est par défaut ouvert sur le monde et peut donc communiquer avec les autres serveurs jabber, pour permettre la communication entre leurs abonnés respectifs, gérer une base d'utilisateurs globale et y permettre des recherches, ... On peut toutefois installer des serveurs ne communiquant pas avec le reste du monde, c'est notamment le cas dans les entreprises qui utilisent jabber comme outil de messagerie interne. Il est évident que dans le cas d'une telle utilisation, limitée aux utilisateurs d'un intranet, on devra supprimer la communication s2s (de serveur à serveur).
Les composants nécessaires pour utiliser Jabber sont un client et un serveur (comme souvent, oui, je sais, mais enfonçons le clou). Il en existe plusieurs implémentations. Traitons d'abord le cas du serveur, nous nous intéresserons au cas du client en fin d'article.
Pour choisir un serveur, une page existe pour les recenser (voir liens). On choisit un client en GPL (je rappelle qu'il s'agit d'installer jabber pour une association qui fait la promotion les logiciels libres). Parce qu'il n'y a pas de raison de se priver, on opte pour celui qui a l'air le plus complet, jabberd, dans sa version 2 (2.0s2 à l'heure de l'écriture de cet article, le s2 signifiant "deuxième release stable").
Enfin, il demeure un prérequis non négligeable ... Avoir une machine connectée au net en permanence.
Le Rochelug a tous les éléments ? Installons lui son serveur jabber !
Les données d'un utilisateur jabber (contacts, messages reçus hors connexion, ...) sont stockés sur le serveur où il est enregistré. Il se pose donc naturellement la question du stockage de ces informations... Jabberd2 propose d'utiliser à cette fin des bases Berkeley DB, Mysql , Postgres, Oracle, LDAP ainsi que des fichiers classiques, etc ...
Sur la machine de l'association, nous avons une installation fonctionnelle de MySQL, on choisit donc ce moyen de
stockage, d'autant que c'est celui qui est utilisé par défaut. Ca nous évitera de taper des lignes à rallonge pour le configure
.
Voici donc la "recette" pour installer un serveur jabberd2 :
Récupération, compilation, installation
cd /tmp wget http://www.jabberstudio.org/projects/jabberd2/releases/download.php?file=jabberd-2.0s2.tar.gz tar xvfz jabberd-2.0s2.tar.gz cd jabberd-2.0s2 ./configure make make install
Création d'un utilisateur/groupe
C'est, je pense, une bonne habitude à prendre que d'affecter chaque serveur à un utilisateur distinct, ainsi en cas de hack de
votre machine, les dangers sont potentiellement moindres.
groupadd jabberd useradd -g jabberd -d /home/jabberd -s /bin/false jabberd
Affectation des fichiers de configuration et modification des droits
chown jabberd.jabberd /usr/local/etc/jabberd/* chmod 660 /usr/local/etc/jabberd/*
Création de la base MySQL et de l'utilisateur correspondant. On crée la base jabberd2, et l'utilisateur est identifié par le login 'jabberd2' et le mot de passe 'secret'. Changez ses valeurs pour passer en phase de production ...
cd /tmp/jabberd-2.0s2/tools/ mysql -u root -p (taper le mot de passe) à l'invite mysql> \. db-setup.mysql GRANT select,insert,delete,update ON jabberd2.* to jabberd2@localhost IDENTIFIED by 'secret'; commit; quit;
Configuration de jabber
cd /usr/local/etc/jabberd vi c2s.xmlVous pouvez utiliser un autre éditeur bien sûr ... ;-)
<local>
à remplacer la ligne<id>localhost</id>
<id>rochelug.org</id>
Remplacez bien sûr ceci par
votre nom de machine. Pour une utilisation correcte de jabber, ce nom de machine doit
correspondre à une entrée du DNS de votre domaine.
Sauvez et quittez votre éditeur de texte favori.
De la même manière, dans sm.xml, remplacez
<id>localhost</id>
par
<id>rochelug.org</id>
Notez bien qu'avec cette installation par défaut, vous utilisez MySQL pour stocker les infos d'authentification et les données de vos clients. Vous pourrez trouver dans la section Références une méthode pour réaliser l'installation du serveur jabber en utilisant une base Berkeley DB pour le stockage. Pour plus d'informations sur Berkeley DB, je vous renvoie à l'article d'Yves Mettier dans sa série "Briques de base en C" (LM48).
Par défaut, le serveur stocke ses fichiers de configuration dans /usr/local/etc/jabberd/ et les binaires (jabberd, c2s, resolver, router, s2s, sm) dans /usr/local/bin
On va tester le serveur ! Pour ce faire, on exécute le script de lancement en tant qu'utilisateur jabberd : ...
su jabberd /usr/local/bin/jabberd &
Dans une console, on teste le serveur en se connectant sur le port 5222 et en envoyant une trame quelconque. Des insultes cachées dans un flux xml vous confirmerons la bonne installation du serveur jabber.
telnet rochelug.org 5222
Trying 213.186.46.111...
Connected to ns30428.ovh.net.
Escape character is '^]'.
test
<stream:stream xmlns:stream='http://etherx.jabber.org/streams' version='1.0'><stream:error xmlns:stream='http://etherx.jabber.org/streams'><xml-not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/><text xmlns='urn:ietf:params:xml:ns:xmpp-streams'>syntax error</text></stream:error></stream:stream>Connection closed by foreign host.
zazou@ZazouMobile:~$
Stoppez le processus en tapant fg
puis [Ctrl+C]
Maintenant que l'on sait que le serveur fonctionne, on peux le lancer au démarrage de la machine. Les sources que nous avons téléchargé sont fournies avec un script de démarrage. La machine de l'association utilise un démarrage de type System V et fonctionne avec chkconfig. Le script de démarrage fourni est compatible avec tout celà et on n'a donc qu'à l'intégrer au démarrage :
cp /tmp/jabberd-2.0s2/tools/jabberd.rc /etc/rc.d/init.d/jabberd2 chmod 755 /etc/rc.d/init.d/jabberd2 chkconfig --add jabberd2 chkconfig --list jabberd2 jabberd2 0:Arrêt 1:Arrêt 2:Marche 3:Marche 4:Marche 5:Marche 6:Arrêt
Vérifier tout de même les priorités de lancement/arrêt pour chkconfig en tête du script. Jabber doit être lancé APRES Mysql.
Sur notre machine, il a fallu remplacer 85 15
par 95 05
.
Naturellement, il ne faut pas laisser le root lancer les processus liés au serveur jabber. On a créé un utilisateur pour celà,
on ll'utilise donc et pour ce faire, on remplace dans /etc/rc.d/init.d/jabberd2
la ligne :
${progsPath}/${prog} ${args} & 2> /dev/null
par :
su -c "${progsPath}/${prog} ${args} & 2> /dev/null" jabberd 2> /dev/null
Dans ce même fichier de démarrage, on a choisi de remplacer la ligne :
pidPath="/usr/local/var/jabberd/pid"
par :
pidPath="/usr/local/var/jabberd"
Ceci pour limiter la création de répertoires et permettre d'exécuter le script de démarrage tel quel ...
Enfin, je vous encourage grandement pour finaliser votre installation à changer tous les mots de passe par défaut. Notamment celui pour la connexion à la base MySQL mais aussi ceux utilisés pour les communications interprocessus.
Pour continuer les tests, on tape /etc/rc.d/init.d/jabber start
. Par la suite, après chaque modification
de configuration, on tapera /etc/rc.d/init.d/jabber restart
pour être sûr que cette dernière soit prise en
compte.
A l'heure actuelle, il suffit d'utiliser un client jabber quelconque pour demander et obtenir la création d'un compte sur notre serveur. Ceci peut être génant puisque n'importe qui pourra utiliser le serveur. Dans la cas présent, on veut interdire la création libre de comptes.
Pour ce faire, il faut éditer le fichier c2s.xml et modifier les emplacements des commentaires dans la section
<authreg>
, à la fin du fichier ...
Remplacez :
<enable/>
par :
<!--
<enable/>
-->
Pour permettre aux utilisateurs de changer de mot de passe malgré tout, supprimez les commentaires comme indiqué ci-dessous :
Remplacez :
<!--
par :
<password/>
-->
<password/>
Naturellement vous devez maintenant trouver un moyen d'ajouter des utilisateurs "à la main". Pour celà, vous devez vous connecter à la base de données "jabberd2" sur votre serveur en utilisant l'utilisateur "jabberd2" et le mot de passe "secret" (vous devrez changer ces valeurs par la suite). Ensuite, vous devez ajouter les utilisateurs dans la table authreg en leur fournissant login et mot de passe.
Pour simplifier le processus, on édite le fichier sm.xml pour décommenter l'option <auto-create/>
, dans la section <user>,
à la fin du fichier..
Ceci permet de réduire la création d'un utilisateur au remplissage des trois champs suscités dans la base de données des utilisateurs jabber.
Pour ajouter "à la main" un utilisateur "utilisateur" ayant comme mot de passe "passe" :
[root@ns30428 root]# mysql -u jabberd2 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2697 to server version: 3.23.58-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use jabberd2 Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> insert into authreg(username, realm, password) values('utilisateur', 'rochelug.org', 'passe'); Query OK, 1 row affected (0.00 sec) mysql> quit Bye
Il est aisé d'écrire un script php pour créer des utilisateurs depuis un "service web" (j'adore cette petite expression à la mode).
On peut chiffrer les communications entre les divers modules du serveur jabber et/ou entre serveur et clients. Dans le cas d'utilisateurs mobiles et de communications sensibles, on choisira vraisemblablement de crypter la liaison clients/serveur/clients.
On doit tout d'abord créer un certificat (dans la "vraie vie", il faudrait le faire valider, mais bon ...).
Suivez la procédure donnée (http://www.jabberdoc.org/app_sslkey.html) en l'adaptant à notre cas pour créer votre certificat.
[root@ns30428 jabberd]# openssl req -new -x509 -newkey rsa:1024 -out server.pem Using configuration from /usr/share/ssl/openssl.cnf Generating a 1024 bit RSA private key ...++++++ .........++++++ writing new private key to 'privkey.pem' Enter PEM pass phrase: Verifying password - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:La Rochelle Organization Name (eg, company) [Internet Widgits Pty Ltd]:ROCHELUG Organizational Unit Name (eg, section) []:. Common Name (eg, YOUR name) []:rochelug.org Email Address []:info@rochelug.org [root@ns30428 jabberd]# openssl rsa -in privkey.pem -out privkey.pem read RSA key Enter PEM pass phrase: writing RSA key [root@ns30428 jabberd]# cat privkey.pem >> server.pem [root@ns30428 jabberd]# rm privkey.pem rm: remove `privkey.pem'? y [root@ns30428 jabberd]# mv server.pem /usr/local/etc/jabberd/server.pem [root@ns30428 jabberd]# chown jabberd.jabberd /usr/local/etc/jabberd/server.pem [root@ns30428 jabberd]# chmod 640 /usr/local/etc/jabberd/server.pem
Il n'y a alors plus qu'à adapter la configuration du serveur vers les clients. Celle ci se trouve dans le fichiers c2s.xml. Vous devrez dans ce dernier :
<local>
(pas <routeur>
)<pemfile>/usr/local/etc/jabberd/server.pem</pemfile>
<ssl-port>5223</ssl-port>
<port>0</port>
Suite à celà, vous pouvez redémarrer le serveur et vous y connecter en utilisant une connexion cryptée.
Chaque client choisit s'il désire un cryptage ou non. Pour qu'une discussion entre A et B soit "confidentielle", il faut que A ET B utilisent une connexion cryptée avec son serveur. Si ces deux personnes utilisent des serveurs différents, il faut en plus que la connexion entre les serveurs soit également protégée.
Si les implémentations client et serveur du protocole étaient spécifiques à linux, jabber n'aurait pas le succès qu'il connaît actuellement.Je vais vous présenter rapidement deux clients illustrant, l'un sous linux et l'autre sous windows, la simplicité d'utilisation du protocole jabber.
Voici à quoi ressemble Gaim au lancement ... On commence par se créer un compte ...
En cliquant sur ajouter dans la fenêtre des comptes.
On remplit l'utilisateur, le serveur et le mot de passe. Il faut cosher l'utilisation de TLS pour avoir une connexion cryptée. C'est le comportement par défaut. Pour se créer un compte sur un serveur public, on cliquerait sur "S'enregistrer", mais ici, on clique juste sur "Enregistrer". Ensuite, on coche la case en ligne dans la fenêtre des comptes ...
Et GAIM se connecte ! Vous vous retrouvez alors face à votre roster (c'est ainsi que l'on nomme la liste des contacts), vide. Vous choisissez donc "Ajouter un contact" dans le menu "Contacts".
Dans cette fenêtre vous saisissez l'identifiant jabber de votre ami (login@serveur). Une demande d'acceptation lui est alors envoyé.
Si lui vous accepte et veut vous ajouter à ses contacts, vous recevrez vous aussi une demande d'autorisation. A la fin de ce processus, votre roster comptera un contact de plus.
Double cliquez sur son nom, et discutez ...
Je vous laisse découvrir la suite ...
N.B.: Vous pouvez également utiliser gaim sous windows ...
JAJC, Just Another Jabber Client, se présente ainsi en état de marche. Cliquez sur l'ampoule en haut à gauche de l'interface puis "Tools/Accounts".
Saisissez dans le premier onglet de cette fenêtre de création de compte un nom de profil (le choix est libre mais il doit être différent pour chaque compte), votre nom d'utilisateur, votre mot de passe et le serveur auquel vous voulez vous connecter.
Dans le deuxième onglet, cochez si vous le désirez la case "Use SSL", vous verrez alors le numéro de port passer à 5223, c'est normal, cette version utilise encore l'ancienne version du protocole. Vous devrez avoir configuré votre serveur en conséquence pour profiter de la liaison cryptée.
Ci-dessus, la fenêtre qui s'affiche pour ajouter un utilisateur à son roster ...
Objectivement il existe encore un manque de documentation pour jabberd2, il lui reste quelques bugs et tous les composants extérieurs n'ont pas encore été redéveloppés pour ce dernier (conférence, passerelles, ...). J'ai néanmoins choisi de vous présenter directement ce dernier pour cette introduction à Jabber. D'une part parce qu'il existe en revanche beaucoup de documentation pour jabberd1.4. D'autre part parce que vous prendrez plaisir à ressortir ce numéro de linumag dans quelques mois en vous disant "Aah, mais j'ai déjà vu ça quelque part ..." quand votre patron vous commandera l'installation d'un service de messagerie instantanée pour votre entreprise.
@+
Xavier Garreau - <xavier@xgarreau.org>
http://www.xgarreau.org/
Ingénieur de recherche PRIM'TIME TECHNOLOGY
http://www.prim-time.fr/
Membre fondateur du ROCHELUG
http://www.rochelug.org/
a+