Ejabberd

Ce document est inachevé !

Ejabberd est un serveur XMPP qui peut être passé à l'échelle facilement pour de gros serveurs, mais pas très lourd pour quand même permettre l'auto-hébergement. Il peut être installé sur Linux facilement et la configuration par défaut fonctionne raisonnablement bien. Malgré tout si vous souhaitez avoir accès à certaines fonctionnalités plus récentes vous pouvez avoir à y faire quelques modifications. La documentation officielle pour tous les paramètres des modules d'Ejabberd peut être trouvée ici.

Tutoriel

Prérequis :

  • Un nom de domaine
  • Un serveur

Ce tutoriel commence avec un seul virtualhost[^1]. Pour les besoins de cet exemple, example.net est le domaine. Remplacez toutes les occurences de example.net par votre propre nom de domaine.

[^1] : Les virtualhosts permettent à plus d'un service XMPP de tourner sur le même serveur. Par exemple, un service XMPP avec le domaine example.net et un autre service XMPP avec le domaine example.org, les deux quelque peu séparés l'un de l'autre comme s'ils étaient sur des serveurs différents.

Les enregistrements DNS A/AAAA et SRV sont nécessaires pour chaque service sur le serveur XMPP.

Enregistrements A :

  • example.net
  • muc.example.net (pour les salons de discussions)
  • upload.example.net (pour l'upload de fichiers HTTP)
  • pubsub.example.net (pour le nœud pubsub)
  • proxy.example.net (pour le proxy de transfert de fichier)
  • turn.example.net (pour STUN/TURN)

Chacun pointant sur l'adresse IP du serveur faisant tourner Ejabberd.

Créez un enregistrement SRV pour chacun, pointant sur un nom de domaine qui résoud vers le serveur, comme ceci :

(Tous les enregistrements sont de la forme _service._proto.nom IN SRV priorité poids port cible)

_xmpp-client._tcp   IN SRV  5 0 5222 example.net.
_xmpps-client._tcp  IN SRV  5 0 5223 example.net.
_xmpp-server._tcp   IN SRV  5 0 5269 example.net.
_xmpps-server._tcp  IN SRV  5 0 5270 example.net.

et

_xmpp-client._tcp.muc   IN SRV  5 0 5222 example.net.
_xmpps-client._tcp.muc  IN SRV  5 0 5223 example.net.
_xmpp-server._tcp.muc   IN SRV  5 0 5269 example.net.
_xmpps-server._tcp.muc  IN SRV  5 0 5270 example.net.

pour chaque sous-domaine (commançant par muc). Excluant turn.example.net.

Enfin, ajoutez un ensemble d'enregistrements SRV, pour STUN/TURN.

_stun._udp   IN SRV  5 0 3478 turn.example.net.
_stun._tcp   IN SRV  5 0 3478 turn.example.net.
_stuns._tcp  IN SRV  5 0 5349 turn.example.net.

_turn._udp   IN SRV  5 0 3478 turn.example.net.
_turn._tcp   IN SRV  5 0 3478 turn.example.net.
_turns._tcp  IN SRV  5 0 5349 turn.example.net.

Info supplémentaire : comme résultat de cette délégation des enregistrements SRV, héberger XMPP sur un autre serveur que celui sur example.net est une possibilité (i.e. si on sépare les services sur un domaine entre serveurs). Plus d'informations peuvent être trouvés sur la XEP-0368.

Ouvrir les ports :

TCP : 80 443 5222 5223 5269 5270 3478 5349 49152-65535

UDP : 3478 49152-65535

80 & 443 sont pour le serveur web, 5222, 5223, 5269 et 5270 sont pour XMPP, et les autres sont pour STUN/TURN.

  • obtenir un (des) certificat(s) pour votre nom de domaine, comme pour les sous-domaines, tous ensemble :

    • example.net
    • muc.example.net
    • upload.example.net
    • pubsub.example.net
    • proxy.example.net
    • turn.example.net
  • proxypass de http://127.0.0.1:5443 à travers :

  • Assurez-vous que pour /xmpp vous avez ce qui est nécessaire pour proxifier les websocket aussi. Si ovus utilisez Nginx, augmentez client_max_body_size pour l'upload HTTP.

  • assurez-vous que les fichiers des certificats sont lisibles et/ou à un endroit lisible par le compte unix ejabberd.

Pour éviter d'utiliser quelque chose comme Nginx + Certbot, utilisez le module acme Ejabberd intégré, mais cet article part du principe qu'héberger les autres services web sur le même système est voulu, auquel cas chaque service HTTP serait proxifié vers un seul service web HTTPS.

Enfin installez le paquet système. Assurez-vous que ce build supporte PostgreSQL.

Confirmez que le fichier /etc/ejabberd/ejabberd.yml existe, et est lisible par l'utilisateur qui fait tourner Ejabberd (certainement ejabberd), si nécessaire, en copiant l'exemple ejabberd.yml ou wget/curl-ant le fichier depuis le dépôt github. S'il est obtenu depuis le dépôt, assurez-vous que la version correspond à la version de Ejabberd du paquet fournis par votre OS.

Une base de données séparée devrait être créée pour chaque virtualhost, pour rendre les choses plus claires, et en plus, rendre les virtualhost plus facile à migrer dans le futur. Cependant, la possibilité d'en utiliser une seule, comme décrit ici, exists aussi à présent.

Suivez les instructions de l'installation standard de PostgreSQL pour votre OS. Une fois cela fait, connectez-vous à la base de données en tant qu'administrateurice et :

  1. créez un utilisateur de base de données Ejabberd avec CREATE USER ejabberd WITH PASSWORD 'votre_mot_de_passe';. N'oubliez pas de changer le mot de passe, et notez-le.
  2. créez une base de données pour le virtualhost avec CREATE DATABASE ejabberd_exemple OWNER ejabberd;. Remplacez exemple par quelque chose correspondant au virtualhost.
  3. quittez le shell psql, et importez le schéma de la base de données depuis GitHub avec la commande curl -s https://raw.githubusercontent.com/processone/ejabberd/master/sql/pg.sql | sudo -u ejabberd psql ejabberd_exemple (encore une fois remplacez exemple).

Commencez par remplacer localhost sous hosts avec le virtualhost (e.g. example.net), puis listez les fichiers de certificats précédemment obtenus sous certfiles.

1hosts:
2  - example.net
3
4certfiles:
5  - "/etc/ejabberd/certs/*/*"

Maintenant mettez default_db: sql au niveau racine du fichier YAML. Ça devrait être suivis de host_config et de la configuration de base de données de votre virtualhost, comme montré ci-dessous. Personnalisez chaque valeur en fonction de la configuration.

 1host_config:
 2  example.net:
 3    sql_type: pgsql
 4    sql_server: "localhost"
 5    sql_port: 5432
 6    sql_username: "ejabberd"
 7    sql_password: "postgres_password"
 8    sql_database: "ejabberd_exemple"
 9    auth_method: sql
10    auth_password_format: scram

Sous listen, assurez-vous que tous les bons services sont activés sur chaque port, incluant le TLS s2s sur le port 5270 (qui n'est pas le défaut) :

 1listen:
 2  -
 3    port: 5222
 4    module: ejabberd_c2s
 5    max_stanza_size: 262144
 6    shaper: c2s_shaper
 7    access: c2s
 8    starttls_required: true
 9  -
10    port: 5223
11    tls: true
12    module: ejabberd_c2s
13    max_stanza_size: 262144
14    shaper: c2s_shaper
15    access: c2s
16    starttls_required: true
17  -
18    port: 5269
19    module: ejabberd_s2s_in
20    max_stanza_size: 524288
21  -
22    port: 5270
23    tls: true
24    module: ejabberd_s2s_in
25    max_stanza_size: 524288

Ensuite, activez les modules du serveur HTTP et du serveur STUN/TURN. Complétez turn_ipv4_address et ip avec l'adresse IPv4 de votre serveur. TLS sera désactivé pour le serveur HTTP car il est proxifié à travers le serveur web précédemment configuré.

 1  -
 2    port: 5443
 3    module: ejabberd_http
 4    request_handlers:
 5      /xmpp/admin: ejabberd_web_admin
 6      /xmpp/bosh: mod_bosh
 7      /xmpp/upload: mod_http_upload
 8      /xmpp/ws: ejabberd_http_ws
 9      /.well-known/host-meta: mod_host_meta
10      /.well-known/host-meta.json: mod_host_meta
11  -
12    port: 3478
13    transport: udp
14    module: ejabberd_stun
15    use_turn: true
16    turn_min_port: 49152
17    turn_max_port: 65535
18    # The server's public IPv4 address:
19    turn_ipv4_address: 0.0.0.0
20  -
21    port: 5349
22    transport: tcp
23    module: ejabberd_stun
24    use_turn: true
25    tls: true
26    turn_min_port: 49152
27    turn_max_port: 65535
28    ip: 0.0.0.0
29    turn_ipv4_address: 0.0.0.0

Mettez s2s_use_starttls: required à la racine.

À partir de là il est possible de configurer quelques ACLs. acls sont juste les access control lists, configurez access_rules en fonction de vos besoins, qui seront transmis aux paramètres des modules. Au minimum un compte admin est recommandé. Exemple :

 1acl:
 2  admin:
 3    user: juliet@example.net
 4  capulet:
 5    - user: juliet@example.net
 6	- user: tybalt@example.net
 7  nurse:
 8    - user: angelica@example.net
 9
10access_rules:
11  household:
12    allow: capulet
13    allow: nurse

Ajoutez une adresse d'abus sous mod_disco. Il est aussi possible d'ajouter d'autres adresses de contact d'après la XEP-0157 :

1modules:
2# ...
3  mod_disco:
4    server_info:
5    -
6      modules: all
7      name: "abuse-addresses"
8      urls: ["mailto:abuse@example.net"]

Ajoutez mod_host_meta :

1  mod_host_meta:
2    bosh_service_url: "https://@HOST@/xmpp/bosh"
3    websocket_url: "wss://@HOST@/xmpp/ws"

Edit mod_mam, and change assume_mam_usage to false and default to never if it is not desirable to default to archiving messages on the server:

1  mod_mam:
2    db_type: sql
3    assume_mam_usage: never
4    default: never

Ajoutez mod_stun_disco pour signaler le service STUN aux clients, en changeant 0.0.0.0 et example.net pour respectivement l'adresse IP et le nom de domaine du serveur :

 1  mod_stun_disco:
 2    credentials_lifetime: 12h
 3    services:
 4        -
 5          host: 0.0.0.0
 6          port: 3478
 7          type: stun
 8          transport: udp
 9          restricted: false
10        -
11          host: 0.0.0.0
12          port: 3478
13          type: turn
14          transport: udp
15          restricted: true
16        -
17          host: turn.example.net
18          port: 5349
19          type: stuns
20          transport: tcp
21          restricted: false
22        -
23          host: turn.example.net
24          port: 5349
25          type: turns
26          transport: tcp
27          restricted: true

Configurez l'hôte du sous-domaine muc, sinon il essayera d'utiliser conference.example.net. Configurer mam: false dans default_room_options désactivera l'archivage des messages côté serveur par défaut.

 1  mod_muc:
 2    host: muc.example.net
 3    access:
 4      - allow
 5    access_admin:
 6      - allow: admin
 7    access_create: muc_create
 8    access_persistent: muc_create
 9    access_mam:
10      - allow
11    default_room_options:
12      mam: false
1  mod_proxy65:
2    access: local
3    max_connections: 5
1  mod_http_upload:
2    put_url: https://@HOST@/xmpp/upload
3    docroot: /var/www/ejabberdupload
4    max_size: 1073741824
5    custom_headers:
6      "Access-Control-Allow-Origin": "https://@HOST@"
7      "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
8      "Access-Control-Allow-Headers": "Content-Type"

Créez le dossier pour le docroot, et assurez-vous qu'il appartient à l'utilisateur ejabberd. Changez max_size (la taille maximale d'upload) pour la valeur souhaité.

1  mod_pubsub:
2    access_createnode: pubsub_createnode
3    plugins:
4      - flat
5      - pep
6    force_node_config:
7      ## Empêcher les clients bugués de rendre leurs favoris publics
8      storage:bookmarks:
9        access_model: whitelist

démarrez le serveur Ejabberd !

Utilisez sudo -u ejabberd ejabberdctl register admin example.net mot-de-passe pour enregistrer admin@example.net avec le mot de passe mot-de-passe.

Il y a un vérificateur de conformité sur compliance.conversations.im pour tester le serveur. Après que tout ai été configuré correctement, changez potentiellement le loglevel à la racine de la configuration.

Il y aura une page d'administration accessible via https://example.net/xmpp/admin.

Cadeaux bonus !

Il est possible de configurer conversejs en utilisant mod_conversejs. Il peut être nécessaire de mettre à jour la configuration du serveur web pour proxyfier le nouveau point de terminaison (/chat ci-dessous).

 1listen:
 2  -
 3    port: 5443
 4    module: ejabberd_http
 5    request_handlers:
 6      /xmpp/bosh: mod_bosh
 7      /xmpp/ws: ejabberd_http_ws
 8      /chat: mod_conversejs
 9
10modules:
11  mod_conversejs:
12    websocket_url: "ws://@HOST@/xmpp/ws"
13    bosh_service_url: "https://@HOST@/xmpp/bosh"

Pour chaque virtualhost supplémentaire une nouvelle base de données devrait être créée, et ajouté à la partie base de données de la configuration. exemple :

 1host_config:
 2  example.net:
 3    sql_type: pgsql
 4    sql_server: "localhost"
 5    sql_port: 5432
 6    sql_username: "ejabberd"
 7    sql_password: "postgres_password"
 8    sql_database: "ejabberd_net"
 9    auth_method: sql
10    auth_password_format: scram
11  example.org:
12    sql_type: pgsql
13    sql_server: "localhost"
14    sql_port: 5432
15    sql_username: "ejabberd"
16    sql_password: "postgres_password"
17    sql_database: "ejabberd_org"
18    auth_method: sql
19    auth_password_format: scram

Il ne peut pas y avoir de conflits entre les déclarations dans le fichier de configuration, donc si mod_muc, mod_proxy65, mod_http_upload et mod_pubsub sont declarés sous modules à la racine, ils (ainsi que d'autres différences de configuration entre les virtualhosts) doivent être supprimés et recopiés pour chaque virtualhost sous append_host_config, à la racine. Example :

 1append_host_config:
 2  example.org:
 3    modules:
 4      mod_muc:
 5        host: muc.example.org
 6        access_create: org_account
 7        access_persistent: org_account
 8        access:
 9          - allow
10        access_admin:
11          - allow: admin
12        default_room_options:
13          mam: false
14      mod_proxy65:
15        access: org_account
16        max_connections: 5
17      mod_http_upload:
18        access: org_account
19        put_url: https://@HOST@/xmpp/upload
20        docroot: /var/www/ejabberdupload
21        max_size: 1073741824
22        custom_headers:
23          "Access-Control-Allow-Origin": "https://@HOST@"
24          "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
25          "Access-Control-Allow-Headers": "Content-Type"
26      mod_pubsub:
27        access_createnode: org_account
28        plugins:
29          - flat
30          - pep
31        force_node_config:
32          ## Empêcher les clients bugués de rendre leurs favoris publics
33          storage:bookmarks:
34            access_model: whitelist
35  example.net:
36    modules:
37      mod_muc:
38        hosts: 
39          - muc.example.net
40        access_create: net_account
41        access_persistent: net_account
42        access:
43          - allow
44        access_admin:
45          - allow: admin
46        default_room_options:
47          mam: false
48      mod_proxy65:
49        access: net_account
50        max_connections: 5
51      mod_http_upload:
52        access: net_account
53        put_url: https://@HOST@/xmpp/upload
54        docroot: /var/www/ejabberdupload
55        max_size: 1073741824
56        custom_headers:
57          "Access-Control-Allow-Origin": "https://@HOST@"
58          "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
59          "Access-Control-Allow-Headers": "Content-Type"
60      mod_pubsub:
61        access_createnode: net_account
62        plugins:
63          - flat
64          - pep
65        force_node_config:
66          ## Empêcher les clients bugués de rendre leurs favoris publics
67          storage:bookmarks:
68            access_model: whitelist

Comme ci-dessus, il est possible de désactiver l'accès à certains services par virtualhost à l'aide des ACL, pour par exemple éviter que des comptes de example.net ne créent des salons sur muc.example.org.

Dans ce cas, changez mod_stun_disco en ceci, et n'activez pas l'option listen pour STUN/TURN. Générez un secret d'authentification et partagez-le avec l'instance du serveur TURN.

1  mod_stun_disco:
2    secret: "auth_secret"
3    services:
4      -
5        host: turn.example.net
6        type: stun
7      -
8        host: turn.example.net
9        type: turn

À la base adapté depuis : blos.sm

Salon de support

Ceci n'est évidemment pas une liste exhaustive et si vous avez une très bonne recommandation merci de nous contacter ici : servers@joinjabber.org (web chat) (xmpp)