« Ejabberd » : différence entre les versions

De NCad Wiki
Aller à la navigation Aller à la recherche
Ligne 424 : Ligne 424 :


== Installation ==
== Installation ==
Dans cette installation, le serveur '''Ejabberd''' s'appuiera sur une base de données '''MariaDB'''. Par défaut, '''Ejabberd''' utilise une base de données '''Mnesia'''. Cependant, ce type de base de données ne peut traiter un volume de données supérieure à '''2 Go'''. Pour cette raison, il est préférable d'utiliser une base de données '''SQL'''.
{{ Box Information | objet=Pour cette installation, le serveur de base de données '''MariaDB''' ainsi que le serveur de messagerie instantanée '''Ejabberd''' sont installés sur la même machine. }}


=== Serveur Ejabberd ===
=== Serveur Ejabberd ===

Version du 3 août 2024 à 14:05

Cet article est en cours de rédaction.

Prérequis

Présentation

Le serveur Ejabberd sera hébergé sur un serveur dédié avec les caractéristiques réseaux suivantes :

  • Nom du serveur : xmpp.geocoucou.im
  • Noms d'hôte de messagerie :
    • geocoucou.im : domaine de messagerie principal pour les utilisateurs authentifiés.
    • public.geocoucou.im : domaine de messagerie pour les utilisateurs disposants d'un compte temporaire (comptes invités / anonymes).
  • Services associés :
    • upload.geocoucou.im : serveur d'hébergement des pièces jointes.
    • conference.geocoucou.im : domaine de messagerie des salons de discussion.
  • Adresses IP du serveur Ejabberd :
    • IPv4 : 152.228.135.223
    • IPv6 : 2001:41d0:404:200::5eee
  • Adresse IP du serveur proxy web Apache2 :
    • Nom du serveur : web.cachelou.net
    • IPv4 : 51.38.231.60
    • IPv6 : 2001:41d0:305:2100::9789
Les enregistrements DNS pour les noms d'hôtes xmpp.geocoucou.im et geoucoucou.im pointent sur les adresse IPv4 et IPv6 du serveur hébergeant le service Ejabberd.

Configuration de la zone DNS geocoucou.im

Synthèse

Le nom de domaine geocoucou.im sera spécialement dédié à l'usage de la messagerie instantanée Ejabberd.

  • Voici la liste des enregistrements DNS qui seront déclarées dans la zone nécessaire au bon fonctionnement du protocole XMPP :
Enregistrement DNS
Sous-domaine Type Priorité Poids Port Cible Rôle
@ A 152.228.135.223 Pointage du serveur XMPP pour le nom de domaine geocoucou.im
@ AAAA 2001:41d0:404:200::5eee Pointage du serveur XMPP pour le nom de domaine geocoucou.im
xmpp A 152.228.135.223
xmpp AAAA 2001:41d0:404:200::5eee
_xmpp-client SRV 0 0 5222 xmpp.geocoucou.im Enregistrement pour la découverte automatique des paramètres XMPP pour les clients.
_xmpp-server SRV 0 0 5269 xmpp.geocoucou.im Enregistrement pour la découverte automatique des paramètres XMPP pour les serveur.
conference CNAME xmpp.geocoucou.im Domaine XMPP réservé pour l'hébergement des salons de discussion.
public CNAME xmpp.geocoucou.im Domaine XMPP réservé pour les comptes anonymes.
webchat CNAME web.cachelou.net sous-domaine pointant vers le site hébergeant le webchat Converse.js.
upload CNAME web.cachelou.net Spécifique pour la fonction File HTTP Upload (mod_http_upload). Configuration en reverse proxy.
wss CNAME web.cachelou.net Spécifique pour les échanges nécessitant une connexion websocket. Configuration en reverse proxy.

Configuration DNS de base

  • Vérifions le pointage du champs DNS de type A pour la zone geocoucou.im. Ce dernier doit pointer sur l'adresse IPv4 152.228.135.223 :

dig a geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48588
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;geocoucou.im.                  IN      A

;; ANSWER SECTION:
geocoucou.im.           3600    IN      A       152.228.135.223

;; Query time: 28 msec
;; SERVER: 213.186.33.99#53(213.186.33.99) ;; WHEN: Sun Jul 28 16:32:36 UTC 2024 ;; MSG SIZE rcvd: 57 }}
  • Vérifions le pointage du champs DNS de type AAAA pour la zone geocoucou.im. Ce dernier doit pointer sur l'adresse IPv6 2001:41d0:404:200::5eee :

dig aaaa geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> aaaa geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3116
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;geocoucou.im.                  IN      AAAA

;; ANSWER SECTION:
geocoucou.im.           3600    IN      AAAA    2001:41d0:404:200::5eee

;; Query time: 44 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sun Jul 28 16:33:20 UTC 2024
;; MSG SIZE  rcvd: 69
  • Vérifions le pointage du champs DNS de type A pour le sous-domaine xmpp.geocoucou.im. Ce dernier doit pointer sur l'adresse IPv4 152.228.135.223 :

dig a xmpp.geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> a xmpp.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51841
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;xmpp.geocoucou.im.             IN      A

;; ANSWER SECTION:
xmpp.geocoucou.im.      3600    IN      A       152.228.135.223

;; Query time: 56 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sun Jul 28 18:19:08 UTC 2024
;; MSG SIZE  rcvd: 62
  • Vérifions le pointage du champs DNS de type AAAA pour le sous-domaine xmpp.geocoucou.im. Ce dernier doit pointer sur l'adresse IPv6 2001:41d0:404:200::5eee :

dig aaaa xmpp.geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> aaaa xmpp.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13822
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;xmpp.geocoucou.im.             IN      AAAA

;; ANSWER SECTION:
xmpp.geocoucou.im.      3600    IN      AAAA    2001:41d0:404:200::5eee

;; Query time: 76 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sun Jul 28 18:19:52 UTC 2024
;; MSG SIZE  rcvd: 74
  • Vérifions le pointage du champs DNS de type SRV pour le sous-domaine _xmpp-client.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.geocoucou.im :

dig srv _xmpp-client.geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> srv _xmpp-client.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43567
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;_xmpp-client.geocoucou.im.     IN      SRV

;; ANSWER SECTION:
_xmpp-client.geocoucou.im. 3600 IN      SRV     0 0 5222 xmpp.geocoucou.im.

;; Query time: 52 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sun Jul 28 18:22:38 UTC 2024
;; MSG SIZE  rcvd: 91
  • Vérifions le pointage du champs DNS de type SRV pour le sous-domaine _xmpp-server.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.geocoucou.im :

dig srv _xmpp-server.geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> srv _xmpp-server.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14041
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;_xmpp-server.geocoucou.im.     IN      SRV

;; ANSWER SECTION:
_xmpp-server.geocoucou.im. 3600 IN      SRV     0 0 5269 xmpp.geocoucou.im.

;; Query time: 68 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sun Jul 28 18:24:40 UTC 2024
;; MSG SIZE  rcvd: 91
  • Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine conference.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.geocoucou.im :

dig cname conference.geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> cname conference.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64401
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;conference.geocoucou.im.       IN      CNAME

;; ANSWER SECTION:
conference.geocoucou.im. 3600   IN      CNAME   xmpp.geocoucou.im.

;; Query time: 84 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sun Jul 28 18:15:53 UTC 2024
;; MSG SIZE  rcvd: 71

Pointage DNS pour le module MUC

Ce sous-domaine héberge les services de salons de discussion abrégé ici par MUC (Multi-User Chat).

  • Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine conference.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.cachelou.net :

dig cname conference.geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> conference.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62519
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;conference.geocoucou.im.       IN      A

;; ANSWER SECTION:
conference.geocoucou.im. 3600   IN      CNAME   xmpp.geocoucou.im.

;; Query time: 64 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sat Aug 03 10:07:01 UTC 2024
;; MSG SIZE  rcvd: 87

Pointage DNS pour le module HTTP_FILE_UPLOAD

Ce sous-domaine pointe vers le serveur de fichiers qui stockera les pièces jointes échangées par les utilisateurs du chat.

  • Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine upload.geocoucou.im. Ce dernier doit pointer sur le sous-domaine web.cachelou.net :

dig cname upload.geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> cname upload.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3099
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;upload.geocoucou.im.           IN      CNAME

;; ANSWER SECTION:
upload.geocoucou.im.    3600    IN      CNAME   web.cachelou.net.

;; Query time: 64 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Tue Jul 30 20:04:53 UTC 2024
;; MSG SIZE  rcvd: 78

Pointage DNS pour la fonction WEBSOCKET

  • Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine wss.geocoucou.im. Ce dernier doit pointer sur le sous-domaine web.cachelou.net :

dig cname wss.geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> wss.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48465
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;wss.geocoucou.im.              IN      A

;; ANSWER SECTION:
wss.geocoucou.im.       3600    IN      CNAME   web.cachelou.net.
;; Query time: 28 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sat Aug 03 09:20:02 UTC 2024
;; MSG SIZE  rcvd: 122

Pointage DNS pour le client webchat

  • Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine webchat.geocoucou.im. Ce dernier doit pointer sur le sous-domaine web.cachelou.net :

dig cname webchat.geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> cname webchat.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63589
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;webchat.geocoucou.im.          IN      CNAME

;; ANSWER SECTION:
webchat.geocoucou.im.   3600    IN      CNAME   web.cachelou.net.

;; Query time: 68 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sun Jul 28 18:36:45 UTC 2024
;; MSG SIZE  rcvd: 79

Pointage DNS pour le portail ChatMail (spécifique Géocoucou)

  • Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine chatmail.geocoucou.im. Ce dernier doit pointer sur le sous-domaine web.cachelou.net :

dig cname chatmail.geocoucou.im

; <<>> DiG 9.16.50-Debian <<>> chatmail.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57535
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;chatmail.geocoucou.im.         IN      A

;; ANSWER SECTION:
chatmail.geocoucou.im.  3600    IN      CNAME   web.cachelou.net.

;; Query time: 4 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sat Aug 03 09:24:18 UTC 2024
;; MSG SIZE  rcvd: 127

Installation

Dans cette installation, le serveur Ejabberd s'appuiera sur une base de données MariaDB. Par défaut, Ejabberd utilise une base de données Mnesia. Cependant, ce type de base de données ne peut traiter un volume de données supérieure à 2 Go. Pour cette raison, il est préférable d'utiliser une base de données SQL.

Pour cette installation, le serveur de base de données MariaDB ainsi que le serveur de messagerie instantanée Ejabberd sont installés sur la même machine.

Serveur Ejabberd

  • Installation du paquet ejabberd :

apt-get install ejabberd

  • Installation du paquet erlang-p1-mysql pour l'exploitation d'une base de données SQL (MySQL, MariaDB) :

apt-get install erlang-p1-mysql

  • Pour vérifier si le service fonctionne normalement :

service ejabberd status

  • Création d'un premier compte utilisateur sur le serveur :

ejabberdctl register coyotte geocoucou.im password

Base de données SQL

  • Prérequis :
    • Vous devez disposer d'un serveur de base de données opérationnel. Pour de plus amples informations, reportez-vous à l'article Installer MariaDB.
    • Vous devez disposer d'une base de données avec ses identifiants de connexion. Pour de plus amples informations, reportez-vous à l'article Commandes MySQL.

Les scripts d'installation de la base de données se trouvent à la racine /usr/share/ejabberd/sql.

  • Procéder à l'importation de la structure des tables - à l'aide de la commande mysqldump - dans la base de données nommée ejabberd :

mysql -u root ejabberd < mysql.sql

  • Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis après la ligne :
auth_password_format: scram
  • Ajouter et adapter les lignes suivantes :
auth_method: sql
default_db: sql

sql_type: mysql
sql_server: "localhost"
sql_database: "ejabberd"
sql_username: "ejabberd"
sql_password: "password"
  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart

Configuration

Définition du domaine de messagerie

  • Editer le fichier ejabberd.yml puis rechercher la ligne :
hosts:
  - localhost
  • Remplacer par :
hosts
  - geocoucou.im
  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart

Paramètre du compte administrateur

  • Editer le fichier ejabberd.yml puis rechercher la ligne :
acl:
  admin:
    user:
      - ""
  • Remplacer par :
acl:
  admin:
    user:
      - "coyotte@geocoucou.im"
  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart

Dès à présent, il est possible de se connecter à l'interface d'administration du serveur Ejabberd via le lien https://<IP_SERVEUR_EJABERD:5280/admin.

Activation des protocoles de découverte TURN/STUN

  • Editer le fichier ejabberd.yml puis rechercher la ligne :
-
   port: 3478
   ip: "::"
   transport: udp
   module: ejabberd_stun
   use_turn: true
   ## The server's public IPv4 address:
   # turn_ipv4_address: "203.0.113.3"
   ## The server's public IPv6 address:
   # turn_ipv6_address: "2001:db8::3"
  • Décommenter les lignes ci-dessous et adapter le contenu (éléments en rouge) :
-
   port: 3478
   ip: "::"
   transport: udp
   module: ejabberd_stun
   use_turn: true
   ## The server's public IPv4 address:
   turn_ipv4_address: "152.228.135.223"
   ## The server's public IPv6 address:
   turn_ipv6_address: "2001:41d0:404:200::5eee"
  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart
  • Lorsque la fonction est correctement initialisée, dans les journaux d'activités de Ejabberd /var/log/ejabberd/ejabberd.log nous observons les lignes suivantes :
2024-07-31 11:37:34.735470+00:00 [info] <0.478.0>@mod_stun_disco:parse_listener/1:615 Going to offer STUN/TURN service: 152.228.135.223:3478 (udp)
2024-07-31 11:37:34.735598+00:00 [info] <0.478.0>@mod_stun_disco:parse_listener/1:615 Going to offer STUN/TURN service: [2001:41d0:404:200::5eee]:3478 (udp)

Configuration de l'adresse de contact de l'administrateur

L'adresse de contact est une information qui sera fournit aux utilisateurs pour pouvoir contacter les administrateurs du service par courriel.

  • Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis remplacer :
  mod_disco {}
  • Par les informations suivantes (adapter les éléments en rouge):
  mod_disco:
    server_info:
    -
        modules: all
        name: "abuse-addresses"
        urls: ["mailto:abuse@geocoucou.eu"]
  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart

Configuration des options par défaut pour les salons de discussion

  • Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis après le bloc :
    default_room_options:
      mam: true
  • Ajouter les éléments suivants :
      allow_change_subj: true
      allow_private_messages: true
      allow_private_messages_from_visitors: anyone
      allow_visitor_nickchange: true
      anonymous: false
      presence_broadcast: [moderator,participant,visitor]
      public: true
  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart

Installation du certificat SSL

Pour illustrer cette installation, nous utiliserons un certificat SSL gratuit fournit par Let's Encrypt à l'aide du programme Certbot.

  • Installation de Certbot et de ses dépendances :

apt-get install certbot

  • Lancer Certbot en tapant simplement la commande :
    certbot certonly
  • Le serveur de messagerie Ejabberd ne disposant pas de serveur web, choisir l'option Spin up a temporary webserver (standalone) :
How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  • Saisir une adresse mail. Cette dernière sera utilisée par l'autorité de certification en cas d'échec de renouvellement automatique du certificat :
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Plugins selected: Authenticator standalone, Installer None
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): tech@ncad.fr

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  • Lire et accepter les conditions générales du service en saisissant y puis en tapant sur la touche Entrée :
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in
order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
  • Accepter / refuser la réutilisation de l'adresse mail saisie précédemment à des fins d'informations publicitaires :
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
  • Saisir les domaines pour lesquelles le certificat devra être généré. Dans notre cas il s'agit des adresses geocoucou.im et xmpp.geocoucou.im :
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): geocoucou.im xmpp.geocoucou.im
  • Lorsque le certificat est généré avec succès, prendre note de son emplacement sur le serveur :
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/geocoucou.im/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/geocoucou.im/privkey.pem
   Your certificate will expire on 2024-10-26. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
  • Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis rechercher la ligne :
certfiles:
  - "/etc/ejabberd/ejabberd.pem"
  • Remplacer par :
certfiles:
  - "/etc/letsencrypt/live/geocoucou.im/fullchain.pem"
  - "/etc/letsencrypt/live/geocoucou.im/privkey.pem"
  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart

Sécu

  • Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis après :
  loopback:
    ip:
      - 127.0.0.0/8
      - ::1/128
  • Ajouter :
  net_ncad:
    ip:
      - 109.190.9.125/32

Paramètre du mode moc_http_upload

Ce mode permet d'héberger des fichiers sur le serveur de messagerie instantané. Cette fonction est utilisée pour partager des pièces jointes sur le chat.

Configuration du connecteur Ejabberd

Tout d'abord, il faut autoriser les requêtes HTTP_UPLOAD depuis le connecteur Ejabberd.

  • Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis rechercher le bloc suivant :
 -
   port: 5443
   ip: "::"
   module: ejabberd_http
   tls: true
   protocol_options: 'TLS_OPTIONS'
   request_handlers:
     /api: mod_http_api
     ##/bosh: mod_bosh
     ##/upload: mod_http_upload
     /ws: ejabberd_http_ws
  • Puis, décommenter la ligne suivante :
 -
   port: 5443
   ip: "::"
   module: ejabberd_http
   tls: true
   protocol_options: 'TLS_OPTIONS'
   request_handlers:
     /api: mod_http_api
     ##/bosh: mod_bosh
     /upload: mod_http_upload
     /ws: ejabberd_http_ws
  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart

Paramétrage du module

  • Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis après la ligne :
modules:
  • Ajouter les éléments suivants (adapter les éléments en rouge) :
 mod_http_upload:
   access: local
   thumbnail: false
   docroot: "/var/lib/ejabberd/upload"
   put_url: "https://upload.@HOST@/upload"
   custom_headers:
         "Access-Control-Allow-Origin": "*"
         "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
         "Access-Control-Allow-Headers": "Content-Type"
  • Créer le répertoire qui contiendra les fichiers téléchargés sur le serveur et octroyer les autorisations adéquates :

mkdir /var/lib/ejabberd/upload
chown ejabberd:ejabberd /var/lib/ejabberd/upload
chmod 777 /var/lib/ejabberd/upload

  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart

Paramétrage du reverse proxy

  • Dans notre cas, le sous domaine upload.geocoucou.im pointe sur un serveur web Apache2 externe. Nous allons créer un nouveau vhost pour cet hôte.
  • À la racine /etc/apache2/sites-available/, créer le fichier upload.geocoucou.im.conf et y renseigner la configuration du reverse proxy suivante (adapter les éléments en rouge) :
ProxyRequests Off
RewriteEngine on
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

<VirtualHost *:80>
 		ServerName upload.geocoucou.im

		ErrorLog ${APACHE_LOG_DIR}/rev-upload.geocoucou.im_error.log
		CustomLog ${APACHE_LOG_DIR}/rev-upload.geocoucou.im_access.log combined

		ProxyPreserveHost On
		ProxyVia Full
		RequestHeader edit Transfer-Encoding Chunked chunked early
		RequestHeader unset Accept-Encoding
		CheckSpelling On
		TimeOut 1800

		ProxyPass / https://xmpp.geocoucou.im:5443/
		ProxyPassReverse / https://xmpp.geocoucou.im:5443/
</VirtualHost>
  • Pour appliquer la nouvelle configuration, activer le nouveau vhost puis redémarrer le serveur Apache2 :

a2ensite upload.geocoucou.im.conf
service apache2 restart

  • Ensuite, nous utilisons le programme Certbot pour l'installation du certificat SSL.
  • Pour valider le bon fonctionnement du vhost, ouvrir un navigateur web et se rendre à l'url https://upload.geocoucou.im/upload. Le serveur retournera le message not found.

Paramètres de l'API

une API permet à une application tierce de pouvoir exécuter des commandes sur le serveur Ejabberd. La liste des commandes disponibles est consultable depuis la documentation en ligne en distinguant les commandes liées à l'administration du service et les commandes liées à l'administration des salons de discussion.

Pour illustrer cette section, nous disposons donc :

  • D'un serveur de messagerie instantané Ejabberd.
  • D'un serveur web fonctionnant sur Apache2 et qui jouera les rôles de :
    • Serveur web pour l'hébergement de notre application.
    • Serveur web proxy pour gérer les flux entre notre application et notre serveur Ejabbers.

À cet effet, pour mener à bien cette architecture il faudra :

  • Activer la fonction API sur le connecteur Ejabberd en déclarant le module mod_http_api.
  • Autoriser notre application web à pouvoir requêter le serveur Ejabberd via le module mod_http_api.
  • Configurer le vhost Apache2 pour l'hébergement de l'application web.
  • Configurer le vhost proxy Apache2 pour capter les échanges entre l'application et le serveur Ejabberd.

Activation du module mod_http_api

  • Pour activer le module mod_http_api sur le port d'écoute 5443 du serveur Ejabberd, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml puis adapter les éléments en rouge :
 -
   port: 5443
   ip: "::"
   module: ejabberd_http
   tls: true
   protocol_options: 'TLS_OPTIONS'
   request_handlers:
     /api: mod_http_api
     /bosh: mod_bosh
     ## /captcha: ejabberd_captcha
     /upload: mod_http_upload
     /ws: ejabberd_http_ws
  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart
  • Pour valider le bon fonctionnement du connecteur, ouvrir un navigateur web et se rendre à l'url https://xmpp.geocoucou.im/api. La page suivante devrait s'afficher :

EJABBERD PROXY API INDEX.png

Mise à jour des permissions

  • Pour autoriser l'application à exécuter n'importe quel commande sur le serveur Ejabber, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml puis remplacer :
 "public commands":
   who:
     ip:
       - 127.0.0.1/8
   what:
     - status
     - connected_users_number
  • Par les éléments suivants :
 "public commands":
   who:
     ip:
       - 127.0.0.1/8
       - 51.38.231.60/32
       - 2001:41d0:305:2100:9789/56
   what: "*"
  • Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
    service ejabberd restart

Paramétrage du reverse proxy

Les applications web utilisant une connexion API pointeront plutôt sur serveur proxy plutôt que directement sur le serveur Ejabberd.

  • Dans notre cas, le sous domaine api.geocoucou.im pointe sur un serveur web Apache2 externe. Nous allons créer un nouveau vhost pour cet hôte.
  • À la racine /etc/apache2/sites-available/, créer le fichier api.geocoucou.im.conf et y renseigner la configuration du reverse proxy suivante (adapter les éléments en rouge) :
ProxyRequests Off
RewriteEngine on
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

<VirtualHost *:80>
 		ServerName api.geocoucou.im

		ErrorLog ${APACHE_LOG_DIR}/rev-api.geocoucou.im_error.log
		CustomLog ${APACHE_LOG_DIR}/rev-api.geocoucou.im_access.log combined

		ProxyPreserveHost On
		ProxyVia Full
		RequestHeader edit Transfer-Encoding Chunked chunked early
		RequestHeader unset Accept-Encoding
		CheckSpelling On
		TimeOut 1800

		ProxyPass / https://xmpp.geocoucou.im:5443/
		ProxyPassReverse / https://xmpp.geocoucou.im:5443/
</VirtualHost>
  • Pour appliquer la nouvelle configuration, activer le nouveau vhost puis redémarrer le serveur Apache2 :

a2ensite upload.geocoucou.im.conf
service apache2 restart

  • Ensuite, nous utilisons le programme Certbot pour l'installation du certificat SSL.
  • Pour valider le bon fonctionnement du vhost, ouvrir un navigateur web et se rendre à l'url https://api.geocoucou.im/ws. La page suivante devrait s'afficher :

EJABBERD PROXY API INDEX.png

Analyse des journaux d'évènements

  • Les événements suivants ont été générés en s'authentifiant simplement sur le portail https://webchat.geocoucou.im. L'authentification s'appuie sur la commande check_password.
  • Lorsqu'on consulte le journal d'événement du serveur web proxy Apache2, on peut observer la ligne suivante :
2001:41d0:305:2100::9789 - - [03/Aug/2024:11:36:49 +0000] "POST /api/check_password HTTP/1.1" 200 3072 "-" "-"
  • L'adresse IP correspond à celle du serveur web hébergeant l'application (Dans notre cas, l'application et le serveur proxy sont sur la même machine). Par ailleurs, on peut remarquer l'envoi d'une commande POST à l'url /api/check_password. Le serveur retourne un code d'état 200 ce qui signifie que la commande s'est exécutée sans erreur.
  • Maintenant, si nous observons les journaux d'évènements du serveur Ejabberd, nous pouvons remarquer les deux lignes suivantes :
2024-08-03 11:36:53.004757+00:00 [info] <0.364.0>@ejabberd_listener:accept/7:273 (<0.2740.0>) Accepted connection [::ffff:51.38.231.60]:51652 -> [::ffff:152.228.135.223]:5443
2024-08-03 11:36:53.025377+00:00 [info] <0.2740.0>@mod_http_api:log/3:510 API call check_password [{<<"user">>,<<"cach3ln">>},
                        {<<"host">>,<<"geocoucou.im">>},
                        {<<"password">>,<<"***">>}] from ::ffff:51.38.231.60:51652
  • Tout d'abord, dans la première ligne, nous retrouvons les informations de connexion du flux. On remarquera l'adresse IP du serveur web proxy et celle du serveur Ejabberd. Par ailleurs, le serveur web proxy attaque bien le serveur Ejabberd sur le port 5443.
  • Concernant la seconde ligne, c'est la trace de la commande reçue et traitée par le serveur Ejabberd. Dans le cas de la commande check_passord, on retrouve bien les paramètres d'authentification soumis via la commande POST par le serveur web proxy.

Installation du client XMPP-WEB

Présentation

XMPP-WEB est client web léger de messagerie instantané intégrant les fonctionnalités de base du protocole XMPP. La dernière version peut être récupérée depuis le dépôt GitHub à l'adresse : https://github.com/nioc/xmpp-web.

Paramétrage du reverse proxy

Le client XMPP-WEB utilise une connexion websocket pour communiquer avec le serveur Ejabberd.

  • Dans notre cas, le sous domaine wss.geocoucou.im pointe sur un serveur web Apache2 externe. Nous allons créer un nouveau vhost pour cet hôte.
  • À la racine /etc/apache2/sites-available/, créer le fichier wss.geocoucou.im.conf et y renseigner la configuration du reverse proxy suivante (adapter les éléments en rouge) :
ProxyRequests Off
RewriteEngine on
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

<VirtualHost *:80>
 		ServerName wss.geocoucou.im

		ErrorLog ${APACHE_LOG_DIR}/rev-wss.geocoucou.im_error.log
		CustomLog ${APACHE_LOG_DIR}/rev-wss.geocoucou.im_access.log combined

		ProxyPreserveHost On
		ProxyVia Full
		RequestHeader edit Transfer-Encoding Chunked chunked early
		RequestHeader unset Accept-Encoding
		CheckSpelling On
		TimeOut 1800

		ProxyPass / wss://xmpp.geocoucou.im:5443/
		ProxyPassReverse / wss://xmpp.geocoucou.im:5443/
</VirtualHost>
  • Pour appliquer la nouvelle configuration, activer le nouveau vhost puis redémarrer le serveur Apache2 :

a2ensite wss.geocoucou.im.conf
service apache2 restart

  • Ensuite, nous utilisons le programme Certbot pour l'installation du certificat SSL.
  • Pour valider le bon fonctionnement du vhost, ouvrir un navigateur web et se rendre à l'url https://wss.geocoucou.im/ws. La page suivante devrait s'afficher :

EJABBERD PROXY WSS INDEX.png

Ainsi, au lieu de faire pointer le connecteur websocket sur l'url wss://xmpp.geocoucou.im:5443/ws (qui peut être bloqué pour certains clients si leur pare-feu bloque le port 5443), il peut directement pointer sur l'url wss://wss.geocoucou.im/ws.

Paramétrage du pare-feu

Matrice des flux autorisés

Par défaut, les flux non listés ci-dessous ne sont pas autorisés sur l’équipement.

Matrice de flux
Source Protocole(s) Port(s) Description
* tcp 22 Accès SSH, SFTP.
* udp 3478 Protocole STUN/TURN pour Ejabberd.
* tcp 5280 Accès interface d'administration Ejabberd.
* tcp 5222 Connexion des clients XMPP au serveur Ejabberd.
* tcp 5223 Connexion des clients XMPP au serveur Ejabberd avec TLS.
* tcp 5225 Connexion des clients XMPP au serveur Ejabberd avec TLS derrière un reverse proxy.
* tcp 5269 Echanges entre serveurs XMPP.
proxy.cachelou.net tcp 5443 Flux spécifiques pour les requêtes API, BOSH et HTTP_UPLOAD.
<@IP_SUPERVISION> udp 161,162 Accès SNMP depuis serveur supervision.
* icmp Réponse aux requêtes ping.

Configuration iptables sur la couche IPv4

  • Installation des paquets iptables (pare-feu) et iptables-persistent (sauvegarde persistante de la configuration).

root@apache2:~# apt-get install iptables iptables-persistent -y

  • Ajout des règles iptables pour autoriser les flux SSH, ICMP et MySQL :

root@ejabberd:~# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
root@ejabberd:~# iptables -A INPUT -p tcp --dport 3478 -j ACCEPT
root@ejabberd:~# iptables -A INPUT -p tcp --dport 5280 -j ACCEPT
root@ejabberd:~# iptables -A INPUT -p tcp --dport 5222 -j ACCEPT
root@ejabberd:~# iptables -A INPUT -p tcp --dport 5223 -j ACCEPT
root@ejabberd:~# iptables -A INPUT -p tcp --dport 5225 -j ACCEPT
root@ejabberd:~# iptables -A INPUT -p tcp --dport 5269 -j ACCEPT
root@ejabberd:~# iptables -A INPUT -s proxy.cachelou.net -p tcp --dport 5443 -j ACCEPT
root@ejabberd:~# iptables -A INPUT -p udp -m multiport -s <@IP_SUPERVISION> --dports 161,162 -j ACCEPT
root@ejabberd:~# iptables -A INPUT -p icmp -j ACCEPT
root@ejabberd:~# iptables -A INPUT -i lo -j ACCEPT
root@ejabberd:~# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
root@ejabberd:~# iptables -P INPUT DROP

  • Sauvegarde de la configuration et application automatique à chaque redémarrage du système.

root@ejabberd:~# dpkg-reconfigure iptables-persistent