Installation d'un serveur Jabber (ejabberd)

De La Mouche VII


J'ai récemment installé ejabberd, un serveur Jabber (XMPP), sous Debian GNU/Linux lenny, et je vais décrire rapidement la procédure.

Toutes les manipulations sont à réaliser sous l'utilisateur root.

Installation

Tout bête, il suffit d'installer le paquet ejabberd :

aptitude install ejabberd

Configuration

La configuration de ejabberd se trouve dans le répertoire /etc/ejabberd. On y trouve le fichier de configuration principal (ejabberd.cfg), un certificat SSL généré automatiquement pendant l'installation (ejabberd.pem), ainsi qu'un fichier nommé inetrc auquel je ne me suis pas intéressé.

# ls -lh /etc/ejabberd
total 24K
-rw------- 1 ejabberd ejabberd  14K jan 16 15:29 ejabberd.cfg
-rw-r----- 1 root     ejabberd 2,0K jan 14 23:23 ejabberd.pem
-rw-r--r-- 1 root     root       37 avr 16  2009 inetrc

À propos de ejabberd.cfg

Vous l'aurez compris, le fichier qui nous concerne le plus dans un premier temps est ejabberd.cfg. C'est en fait un morceau de code Erlang (le langage dans lequel est codé ejabberd), ce qui fait une syntaxe particulière, mais assez claire toutefois. Une notice explicative concernant cette syntaxe est incluse en commentaire dans le fichier. La principale chose à savoir est que les commentaires commencent par le caractère %.

Les sections suivantes expliquent les modifications à apporter pour bien démarrer. À noter que pour que les modifications soient prises en compte, il est nécessaire de redémarrer le processus ejabberd, ce qui a pour fâcheuse conséquence de déconnecter tous les utilisateurs du serveur. Essayez de créer une configuration stable, et faites vos essais avant d'inviter la terre entière à s'installer chez vous ! La commande pour redémarrer est la suivante (vous pouvez aussi utiliser invoke-rc.d si vous êtes quelqu'un de moderne) :

/etc/init.d/ejabberd restart

Les ACL, ou droits des utilisateurs

Le premier élément à configurer est la liste des utilisateurs possédant les droits d'administration sur le serveur. Ils pourront, depuis leur compte Jabber (si leur client le supporte), effectuer des opérations telles que l'ajout et la suppression d'utilisateurs, le paramétrage des messages et annonces du serveur, ou même redémarrer à distance ejabberd.

Une ACL est de la forme :

{acl, nom_groupe, {user, "nom_utiliateur", "domaine_utilisateur"}}.

Par exemple, pour ajouter l'utilisateur moi@mondomaine.org au groupe des administrateurs (nommé « admin ») :

{acl, admin, {user, "moi", "mondomaine.org"}}.

Vous pouvez aussi ajouter des utilisateurs à la liste des « registration watchers », dans la structure de configuration du module mod_register. Ces utilisateurs recevront une notification lorsqu'un compte sera créé ; cela n'est évidemment utile que si vous autorisez les inscriptions publiques (voir infra). Exemple :

{registration_watchers, ["moi@mondomaine.org", "moncollegue@mondomainepro.com"]},

De même, il est possible de créer une liste d'utilisateurs qui recevront une alerte si le processus de ejabberd s'emballe et consomme trop de mémoire :

{watchdog_admins, ["moi@mondomaine.org", "monadmin@mondomainepro.com"]}.

Noms de domaines

Il faut ensuite indiquer le ou les noms de domaines qui seront gérés par ejabberd. Si vous n'avez qu'un domaine, il suffit d'écrire :

{hosts, ["mondomaine.org"]}.

Si vous en avez plusieurs :

{hosts, ["mondomaine.org", "monautredomaine.net", "mondomainepro.com"]}.

Ports d'écoute du serveur

Une section importante est la structure listen, qui spécifie les ports d'écoute du serveur (et donc les services qu'il propose). Voici ma configuration :

{listen,
 [
  %% Client à serveur :
  {5222, ejabberd_c2s, [
                        {access, c2s},
                        {shaper, c2s_shaper},
                        {max_stanza_size, 65536},
                        starttls_required, {certfile, "/etc/ejabberd/ejabberd.pem"}
                       ]},

  %% Ancienne méthode de connexion SSL (obsolète) sur le port 5223 :
  {5223, ejabberd_c2s, [
                        {access, c2s},
                        {shaper, c2s_shaper},
                        {max_stanza_size, 65536},
                        tls, {certfile, "/etc/ejabberd/ejabberd.pem"}
                       ]},

  %% Serveur à serveur :
  {5269, ejabberd_s2s_in, [
                           {shaper, s2s_shaper},
                           {max_stanza_size, 131072}
                          ]},

  %% Interface web :
  {5280, ejabberd_http, [
                         http_poll,
                         web_admin,
                         tls,
                         {certfile, "/etc/ejabberd/ejabberd.pem"}
                        ]}
 ]}.
  • La partie « client à serveur » (port 5222) est indispensable. J'ai changé la directive starttls en starttls_required, afin d'empêcher que des mots de passe en clair ne transitent.
  • La deuxième partie, relative à l'ancienne méthode de connexion SSL, est facultative, et désactivée par défaut. Je l'ai activée parce que STARTTLS n'est pas encore supportée par tous les clients Jabber (par exemple mon client préféré mcabber).
  • La partie « serveur à serveur » est indispensable si vous voulez que votre serveur communique avec les autres serveurs Jabber. Pour un serveur interne, vous pouvez commenter cette section.
  • Enfin, la partie concernant l'interface web est facultative, mais il faut savoir que certaines opérations ne peuvent être effectuées qu'à travers cette interface. Par rapport au fichier de configuration par défaut, j'ai ajouté les directives tls et {{{certfile, "/etc/ejabberd/ejabberd.pem"}}}, qui permettent d'accéder à l'interface web de manière sécurisée (en https).

Si vous désirez configurer des passerelles vers d'autres réseaux de messagerie instantanée, il vous faudra configurer des nouveaux ports d'écoute dans cette section. Je ne peux pas vous aider sur ce point car j'utilise Jabber « pur » : lisez les exemples en commentaire et la documentation.

Ouvrir le serveur au monde extérieur

Pour commencer, afin de permettre la connexion aux utilisateurs de l'extérieur, et pas seulement depuis l'hôte local, commentez la ligne suivante :

{access, local, [{allow, local}]}.

Ensuite, si vous souhaitez que n'importe qui puisse créer un compte sur votre serveur Jabber, changez la ligne :

{access, register, [{deny, all}]}.

en :

{access, register, [{allow, all}]}.

Cela permettra aux gens de créer un compte depuis leur client Jabber. Si vous préférez créer les comptes à la main, ne touchez pas cette ligne.

Permettre de garder l'historique des salles de discussion

Ceci n'est pas du tout indispensable, mais il peut être utile de garder l'historique des conversations d'un salon de conférence. À noter que cette configuration ne sauvegarde pas les historiques de tous les salons, mais seulement des salons pour lesquels on a activé l'archivage.

Cette configuration est à faire dans la section modules (un morceau de bloc mod_muc_log existe mais est commenté). Voici ma configuration :

  %% Log MUC conversations
  %% Documentation: see http://www.process-one.net/en/ejabberd/guide_en#modmuclog
  {mod_muc_log,  [
                  {access_log, muc_admin},
                  {cssfile, "http://jabber.mondomaine.org/muclog/log.css"},
                  {dirname, room_jid},
                  {dirtype, subdirs},
                  {outdir, "/srv/jabber/muclog"},
                  {timezone, universal},
                  {spam_prevention, true},
                  {top_link, {"http://jabber.mondomaine.org/", "jabber.mondomaine.org"}}
                 ]},
  • La directive access_log permet de spécifier que seuls les membres du groupe muc_admin peuvent activer l'archivage dans une salle. Si vous voulez que tout le monde le puisse, remplacer « muc_admin » par « all » doit fonctionner. Pour ajouter des utilisateurs au groupe muc_admin, des ACL doivent être présentes quelque part dans le fichier de configuration, par exemple :
{acl, muc_admin, {user, "moi", "mondomaine.org"}}.
{acl, muc_admin, {user, "monpote", "mondomaine.org"}}.
  • cssfile permet d'indiquer l'adresse d'un fichier CSS à appliquer aux pages HTML générées.
  • dirname permet de spécifier le format du répertoire de sortie ; room_jid signifie que le répertoire sera l'adresse de la salle, et room_name seulement son nom.
  • outdir est le répertoire de base des historiques.
  • timezone, universal permet d'indiquer que les heures seront affichées en UTC. L'autre possibilité est local, auquel cas l'heure sera l'heure locale du serveur.
  • spam_prevention ajoute une directive nofollow à tous les liens présents dans les messages des utilisateurs.
  • Enfin, top_link permet de choisir le texte et la référence du lien qui apparaît en haut de chaque page.

Les historiques sont générés en HTML ; à partir de la version 2.1 de ejabberd, le format peut également être du texte, grâce à la directive suivante :

{file_format, plaintext},

En attendant, j'ai écrit un petit script à base de html2text qui permet de convertir les historiques HTML en texte.

Peaufinage

Il reste quelques options que vous pouvez personnaliser, comme le message de bienvenue et la langue par défaut des messages du serveur. Je vous laisse explorer le reste du fichier.

Création des comptes administrateurs

Même si nous avons spécifié des ACL dans le fichier de configuration, les utilisateurs ne sont pas créés pour autant. Pour les créer, il faut utiliser l'utilitaire ejabberdctl (le serveur doit être lancé) :

ejabberdctl register moi mondomaine.org mon_mot_de_passe

Vous pouvez contrôler que l'utilisateur a bien été créé avec la commande suivante, qui affiche le nombre d'utilisateurs enregistrés :

ejabberdctl stats registeredusers

Une fois un administrateur créé, il pourra créer des comptes depuis son client Jabber, en naviguant dans les services du serveur.

L'interface web

L'accès à l'interface web se fait sur le port spécifié dans le fichier de configuration, à savoir 5280 par défaut, et le répertoire à charger est /admin/. Dans notre exemple, l'adresse à charger est donc : https://mondomaine.org:5280/admin/ (http:// ne marchera pas si vous avez activé le chiffrement comme je l'ai fait).

Règles iptables

Si vous avez mis en place un pare-feu, il faudra ouvrir les ports sur lesquels écoute ejabberd. Voici un extrait de script iptables :

# Communication en clair et STARTTLS
iptables -A INPUT -p tcp --dport 5222 -j ACCEPT
# Communication TLS
iptables -A INPUT -p tcp --dport 5223 -j ACCEPT
# Communication avec les autres serveurs
iptables -A INPUT -p tcp --dport 5269 -j ACCEPT
# Interface web
iptables -A INPUT -p tcp --dport 5280 -j ACCEPT

Un mot sur le certificat SSL

Il est conseillé de générer votre propre certificat SSL « aux petits oignons ». Cela sort du cadre de cet article, mais sachez que comme on ne peut spécifier qu'un certificat et non une signature dans la configuration de ejabberd, il faudra concaténer le fichier de signature et le fichier de certificat :

cat key.pem cert.pem >keycert.pem

C'est ce fichier (ici keycert.pem) qu'il faudra indiquer dans ejabberd.cfg. Pour éviter des erreurs de frappe (le nom du certificat apparaissant à de multiples endroits dans le fichier de configuration), vous pouvez simplement remplacer l'ancien ejabberd.pem par votre nouveau certificat, ou par un lien vers celui-ci.