« Ejabberd » : différence entre les versions
(214 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
{{ Box Construction | article }} | {{ Box Construction | article }} | ||
== 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 [[:Installer_Apache2 | Apache2]] :''' | |||
** '''Nom du serveur :''' web.cachelou.net | |||
** '''IPv4 :''' 51.38.231.60 | |||
** '''IPv6 :''' 2001:41d0:305:2100::9789 | |||
{{ Box Remarque | objet=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 ==== | |||
{{ Box Information | objet=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''' : | |||
{| class="wikitable" style="margin:auto" | |||
|+ 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._tcp | |||
| SRV | |||
| 0 | |||
| 0 | |||
| 5222 | |||
| xmpp.geocoucou.im | |||
| Configuration pour les échanges entre les '''clients de messagerie instantanés''' et le '''serveur XMPP'''. | |||
|- | |||
| _xmpp-server._tcp | |||
| SRV | |||
| 0 | |||
| 0 | |||
| 5269 | |||
| xmpp.geocoucou.im | |||
| Configuration pour les échanges entre les '''serveurs XMPP'''. | |||
|- | |||
| _xmpps-client._tcp | |||
| SRV | |||
| 0 | |||
| 0 | |||
| 5223 | |||
| xmpp.geocoucou.im | |||
| Configuration pour les échanges entre les '''clients de messagerie instantanés''' et le '''serveur XMPP''' via un '''canal sécurisé TLS'''. | |||
|- | |||
| _xmpps-server._tcp | |||
| SRV | |||
| 0 | |||
| 0 | |||
| 5270 | |||
| xmpp.geocoucou.im | |||
| Configuration pour les échanges entre les '''serveurs XMPP''' via un '''canal sécurisé TLS'''. | |||
|- | |||
| 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 / invités'''. | |||
|- | |||
| upload | |||
| CNAME | |||
| — | |||
| — | |||
| — | |||
| web.cachelou.net | |||
| Spécifique pour la fonction '''File HTTP Upload''' ''(mod_http_upload)''. <span style="color:orange">{{#fas:exclamation-triangle}}</span> Configuration en reverse proxy. | |||
|- | |||
| wss | |||
| CNAME | |||
| — | |||
| — | |||
| — | |||
| web.cachelou.net | |||
| Spécifique pour les échanges nécessitant une connexion '''websocket'''. <span style="color:orange">{{#fas:exclamation-triangle}}</span> 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''' : | |||
{{ Box Console | objet=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: | |||
<span style="color:green">geocoucou.im. 3600 IN A 152.228.135.223</span> | |||
;; Query time: 28 msec<br /> | |||
;; 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''' : | |||
{{ Box Console | objet=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: | |||
<span style="color:green">geocoucou.im. 3600 IN AAAA 2001:41d0:404:200::5eee</span> | |||
;; 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''' : | |||
{{ Box Console | objet=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: | |||
<span style="color:green">xmpp.geocoucou.im. 3600 IN A 152.228.135.223</span> | |||
;; 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''' : | |||
{{ Box Console | objet=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: | |||
<span style="color:green">xmpp.geocoucou.im. 3600 IN AAAA 2001:41d0:404:200::5eee</span> | |||
;; 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._tcp.geocoucou.im'''. Ce dernier doit pointer sur le sous-domaine '''xmpp.geocoucou.im''' : | |||
{{ Box Console | objet=dig srv _xmpp-client._tcp.geocoucou.im }} | |||
; <<>> DiG 9.16.50-Debian <<>> srv _xmpp-client._tcp.geocoucou.im | |||
;; global options: +cmd | |||
;; Got answer: | |||
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48499 | |||
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | |||
;; OPT PSEUDOSECTION: | |||
; EDNS: version: 0, flags:; udp: 1232 | |||
;; QUESTION SECTION: | |||
;_xmpp-client._tcp.geocoucou.im. IN SRV | |||
;; ANSWER SECTION: | |||
<span style="color:green">_xmpp-client._tcp.geocoucou.im. 3600 IN SRV 0 5 5222 xmpp.geocoucou.im.</span> | |||
;; Query time: 80 msec | |||
;; SERVER: 213.186.33.99#53(213.186.33.99) | |||
;; WHEN: Sat Aug 03 22:22:08 UTC 2024 | |||
;; MSG SIZE rcvd: 96 | |||
* Vérifions le pointage du '''champs DNS''' de type '''SRV''' pour le sous-domaine '''_xmpps-client._tcp.geocoucou.im'''. Ce dernier doit pointer sur le sous-domaine '''xmpp.geocoucou.im''' : | |||
{{ Box Console | objet=dig srv _xmpps-client._tcp.geocoucou.im }} | |||
; <<>> DiG 9.16.50-Debian <<>> srv _xmpps-client._tcp.geocoucou.im | |||
;; global options: +cmd | |||
;; Got answer: | |||
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50852 | |||
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | |||
;; OPT PSEUDOSECTION: | |||
; EDNS: version: 0, flags:; udp: 1232 | |||
;; QUESTION SECTION: | |||
;_xmpps-client._tcp.geocoucou.im. IN SRV | |||
;; ANSWER SECTION: | |||
<span style="color:green">_xmpps-client._tcp.geocoucou.im. 3600 IN SRV 0 5 5223 xmpp.geocoucou.im.</span> | |||
;; Query time: 76 msec | |||
;; SERVER: 213.186.33.99#53(213.186.33.99) | |||
;; WHEN: Sat Aug 03 22:34:43 UTC 2024 | |||
;; MSG SIZE rcvd: 97 | |||
* Vérifions le pointage du '''champs DNS''' de type '''SRV''' pour le sous-domaine '''_xmpp-server._tcp.geocoucou.im'''. Ce dernier doit pointer sur le sous-domaine '''xmpp.geocoucou.im''' : | |||
{{ Box Console | objet=dig srv _xmpp-server._tcp.geocoucou.im }} | |||
; <<>> DiG 9.16.50-Debian <<>> srv _xmpp-server._tcp.geocoucou.im | |||
;; global options: +cmd | |||
;; Got answer: | |||
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10740 | |||
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | |||
;; OPT PSEUDOSECTION: | |||
; EDNS: version: 0, flags:; udp: 1232 | |||
;; QUESTION SECTION: | |||
;_xmpp-server._tcp.geocoucou.im. IN SRV | |||
;; ANSWER SECTION: | |||
<span style="color:green">_xmpp-server._tcp.geocoucou.im. 3600 IN SRV 0 5 5269 xmpp.geocoucou.im.</span> | |||
;; Query time: 80 msec | |||
;; SERVER: 213.186.33.99#53(213.186.33.99) | |||
;; WHEN: Sat Aug 03 22:37:40 UTC 2024 | |||
;; MSG SIZE rcvd: 96 | |||
* Vérifions le pointage du '''champs DNS''' de type '''SRV''' pour le sous-domaine '''_xmpps-server._tcp.geocoucou.im'''. Ce dernier doit pointer sur le sous-domaine '''xmpp.geocoucou.im''' : | |||
{{ Box Console | objet=dig srv _xmpps-server._tcp.geocoucou.im }} | |||
; <<>> DiG 9.16.50-Debian <<>> srv _xmpps-server._tcp.geocoucou.im | |||
;; global options: +cmd | |||
;; Got answer: | |||
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19399 | |||
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | |||
;; OPT PSEUDOSECTION: | |||
; EDNS: version: 0, flags:; udp: 1232 | |||
;; QUESTION SECTION: | |||
;_xmpps-server._tcp.geocoucou.im. IN SRV | |||
;; ANSWER SECTION: | |||
<span style="color:green">_xmpps-server._tcp.geocoucou.im. 3600 IN SRV 0 5 5270 xmpp.geocoucou.im.</span> | |||
;; Query time: 40 msec | |||
;; SERVER: 213.186.33.99#53(213.186.33.99) | |||
;; WHEN: Sat Aug 03 22:36:34 UTC 2024 | |||
;; MSG SIZE rcvd: 97 | |||
* 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''' : | |||
{{ Box Console | objet=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: | |||
<span style="color:green">conference.geocoucou.im. 3600 IN CNAME xmpp.geocoucou.im.</span> | |||
;; 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 ==== | |||
{{ Box Information | objet=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''' : | |||
{{ Box Console | objet=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: | |||
<span style="color:green">conference.geocoucou.im. 3600 IN CNAME xmpp.geocoucou.im.</span> | |||
;; 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 ==== | |||
{{ Box Information | objet=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 serveur web proxy reverse '''web.cachelou.net''' : | |||
{{ Box Console | objet=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: | |||
<span style="color:green">upload.geocoucou.im. 3600 IN CNAME web.cachelou.net.</span> | |||
;; 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 serveur web proxy reverse '''web.cachelou.net''' : | |||
{{ Box Console | objet=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: | |||
<span style="color:green">wss.geocoucou.im. 3600 IN CNAME web.cachelou.net.</span> | |||
;; 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 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 serveur web '''web.cachelou.net''' : | |||
{{ Box Console | objet=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: | |||
<span style="color:green">chatmail.geocoucou.im. 3600 IN CNAME web.cachelou.net.</span> | |||
;; 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 == | == Installation == | ||
Dans cette installation, le serveur '''Ejabberd''' s'appuiera sur une base de données '''[[:Installer_MariaDB|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 === | ||
Ligne 16 : | Ligne 471 : | ||
{{ Box Console | objet=service ejabberd status }} | {{ Box Console | objet=service ejabberd status }} | ||
* Création d'un premier '''compte utilisateur''' sur le serveur : | |||
{{ Box Console | objet= ejabberdctl register coyotte geocoucou.im password }} | |||
=== Base de données SQL === | |||
* Le script d'installation de la base de données se trouve à la racine '''/usr/share/ejabberd/sql'''. Importer le script dans la base de données dédiée nommée '''ejabberd''' : | |||
{{ Box Console | objet=mysql -u root ejabberd < /usr/share/ejabberd/sql/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 en fonction des '''paramètres de connexion''' de la base de données : | |||
# Méthode d'authentification par défaut : SQL | |||
auth_method: sql | |||
# Méthode de stockage par défaut : SQL | |||
default_db: sql | |||
# Paramètres de connexion de la base de données Ejabberd | |||
sql_type: mysql | |||
sql_server: "<span style="color:red">localhost</span>" | |||
sql_database: "<span style="color:red">ejabberd</span>" | |||
sql_username: "<span style="color:red">ejabberd</span>" | |||
sql_password: "<span style="color:red">password</span>" | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
== Configuration == | |||
La configuration du serveur '''Ejabberd''' est enregistrée dans le fichier '''/etc/ejabberd/ejabberd.yml'''. Il s'agit d'un fichier écrit en language '''YAML''' ''(Yet Another Markup Language)''. En cas d'erreur de démarrage du service '''Ejabberd''', après la modification du fichier de configuration, consulter le journal des erreurs disponible à l'emplacement '''/var/log/ejabberd/error.log'''. | |||
{{ Box Attention | objet=Veuillez respecter les '''indentations''' pour les différents paramètres. Il ne s'agit pas seulement d'un style de mise en forme. En cas de non respect, le service '''Ejabberd''' retournera des erreurs et ne démarrera pas. }} | |||
=== Définition du domaine de messagerie === | |||
* Editer le fichier '''ejabberd.yml''' puis rechercher la ligne : | * Editer le fichier '''ejabberd.yml''' puis rechercher la ligne : | ||
hosts: | hosts: | ||
- localhost | - <span style="color:red">localhost</span> | ||
* Remplacer par : | * Remplacer par : | ||
hosts | hosts | ||
- geocoucou.im | - <span style="color:green">geocoucou.im</span> | ||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
=== Paramètre du compte administrateur === | |||
* | * Le compte '''administrateur''' dispose de '''privilèges étendus''' sur le serveur. Par défaut, aucun compte n'est associé à ce rôle. Pour cela, éditer le fichier '''ejabberd.yml''' puis rechercher la ligne : | ||
acl: | acl: | ||
admin: | admin: | ||
user: | user: | ||
- "" | - <span style="color:red">""</span> | ||
* | * Puis renseigner l''''adresse JID''' du compte créé lors de l'installation du serveur '''Ejabberd''' : | ||
acl: | acl: | ||
admin: | admin: | ||
user: | user: | ||
- " | - <span style="color:green">"coyotte@geocoucou.im"</span> | ||
* Nous allons également déclarer une nouvelle '''ACL''' nommée '''net_remote_admin''' et qui contiendra l''''adresse IP''' du client autorisé à se connecter avec le '''compte administrateur''' : | |||
acl: | |||
net_remote_admin: | |||
ip: | |||
- 109.190.143.97/32 | |||
* Maintenant, il faut déclarer cette '''ACL''' dans les paramètres d'autorisation de l''''API'''. Pour cela, rechercher le bloc : | |||
api_permissions: | |||
<span style="color:grey">''...''</span> | |||
"admin access": | |||
who: | |||
access: | |||
allow: | |||
- acl: loopback | |||
- acl: admin | |||
* Puis, y ajouter l''''ACL''' créée précédemment ''(identifiée en <span style="color:red">rouge</span>)'' : | |||
api_permissions: | |||
<span style="color:grey">''...''</span> | |||
"admin access": | |||
who: | |||
access: | |||
allow: | |||
<span style="color:red">- acl: net_remote_admin</span> | |||
- acl: loopback | |||
- acl: admin | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
{{ Box Information | objet= Dès à présent, il est possible de se connecter à l''''interface d'administration''' du serveur '''Ejabberd''' via le lien '''https://xmpp.geocoucou.im: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 <span style="color:red">rouge</span>)'' : | |||
- | |||
<span style="color:grey">port: 3478 | |||
ip: "::" | |||
transport: udp | |||
module: ejabberd_stun | |||
use_turn: true | |||
## The server's public IPv4 address:</span> | |||
turn_ipv4_address: "<span style="color:red">152.228.135.223</span>" | |||
<span style="color:grey">## The server's public IPv6 address:</span> | |||
turn_ipv6_address: "<span style="color:red">2001:41d0:404:200::5eee</span>" | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|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 === | |||
{{ Box Information | objet=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 <span style="color:red">rouge</span>)'': | |||
mod_disco: | |||
server_info: | |||
- | |||
modules: all | |||
name: "<span style="color:red">abuse-addresses</span>" | |||
urls: ["<span style="color:red">mailto:abuse@geocoucou.eu</span>"] | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|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 : {{Commande|service ejabberd restart}} | |||
=== Installation du certificat SSL === | |||
{{ Box Information | objet=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 : | |||
{{ Box Console | objet=apt-get install certbot }} | |||
* Lancer '''Certbot''' en tapant simplement la commande :{{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? | |||
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |||
<span style="color:green">1: Spin up a temporary webserver (standalone)</span> | |||
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): <span style="color:green">tech@ncad.fr</span> | |||
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |||
* 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: <span style="color:green">y</span> | |||
* 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: <span style="color:green">y</span> | |||
* 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): <span style="color:green">geocoucou.im xmpp.geocoucou.im</span> | |||
* 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: | |||
<span style="color:green">/etc/letsencrypt/live/geocoucou.im/fullchain.pem</span> | |||
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: | |||
- <span style="color:red">"/etc/ejabberd/ejabberd.pem"</span> | |||
* Remplacer par : | |||
certfiles: | |||
- <span style="color:green">"/etc/letsencrypt/live/geocoucou.im/fullchain.pem"</span> | |||
- <span style="color:green">"/etc/letsencrypt/live/geocoucou.im/privkey.pem"</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
=== Paramètre du module mod_http_upload === | |||
{{ Box Information | objet=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'''. Pour cela, éditer 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 : | |||
<span style="color:grey">- | |||
port: 5443 | |||
ip: "::" | |||
module: ejabberd_http | |||
tls: true | |||
protocol_options: 'TLS_OPTIONS' | |||
request_handlers: | |||
/api: mod_http_api | |||
##/bosh: mod_bosh</span> | |||
<span style="color:green">/upload: mod_http_upload</span> | |||
<span style="color:grey">/ws: ejabberd_http_ws</span> | |||
* Enfin, redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|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 <span style="color:red">rouge</span>)'' : | |||
mod_http_upload: | |||
access: local | |||
thumbnail: false | |||
docroot: "<span style="color:red">/var/lib/ejabberd/upload</span>" | |||
put_url: "<span style="color:red">https://upload.@HOST@/upload</span>" | |||
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 : | |||
{{ Box Console | objet=mkdir <span style="color:red">/var/lib/ejabberd/upload</span><br /> | |||
chown ejabberd:ejabberd <span style="color:red">/var/lib/ejabberd/upload</span><br /> | |||
chmod 777 <span style="color:red">/var/lib/ejabberd/upload</span> }} | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|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 proxy reverse suivante ''(adapter les éléments en <span style="color:red">rouge</span>)'' : | |||
ProxyRequests Off | |||
RewriteEngine on | |||
SSLProxyEngine on | |||
SSLProxyVerify none | |||
SSLProxyCheckPeerCN off | |||
SSLProxyCheckPeerName off | |||
SSLProxyCheckPeerExpire off | |||
<VirtualHost *:80> | |||
ServerName <span style="color:red">upload.geocoucou.im</span> | |||
ErrorLog ${APACHE_LOG_DIR}/<span style="color:red">rev-upload.geocoucou.im_error.log</span> | |||
CustomLog ${APACHE_LOG_DIR}/<span style="color:red">rev-upload.geocoucou.im_access.log</span> combined | |||
ProxyPreserveHost On | |||
ProxyVia Full | |||
RequestHeader edit Transfer-Encoding Chunked chunked early | |||
RequestHeader unset Accept-Encoding | |||
CheckSpelling On | |||
TimeOut 1800 | |||
ProxyPass / https://<span style="color:red">xmpp.geocoucou.im</span>:5443/ | |||
ProxyPassReverse / https://<span style="color:red">xmpp.geocoucou.im</span>:5443/ | |||
</VirtualHost> | |||
* Pour appliquer la nouvelle configuration, '''activer''' le nouveau VHost puis '''redémarrer''' le serveur Apache2 : | |||
{{ Box Console | objet=a2ensite upload.geocoucou.im.conf<br />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''' | |||
== Fonctionnalités avancées == | |||
=== Configuration du module ARCHIVAGE ''(mod_mam)'' === | |||
Ce module permet aux utilisateurs de conserver un historique de leurs dernières conversations. L'implémentation de cette fonction est décrite dans la norme [https://xmpp.org/extensions/xep-0313.html XEP-0313]. | |||
==== Activation du module ==== | |||
{| class="wikitable" style="margin:auto" | |||
|+ Paramètres du module mod_register | |||
|- | |||
! Paramètre | |||
! Type | |||
! Description | |||
|- | |||
| access_preferences | |||
| AccessName | |||
| Permet de définir qui peut modifier les '''paramètres d'archivage'''. Par défaut, '''tout le monde''' peut gérer cette fonctionnalité pour son propre compte. | |||
|- | |||
| compress_xml | |||
| true / false | |||
| Active la '''compression''' pour les messages archivés. Cette fonctionnalité est uniquement compatible avec des moteurs de '''bases de données SQL'''. Par défaut, la valeur est définie à '''false'''. | |||
|- | |||
| db_type | |||
| mnesia / sql | |||
| Type de '''bases de données''' utilisée pour ce module. | |||
|- | |||
| default | |||
| always / never / roster | |||
| Définit la stratégie d'activation par défaut de ce module. Par défaut, la valeur est définie à '''never'''. Les options possibles sont :<br /> | |||
- '''always :''' tout les messages sont archivé.<br /> | |||
- '''roster :''' seuls les conversations effectuées avec un membre de la liste de contact sont archivés.<br /> | |||
- '''never :''' l'historique est désactivé. | |||
|} | |||
* Pour activer le module avec les paramètres par défaut, éditer le fichier de configuration '''/etc/ejabberd/ejabberd.yml''' puis ajouter les éléments suivants ''(identifiés en <span style="color:red">rouge</span>)'' : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:red">mod_mam: | |||
db_type: sql | |||
compress_xml: true | |||
default: always</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Définir qui est autorisé à gérer cette fonction ==== | |||
* Dans cet exemple, la fonctionnalité pourra uniquement être paramétré par les administrateurs. Dans la section '''access_rules''', déclarer une nouvelle règle d'accès nommée '''mam_preferences''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
access_rules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">mam_preferences: | |||
allow: admin | |||
deny: all</span> | |||
* Enfin, dans la section '''module''', ajouter le paramètre '''access_preferences''' pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_mam: | |||
<span style="color:blue">access_preferences: mam_preferences</span> | |||
db_type: sql | |||
compress_xml: true | |||
default: always | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
=== Configuration du module INSCRIPTION ''(mod_register)'' === | |||
Ce module permet aux utilisateurs de '''créer un nouveau compte XMPP''' sur le serveur '''Ejabberd ''' depuis un client de messagerie instantané compatible avec la norme [https://xmpp.org/extensions/xep-0077.html XEP-0077]. | |||
Pour illustrer cette section, nous prendrons comme exemple les besoins suivants : | |||
* Seuls les clients fonctionnant sur notre '''réseau informatique''' ou hébergé sur notre '''serveur web''' peuvent '''créer un nouveau compte XMPP''' sur le serveur '''Ejabberd'''. | |||
* Seuls les clients fonctionnant sur notre '''réseau informatique''' ou hébergé sur notre '''serveur web''' peuvent '''supprimer leur compte XMPP''' sur le serveur '''Ejabberd'''. | |||
* Le nom d'utilisateur doit respecter les '''exigences de syntaxe''' suivantes : | |||
** Être composé de caractères '''alphanumériques'''. | |||
** Ne pas commencer par un '''chiffre''' ou le '''caractère spécial''' _ ou -. | |||
** Ne pas se terminer par le '''caractère spécial''' _ ou -. | |||
** Ne pas contenir de '''termes techniques''' réservés comme admin, abuse, contact, tech, webmaster, staff, dns, mail, xmpp, ... . | |||
* Pour toutes '''nouvelles inscription''', le compte XMPP cach3ln@geocoucou.im sera notifié. | |||
* Les nouveaux utilisateurs seront accueillis par un '''message de bienvenue''' leur rappelant les règles d'usage. | |||
==== Activation du module ==== | |||
* Voici la liste des '''paramètres optionnels''' qui seront détaillés par la suite : | |||
{| class="wikitable" style="margin:auto" | |||
|+ Paramètres du module mod_register | |||
|- | |||
! Paramètre | |||
! Type | |||
! Description | |||
|- | |||
| access | |||
| AccessName | |||
| Permet de contrôler la '''syntaxe''' du login souhaité par l'utilisateur. Le contrôle s'effectue via un filtre basé sur les '''expressions régulières''' ''(REGEXP)''. | |||
|- | |||
| access_from | |||
| AccessName | |||
| Par défaut, '''Ejabberd''' n'autorise pas la création de '''nouveau compte XMPP''' depuis une connexion '''s2s''' ou encore une session '''c2s''' existante. Cela permet d'éviter la création massive de comptes ''(via des robots notament)''. | |||
|- | |||
| access_remove | |||
| AccessName | |||
| Par défaut, tout utilisateur peut '''supprimer son compte'''. Il est possible avec ce paramètre de restreindre cette fonction. | |||
|- | |||
| ip_access | |||
| AccessName | |||
| Par défaut, il n'y a pas de restriction sur l''''adresse IP''' du '''client XMPP''' souhaitant '''créer un nouveau compte''' sur le serveur '''Ejabberd'''. Il est possible de définir via ce paramètre les adresses IP autorisées. | |||
|- | |||
| redirect_url | |||
| URL | |||
| Si ce paramètres est définit, alors lors de la tentative de création d'un nouveau compte par un client XMPP, le serveur '''Ejabberd''' retournera l'url définit par ce paramètre. | |||
|- | |||
| registration_watchers | |||
| JIDs | |||
| Ce paramètre permet de définir la '''liste des utilisateurs''' ''(en renseignant leur JID)'' qui seront '''notifiés''' lors de la création d'un nouveau compte sur le serveur. | |||
|- | |||
| welcome_message | |||
| {subject: Subject, body: Body} | |||
| Permet de définir un '''message de bienvenu''' lors de la première connexion de l'utilisateur au service de messagerie instantané. | |||
|} | |||
{{ Box Remarque | objet=Il existe d'autres paramètres de configuration. Pour une liste exhaustive visiter la [https://docs.ejabberd.im/admin/configuration/modules/?h=modules#mod_register documentation officiel]. }} | |||
* Pour activer le module avec les paramètres par défaut, éditer le fichier de configuration '''/etc/ejabberd/ejabberd.yml''' puis ajouter les éléments suivants ''(identifiés en <span style="color:red">rouge</span>)'' : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:red">mod_register: {}</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Filtrage IP des clients autorisés à s'inscrire ==== | |||
* Pour commencer, déclarons une '''ACL''' qui va contenir la '''liste des réseaux''' autorisés à effectuer cette action. Pour cela, éditer le fichier de configuration '''/etc/ejabberd/ejabberd.yml''', puis dans la section '''ACL''', déclarer une nouvelle ACL nommée '''register_networks''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
acl: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">register_networks: | |||
ip: | |||
- 109.190.125.2/32 | |||
- 51.38.231.60/32 | |||
- 2001:41d0:305:2100::9789</span> | |||
* Il faut définir le '''type d'accès''' octroyé à cette '''ACL'''. Dans notre cas, il s'agit d'une '''condition d'autorisation''' ''(allow)''. Dans la section '''access_rules''', déclarer une nouvelle règle d'accès nommée '''register_access''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
access_rules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">register_access: | |||
allow: register_networks</span> | |||
* Enfin, dans la section '''module''', ajouter le paramètre '''ip_access''' pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_register: | |||
<span style="color:blue">ip_access: register_access</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Filtrage IP des clients autorisés à se désinscrire ==== | |||
* Pour commencer, déclarons une '''ACL''' qui va contenir la '''liste des réseaux''' autorisés à effectuer cette action. Pour cela, éditer le fichier de configuration '''/etc/ejabberd/ejabberd.yml''', puis dans la section '''ACL''', déclarer une nouvelle ACL nommée '''register_remove_networks''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
acl: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">register_remove_networks: | |||
ip: | |||
- 109.190.125.2/32 | |||
- 51.38.231.60/32 | |||
- 2001:41d0:305:2100::9789</span> | |||
* Il faut définir le '''type d'accès''' octroyé à cette '''ACL'''. Dans notre cas, il s'agit d'une '''condition d'autorisation''' ''(allow)''. Dans la section '''access_rules''', déclarer une nouvelle règle d'accès nommée '''register_remove_access''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
access_rules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">register_remove_access: | |||
allow: register_remove_networks</span> | |||
* Enfin, dans la section '''module''', ajouter le paramètre '''access_remove''' pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_register: | |||
ip_access: register_access | |||
<span style="color:blue">access_remove: register_remove_access</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Filtrage par expression régulière du nom d'utilisateur ==== | |||
* Pour commencer, déclarons une '''ACL''' qui va contenir l''''expression régulière''' permettant d'identifier un nom d'utilisateur valide. Pour cela, éditer le fichier de configuration '''/etc/ejabberd/ejabberd.yml''', puis dans la section '''ACL''', déclarer une nouvelle ACL nommée '''rgxp_synthax_login''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
acl: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">rgxp_synthax_login: | |||
user_regexp: | |||
- "^[a-zA-Z]+[a-zA-Z0-9_-]+[a-zA-Z0-9]+$": geocoucou.im</span> | |||
* Il faut définir le '''type d'accès''' octroyé à cette '''ACL'''. Dans notre cas, il s'agit d'une '''condition d'autorisation''' ''(allow)''. Dans la section '''access_rules''', déclarer une nouvelle règle d'accès nommée '''rgxp_filtre_login''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
access_rules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
rgxp_filtre_login: | |||
<span style="color:blue">allow: rgxp_synthax_login</span> | |||
* Enfin, dans la section '''module''', ajouter le paramètre '''access_remove''' pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_register: | |||
ip_access: register_access | |||
access_remove: register_remove_access | |||
<span style="color:blue">access: rgxp_filtre_login</span> | |||
==== Filtrage par mots clés du nom d'utilisateur ==== | |||
{{ Box Remarque | objet=Cette règle s'appuie la règle '''rgxp_filtre_login''' décrite dans la section [[:https://www.ncad.wiki/index.php?title=Ejabberd#Filtrage_par_expression_r%C3%A9guli%C3%A8re_du_nom_d'utilisateur|Filtrage par expression régulière]] }} | |||
* Pour commencer, déclarons une '''ACL''' qui va contenir la '''liste des mots à interdire''' dans le nom d'utilisateur. Pour cela, éditer le fichier de configuration '''/etc/ejabberd/ejabberd.yml''', puis dans la section '''ACL''', déclarer une nouvelle ACL nommée '''rgxp_termes_techniques''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
acl: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">rgxp_termes_techniques: | |||
user_regexp: | |||
- "(abuse|tech|admin|staff|contact|webmaster|mail|dns|xmpp)": geocoucou.im</span> | |||
* Il faut définir le '''type d'accès''' octroyé à cette '''ACL'''. Dans notre cas, il s'agit d'une '''condition d'interdiction''' ''(deny)'' qui viendra compléter la règles d'accès déjà créée à l'étape précédente. Dans la section '''access_rules''', rechercher la règle d'accès nommée '''rgxp_filtre_login''' puis y ajouter les éléments suivants ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
access_rules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
rgxp_filtre_login: | |||
<span style="color:blue">deny: rgxp_termes_techniques</span> | |||
allow: rgxp_synthax_login | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Notification pour les nouvelles inscriptions ==== | |||
* Lorsqu'un '''nouvel utilisateur''' créé un nouveau compte sur le serveur '''Ejabberd''', il est possible de notifier un utilisateur. Pour définir une notification, éditer le fichier de configuration '''/etc/ejabberd/ejabberd.yml''', puis dans la section '''modules''' / '''mod_register''' ajouter / adapter les éléments suivants ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_register: | |||
ip_access: register_access | |||
access_remove: register_remove_access | |||
access: rgxp_filtre_login | |||
<span style="color:blue">registration_watchers: | |||
- cach3ln@geocoucou.im</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Message de bienvenue aux nouveaux inscrits ==== | |||
* Le '''message de bienvenue''' est envoyé lors de la première connexion de l'utilisateur au '''service XMPP'''. Pour en définir un, éditer le fichier de configuration '''/etc/ejabberd/ejabberd.yml''', puis dans la section '''modules''' / '''mod_register''' ajouter / adapter les éléments suivants ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_register: | |||
ip_access: register_access | |||
access_remove: register_remove_access | |||
access: rgxp_filtre_login | |||
registration_watchers: | |||
- cach3ln@geocoucou.im | |||
<span style="color:blue">welcome_message: | |||
subject: "Bienvenue !" | |||
body: |- | |||
Bienvenue sur le serveur XMPP Geocoucou ChatMail, | |||
En cas de problèmes ou de difficultés rendez-vous sur le Salon de Discussion support@conference.geocoucou.im. | |||
Un abus, un comportement suspect ? Signalez-le à abuse@geocoucou.eu ! | |||
Cordialement. | |||
L'équipe support Geocoucou ChatMail.</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
=== Configuration du module CHAT MULTI-UTILISATEURS ''(mod_muc)'' === | |||
Ce module permet aux utilisateurs de bénéficier des fonctions de discussion de groupe. L'implémentation de cette fonction est décrite dans la norme [https://xmpp.org/extensions/xep-0045.html XEP-0045]. | |||
==== Activation du module ==== | |||
{| class="wikitable" style="margin:auto" | |||
|+ Paramètres du module mod_muc | |||
|- | |||
! Paramètre | |||
! Type | |||
! Description | |||
|- | |||
| access | |||
| AccessName | |||
| Permet de définir qui est autorisé à '''accéder''' au service de salons de discussion. Par défaut, '''tout le monde''' est autorisé à utiliser ce service. | |||
|- | |||
| access_admin | |||
| AccessName | |||
| Permet de définir qui est autorisé à '''administrer''' les salons de discussion. Par défaut, ce paramètre est définit à '''none'''. Seul le créateur du salon de discussion dispose des pouvoirs d'administration. | |||
|- | |||
| access_create | |||
| AccessName | |||
| Permet de définir qui est autorisé à '''créer''' des salons de discussion. Par défaut, ce paramètre est définit à '''all'''. Tout le monde peut créer de nouveaux salons de discussion. | |||
|- | |||
| access_mam | |||
| AccessName | |||
| Permet de définir qui est autorisé à '''gérer les paramètres d'archivage''' des salons de discussion. Par défaut, ce paramètre est définit à '''all'''. Tout le monde peut modifier les paramètres d'archivage des salons de discussion. | |||
|- | |||
| access_persistent | |||
| AccessName | |||
| Permet de définir qui est autorisé à '''gérer le caractère persistant''' d'un salon de discussion. Par défaut, ce paramètre est définit à '''all'''. Tout le monde peut modifier le paramètre de persistance des salons de discussion. | |||
|- | |||
| default_room_options | |||
| Options | |||
| Définit les paramètres par défaut des salons de discussion. Le créateur du salon peut modifier ces paramètres à tout moment à l'aide de son client de messagerie si il est compatible avec les fonctions MUC. | |||
|- | |||
| max_room_id | |||
| Nombre | |||
| Permet de définir une '''limite''' sur le '''nombre de caractères''' composant l'ID du salon de discussion ''(chaîne se trouvant avant le @ dans l'adresse JID du salon)''. | |||
|- | |||
| max_user_conferences | |||
| Nombre | |||
| Permet de définir une '''limite''' sur le '''nombre maximum''' de salons auxquels les membres peuvent '''participer'''. | |||
|- | |||
| max_users | |||
| Nombre | |||
| Permet de définir un '''nombre maximum''' de participants pour chacun des salons de discussion. | |||
|- | |||
| min_message_interval | |||
| Nombre | |||
| Permet de définir une '''temporisation''' entre deux messages d'un même participant. | |||
|} | |||
* Pour activer le module avec les paramètres par défaut, éditer le fichier de configuration '''/etc/ejabberd/ejabberd.yml''' puis ajouter /décommenter les éléments suivants ''(identifiés en <span style="color:red">rouge</span>)'' : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:red">mod_muc: | |||
access: | |||
- allow | |||
access_admin: | |||
- allow: admin | |||
access_create: muc_create | |||
access_persistent: muc_create</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Définir les autorisations d'accès à ce service ==== | |||
* Il faut définir le '''type d'accès''' octroyé à cette '''ACL'''. Dans notre cas, il s'agit d'une '''condition d'autorisation''' ''(allow)''. Dans la section '''access_rules''', déclarer une nouvelle règle d'accès nommée '''muc_access''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
access_rule: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:green">muc_access: | |||
allow: all</span> | |||
* Dans la section '''module''', rechercher le paramètre '''access''' puis remplacer les éléments identifiés en <span style="red">rouge</span> : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
<span style="color:red">access: | |||
- allow</span> | |||
access_admin: | |||
- allow: admin | |||
access_create: muc_create | |||
access_persistent: muc_create | |||
* Par : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
<span style="color:green">access: muc_access</span> | |||
access_admin: | |||
- allow: admin | |||
access_create: muc_create | |||
access_persistent: muc_create | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Définir les autorisations d'administration ==== | |||
* Il faut définir le '''type d'accès''' octroyé à cette '''ACL'''. Dans notre cas, il s'agit d'une '''condition d'autorisation''' ''(allow)''. Dans la section '''access_rules''', déclarer une nouvelle règle d'accès nommée '''muc_access_admin''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
access_rule: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:green">muc_access_admin: | |||
allow: admin</span> | |||
* Dans la section '''module''', rechercher le paramètre '''access''' puis remplacer les éléments identifiés en <span style="red">rouge</span> : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
access: muc_access | |||
<span style="color:red">access_admin: | |||
- allow: admin</span> | |||
access_create: muc_create | |||
access_persistent: muc_create | |||
* Par : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
access: muc_access | |||
<span style="color:green">access_admin: muc_access_admin</span> | |||
access_create: muc_create | |||
access_persistent: muc_create | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Définir les utilisateurs autorisés à créer de nouveaux salons ==== | |||
* Dans la section '''module''', l'ACL '''muc_create''' est associée au paramètre '''access_create''' ''(identifiés en <span style="color:blue">bleu</span>)'' : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
access: muc_access | |||
access_admin: muc_access_admin | |||
<span style="color:blue">access_create: muc_create</span> | |||
access_persistent: muc_create | |||
* La modification des droits d'accès s'effectue en adaptant la valeur de l'ACL nommée '''muc_create'''. Dans ce cas de configuration, seuls les utilisateurs locaux peuvent créer de nouveaux salons de discussion sur le serveur : | |||
access_rule: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">muc_create: | |||
allow: local</span> | |||
==== Permettre aux utilisateurs de rendre un salon persistant ==== | |||
* Il faut définir le '''type d'accès''' octroyé à cette '''ACL'''. Dans notre cas, il s'agit d'une '''condition d'autorisation''' ''(allow)''. Dans la section '''access_rules''', déclarer une nouvelle règle d'accès nommée '''muc_access_admin''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
access_rule: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">muc_persistent: | |||
allow: admin</span> | |||
* Dans la section '''module''', rechercher le paramètre '''access''' puis remplacer les éléments identifiés en <span style="red">rouge</span> : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
access: muc_access | |||
access_admin: muc_access_admin | |||
access_create: muc_create | |||
<span style="color:red">access_persistent: muc_access</span> | |||
* Par : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
access: muc_access | |||
access_admin: muc_access_admin | |||
access_create: muc_create | |||
<span style="color:green">access_persistent: muc_persistent</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Droits d'accès aux paramètres d'archivage ==== | |||
* Il faut définir le '''type d'accès''' octroyé à cette '''ACL'''. Dans notre cas, il s'agit d'une '''condition d'autorisation''' ''(allow)''. Dans la section '''access_rules''', déclarer une nouvelle règle d'accès nommée '''muc_mam''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
access_rule: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">muc_mam: | |||
allow: all</span> | |||
* Ensuite, dans la section '''modules''' / '''mod_muc''', ajouter le paramètre '''access_mam''' pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
access: muc_access | |||
access_admin: muc_access_admin | |||
access_create: muc_create | |||
access_persistent: muc_persistent | |||
<span style="color:green">access_mam: muc_mam</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Droits d'accès aux paramètres d'archivage ==== | |||
* Il faut définir le '''type d'accès''' octroyé à cette '''ACL'''. Dans notre cas, il s'agit d'une '''condition d'autorisation''' ''(allow)''. Dans la section '''access_rules''', déclarer une nouvelle règle d'accès nommée '''muc_mam''' ''(identifiés en <span style="color:blue">bleu</span>)'': | |||
access_rule: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">muc_mam: | |||
allow: all</span> | |||
* Ensuite, dans la section '''modules''' / '''mod_muc''', ajouter le paramètre '''access_mam''' pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
access: muc_access | |||
access_admin: muc_access_admin | |||
access_create: muc_create | |||
access_persistent: muc_persistent | |||
<span style="color:green">access_mam: muc_mam</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Filtrage par mots clés du nom du salon ==== | |||
* Dans notre exemple, nous souhaitons contrôler la '''syntaxe''' des adresses des salons de discussion ''(ce qui précède le @)''. Ce contrôle s'effectue via les '''expressions régulières'''. Dans notre cas nous souhaitons : | |||
** Autoriser uniquement les '''caractères alphanumériques'''. | |||
** Autoriser les caractères '''_''' et/ou '''-''' en milieu de chaîne. | |||
* Pour cela, dans la section '''modules''' / '''mod_muc''', ajouter le paramètre '''regexp_room_id''' avec pour valeur l''''expression régulière''' suivante : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
<span style="color:green">regexp_room_id: "^[a-zA-Z]+[a-zA-Z0-9_-]*[a-zA-Z0-9]$"</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
{{ Box Remarque | objet=Il est possible de vérifier la syntaxe et le bon fonctionnement des '''expressions régulières''' grâce à l'outil en ligne https://regex101.com/. }} | |||
==== Paramètres par défaut des nouveaux salons ==== | |||
* Lors de la création d''''un nouveau salon de discussion''', un certain nombre de paramètres sont définit par défaut. Il est possible de modifier ce comportement depuis le fichier de configuration du serveur '''Ejabberd'''. Voici une liste non exhaustive des paramètres les plus courant : | |||
{| class="wikitable" style="margin:auto" | |||
|+ | |||
|- | |||
! Paramètre | |||
! Type | |||
! Description | |||
|- | |||
| allow_change_subj | |||
| true / false | |||
| Autoriser les participants du salon à '''modifier le sujet de discussion'''. Par défaut, cette valeur est définie à '''true'''. | |||
|- | |||
| allow_private_messages_from_visitors | |||
| anyone / moderators / nobody | |||
| Autoriser les visiteurs à '''envoyer un message''' aux participants du salon. Par défaut, cette valeur est définie à '''anyone'''. | |||
|- | |||
| allow_query_users | |||
| true / false | |||
| Les participants peuvent s'envoyer des '''requêtes'''. Par défaut, cette valeur est définie à '''true'''. | |||
|- | |||
| allow_subscription | |||
| true / false | |||
| Autorise les utilisateurs à souscrire aux '''notifications sur évènements''' pour le salon de discussion souhaitée. Par défaut, cette valeur est définie à '''false'''. | |||
|- | |||
| allow_user_invites | |||
| true / false | |||
| Autorise les participants du salon à '''envoyer des invitations'''. Par défaut, cette valeur est définie à '''false'''. | |||
|- | |||
| allow_visitor_nickchange | |||
| true / false | |||
| Autorise les visiteurs à modifier leur '''pseudonyme'''. Par défaut, cette valeur est définie à '''true'''. | |||
|- | |||
| allow_visitor_status | |||
| true / false | |||
| Autorise les visiteurs à envoyer un '''message de statut''' lors de la mise à jour de leur disponibilité. Par défaut, cette valeur est définie à '''true'''. | |||
|- | |||
| anonymous | |||
| true / false | |||
| Le salon de discussion est '''anonyme'''. Les participants ne peuvent pas voir l''''adresse réel XMPP''' ''(JID)'' des autres participants. Seuls les modérateurs peuvent voir cette information. Par défaut, cette valeur est définie à '''true'''. | |||
|- | |||
| lang | |||
| code langue RFC 5646 | |||
| Indique la '''langue d'usage''' pour le salon de discussion. Par défaut, cette valeur n'est pas définie. | |||
|- | |||
| logging | |||
| true / false | |||
| Les messages publiques sont '''journalisées''' suivant les paramètres du module '''mod_muc_log'''. Par défaut, cette valeur est définie à '''false'''. | |||
|- | |||
| mam | |||
| true / false | |||
| Activer l''''archivage des messages'''. Le module '''mod_mam''' doit être actif. Par défaut, cette valeur est définie à '''false'''. | |||
|- | |||
| max_users | |||
| Nombre | |||
| Nombre maximum de '''participants''' dans le salon de discussion. Par défaut, cette valeur est définie à '''200'''. | |||
|- | |||
| members_by_default | |||
| true / false | |||
| Les personnes entrants dans le salon sont par défaut des '''participants''' et peuvent donc s'exprimer sans modération. Par défaut, cette valeur est définie à '''true'''. | |||
|- | |||
| members_only | |||
| true / false | |||
| Seuls les membres du salon peuvent entrer. Par défaut, cette valeur est définie à '''false'''. | |||
|- | |||
| moderated | |||
| true / false | |||
| Seuls les participants disposant de la '''parole''' ''(voice)'' peuvent envoyer des '''messages publiques'''. Par défaut, cette valeur est définie à '''true'''. | |||
|- | |||
| persistent | |||
| true / false | |||
| Le salon de discussion '''continu d'exister''' même s'il n'y a plus aucun participant. Par défaut, cette valeur est définie à '''false'''. | |||
|- | |||
| presence_broadcast | |||
| moderator / participant / visitor | |||
| Liste des rôles pour lesquels la présence des participants est diffusée dans le salon. | |||
|- | |||
| public | |||
| true / false | |||
| Le salon de discussion peut être découvert dans la '''liste des services''' et des salons de discussions hébergés sur le domaine. Par défaut, cette valeur est définie à '''true'''. | |||
|- | |||
| public_list | |||
| true / false | |||
| La '''liste des participants''' est publique, sans avoir besoin d'entrer dans le salon de discussion. Par défaut, cette valeur est définie à '''true'''. | |||
|} | |||
* Dans la section '''modules''' / '''mod_muc''', ajouter le paramètre '''default_room_options''' avec la liste des '''sous-paramètres''' définissant les '''options par défaut''' des nouveaux salons de discussion : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
access: muc_access | |||
access_admin: muc_access_admin | |||
access_create: muc_create | |||
access_persistent: muc_persistent | |||
access_mam: muc_mam | |||
<span style="color:blue">default_room_options: | |||
mam: true | |||
allow_change_subj: true | |||
allow_private_messages: true | |||
allow_private_messages_from_visitors: anyone | |||
allow_query_users: true | |||
allow_subscription: false | |||
allow_user_invites: false | |||
allow_visitor_nickchange: false | |||
allow_visitor_status: true | |||
anonymous: false | |||
lang: fr | |||
logging: false | |||
members_by_default: true | |||
members_only: false | |||
moderated: true | |||
persistent: false | |||
presence_broadcast: [moderator,participant,visitor] | |||
public: true | |||
public_list: true</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Nombre de caractères maximum composant l'ID d'un salon ==== | |||
* Pour définir une '''limite''' sur le '''nombre de caractères''' composant l''''ID''' du salon de discussion, renseigner la paramètre '''max_room_id''' avec la valeur souhaitée dans la section du module '''mod_muc''' : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">max_room_id: 24</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Nombre de salons qu'un utilisateur peut rejoindre ==== | |||
* Pour limiter le '''nombre de salons maximum''' auxquels les utilisateurs peuvent participer, renseigner la paramètre '''max_user_conferences''' avec la valeur souhaitée dans la section du module '''mod_muc''' : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">max_user_conferences: 100</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Nombre maximum de participants par salon de discussion ==== | |||
* Pour limiter le '''nombre maximum de participants''' pour chacun des '''salons de discussion''', renseigner la paramètre '''max_users''' avec la valeur souhaitée dans la section du module '''mod_muc''' : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">max_users: 200</span> | |||
{{ Box Remarque | objet=Ce paramètre peut également être appliqué de manière individuel aux salons de discussion. Cependant, le paramètre individuel ne pourra pas se substituer au paramètre globale si ce dernier est plus restrictif.}} | |||
==== Définir une temporisation entre deux messages ==== | |||
* Pour définir une '''temporisation''' entre deux messages d'un même participant, renseigner la paramètre '''min_message_interval''' avec la valeur souhaitée dans la section du module '''mod_muc''' : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">min_message_interval: 0.4</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
{{ Box Remarque | objet=Cette valeur est exprimée en seconde et accepte les nombres décimaux.}} | |||
==== Nombre de messages à afficher lors de la connexion ==== | |||
* Lorsqu'un participant accède au '''salon de discussion''', il est possible d'afficher les '''''n'' derniers messages''' envoyés dans le salon. Pour définir ce nombre '''''n''''', renseigner le paramètre '''history_size''' avec la valeur souhaitée dans la section du module '''mod_muc''' : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">history_size: 50</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== Définir le nom du service à afficher lors de la découverte ==== | |||
* Permet de personnaliser le nom du service s'affichant lors de la découverte par les clients de messagerie XMPP. Pour cela, renseigner le paramètre '''name''' avec le nom souhaité dans la section du module '''mod_muc''' : | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:blue">name: "Salons de discussion"</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
==== ... ==== | |||
modules: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
mod_muc: | |||
max_rooms_discoitems: 100 | |||
max_users_admin_threshold: 5 | |||
max_users_presence: 1000 | |||
min_presence_interval: 4 | |||
preload_rooms: true | |||
room_shaper: none | |||
user_message_shaper: none | |||
user_presence_shaper: none | |||
== Définir un hôte pour les connexions invitées == | |||
'''Ejabberd''' peut être paramétré pour permettre un accès au service '''sans inscription'''. Dans ce cas, une '''adresse JID''' est générée automatiquement pour l'utilisateur. Une fois déconnectée, cette adresse temporaire est '''détruite'''. On parlera ici d'une '''authentification anonyme''' sur le serveur. | |||
Pour la mise en place de ce mot de connexion, le paramétrage suivant sera ici mis en place et détaillé : | |||
* Création de l'hôte '''public.geocoucou.im''' dans le '''DNS'''. | |||
* Déclaration du nouvel '''hôte virtuel''' dédié aux connexions anonymes dans '''Ejabberd'''. | |||
* Paramétrage des '''droits des utilisateurs''' hébergés par ce nouvel hôte. | |||
=== Paramètres DNS === | |||
* Dans la '''zone DNS''' du nom de domaine '''geocoucou.im''', créer un nouvel enregistrement '''CNAME''' avec les caractéristiques suivantes : | |||
{| class="wikitable" style="margin:auto" | |||
|+ Enregistrement DNS | |||
|- | |||
! Sous-domaine | |||
! Type | |||
! Priorité | |||
! Poids | |||
! Port | |||
! Cible | |||
! Rôle | |||
|- | |||
| public | |||
| CNAME | |||
| — | |||
| — | |||
| — | |||
| xmpp.geocoucou.im | |||
| Spécifique pour les connexions '''invités''' / '''anonymes''' au service. | |||
|} | |||
* Vérifions le pointage du '''champs DNS''' de type '''CNAME''' pour le sous-domaine '''public.geocoucou.im'''. Ce dernier doit pointer sur l'hône '''xmpp.geocoucou.im''' : | |||
{{ Box Console | objet=dig cname public.geocoucou.im }} | |||
; <<>> DiG 9.16.50-Debian <<>> cname public.geocoucou.im | |||
;; global options: +cmd | |||
;; Got answer: | |||
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51235 | |||
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | |||
;; OPT PSEUDOSECTION: | |||
; EDNS: version: 0, flags:; udp: 1232 | |||
;; QUESTION SECTION: | |||
;public.geocoucou.im. IN CNAME | |||
;; ANSWER SECTION: | |||
<span style="color:green">public.geocoucou.im. 3600 IN CNAME xmpp.geocoucou.im.</span> | |||
;; Query time: 68 msec | |||
;; SERVER: 213.186.33.99#53(213.186.33.99) | |||
;; WHEN: Mon Aug 12 04:46:07 UTC 2024 | |||
;; MSG SIZE rcvd: 67 | |||
=== Configuration de l'hôte === | |||
==== Matrice des droits ==== | |||
Ici, nous faisons le choix de limiter les fonctions des utilisateurs au strict minimum. S'agissant d'une connexion '''anonyme''' et '''temporaire''', il n'est pas utile : | |||
* De permettre l'accès aux fonctions de gestion des '''contacts XMPP'''. | |||
* D'offrir la possibilité de téléverser des '''pièces jointes'''. | |||
* De permettre l''''accès''' ou la '''création''' de '''salons de discussion''' : cette fonctionnalité sera simplement désactivée pour cet hôte virtuel. | |||
Pour résumer, voici un tableau listant les paramètres qui seront défini pour le nouvel hôte : | |||
{| class="wikitable" style="margin:auto" | |||
|+ | |||
|- | |||
! Fonctions | |||
! Module | |||
! Paramètre modifiable par l'utilisateur | |||
! Niveau d'accès | |||
|- | |||
| Téléverser des pièces jointes | |||
| mod_http_upload | |||
| Non | |||
| <span style="color:red">{{#fas:xmark}} Interdit</span> | |||
|- | |||
| Voir la dernière date de connexion des membres | |||
| mod_last | |||
| Non | |||
| <span style="color:green">{{#fas:check}} Autorisé</span> | |||
|- | |||
| Archiver les messages | |||
| mod_mam | |||
| Non | |||
| <span style="color:green">{{#fas:check}} Autorisé</span> | |||
|- | |||
| Accéder aux salons de discussion | |||
| mod_muc / access | |||
| Non | |||
| <span style="color:red">{{#fas:xmark}} Interdit</span> | |||
|- | |||
| Créer de nouveaux salons de discussion | |||
| mod_muc / access_create | |||
| Non | |||
| <span style="color:red">{{#fas:xmark}} Interdit</span> | |||
|- | |||
| Créer un compte utilisateur | |||
| mod_register | |||
| Non | |||
| <span style="color:green">{{#fas:check}} Autorisé</span> | |||
|- | |||
| Gérer la liste des contacts | |||
| mod_roster | |||
| Non | |||
| <span style="color:red">{{#fas:xmark}} Interdit</span> | |||
|- | |||
| Gérer la liste des contacts partagés | |||
| mod_shared_roster | |||
| Non | |||
| <span style="color:green">{{#fas:check}} Autorisé</span> | |||
|} | |||
==== Déclaration de l'hôte ==== | |||
* Editer le fichier de configuration '''/etc/ejabberd/ejabberd.yml''' puis après la ligne : | |||
hosts: | |||
- geocoucou.im | |||
* Ajouter les éléments suivants ''(repérés en <span style="color:green">vert</span>)'' : | |||
hosts: | |||
- geocoucou.im | |||
<span style="color:green">- public.geocoucou.im | |||
allow_multiple_connections: true | |||
host_config: | |||
public.geocoucou.im: | |||
auth_use_cache: false | |||
auth_method: | |||
- anonymous | |||
anonymous_protocol: both</span> | |||
==== Configuration de l'hôte ==== | |||
* Depuis la section '''access_rule''', <span style="color:green">ajouter</span> les règles '''muc_public''' et '''muc_create_public''' : | |||
access_rule: | |||
<span style="color:grey">'''''(...)'''''</span> | |||
<span style="color:green">muc_public: | |||
deny: all | |||
muc_create_public: | |||
deny: all</span> | |||
* À la fin du fichier de configuration, ajouter les éléments de configuration de l'hôte : | |||
append_host_config: | |||
public.geocoucou.im: | |||
modules: | |||
mod_adhoc: {} | |||
mod_client_state: {} | |||
mod_configure: {} | |||
mod_disco: {} | |||
mod_http_upload: | |||
access: | |||
- deny | |||
mod_last: {} | |||
mod_mam: | |||
access_preferences: | |||
- deny | |||
db_type: sql | |||
default: roster | |||
mod_muc: | |||
access: muc_public | |||
access_create: muc_create_public | |||
mod_proxy65: {} | |||
mod_pubsub: | |||
access_createnode: none | |||
mod_register: {} | |||
mod_register_web: {} | |||
mod_roster: | |||
access: deny | |||
versioning: true | |||
mod_shared_roster: {} | |||
mod_stun_disco: {} | |||
mod_time: {} | |||
mod_version: {} | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
== 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'[https://docs.ejabberd.im/developer/ejabberd-api/admin-api/ administration du service] et les commandes liées à l'[https://docs.ejabberd.im/admin/ejabberdctl/muc-admin/ 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 <span style="color:red">rouge</span> : | |||
- | |||
port: 5443 | |||
ip: "::" | |||
module: ejabberd_http | |||
tls: true | |||
protocol_options: 'TLS_OPTIONS' | |||
request_handlers: | |||
<span style="color:red">/api: mod_http_api</span> | |||
/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 : {{Commande|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 : | |||
[[Image: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: | |||
<span style="color:red">- status | |||
- connected_users_number</span> | |||
* Par les éléments suivants : | |||
"public commands": | |||
who: | |||
ip: | |||
- 127.0.0.1/8 | |||
<span style="color:green">- 51.38.231.60/32 | |||
- 2001:41d0:305:2100:9789/56</span> | |||
what: <span style="color:green">"*"</span> | |||
* Redémarrer le serveur '''Ejabberd''' pour la prise en compte des nouveaux paramètres : {{Commande|service ejabberd restart}} | |||
=== Paramètres DNS === | |||
* Dans la '''zone DNS''' du nom de domaine '''geocoucou.im''', créer un nouvel enregistrement '''CNAME''' avec les caractéristiques suivantes : | |||
{| class="wikitable" style="margin:auto" | |||
|+ Enregistrement DNS | |||
|- | |||
! Sous-domaine | |||
! Type | |||
! Priorité | |||
! Poids | |||
! Port | |||
! Cible | |||
! Rôle | |||
|- | |||
| api | |||
| CNAME | |||
| — | |||
| — | |||
| — | |||
| xmpp.geocoucou.im | |||
| Spécifique pour les échanges nécessitant une connexion à l''''API'''. <span style="color:orange">{{#fas:exclamation-triangle}}</span> Configuration en reverse proxy. | |||
|} | |||
* Vérifions le pointage du '''champs DNS''' de type '''CNAME''' pour le sous-domaine '''api.geocoucou.im'''. Ce dernier doit pointer sur le web proxy reverse '''web.cachelou.net''' : | |||
{{ Box Console | objet=dig cname api.geocoucou.im }} | |||
; <<>> DiG 9.16.50-Debian <<>> cname api.geocoucou.im | |||
;; global options: +cmd | |||
;; Got answer: | |||
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54871 | |||
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | |||
;; OPT PSEUDOSECTION: | |||
; EDNS: version: 0, flags:; udp: 1232 | |||
;; QUESTION SECTION: | |||
;api.geocoucou.im. IN CNAME | |||
;; ANSWER SECTION: | |||
<span style="color:green">api.geocoucou.im. 3600 IN CNAME web.cachelou.net.</span> | |||
;; Query time: 28 msec | |||
;; SERVER: 213.186.33.99#53(213.186.33.99) | |||
;; WHEN: Sat Aug 03 13:48:44 UTC 2024 | |||
;; MSG SIZE rcvd: 75 | |||
=== Création du VHost proxy reverse === | |||
{{ Box Information | objet=Les applications web utilisant une connexion '''API''' pointeront plutôt sur le '''serveur web proxy reverse''' 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 '''proxy reverse''' suivante ''(adapter les éléments en <span style="color:red">rouge</span>)'' : | |||
ProxyRequests Off | |||
RewriteEngine on | |||
SSLProxyEngine on | |||
SSLProxyVerify none | |||
SSLProxyCheckPeerCN off | |||
SSLProxyCheckPeerName off | |||
SSLProxyCheckPeerExpire off | |||
<VirtualHost *:80> | |||
ServerName <span style="color:red">api.geocoucou.im</span> | |||
ErrorLog ${APACHE_LOG_DIR}/<span style="color:red">rev-api.geocoucou.im_error.log</span> | |||
CustomLog ${APACHE_LOG_DIR}/<span style="color:red">rev-api.geocoucou.im_access.log</span> combined | |||
ProxyPreserveHost On | |||
ProxyVia Full | |||
RequestHeader edit Transfer-Encoding Chunked chunked early | |||
RequestHeader unset Accept-Encoding | |||
CheckSpelling On | |||
TimeOut 1800 | |||
ProxyPass / https://<span style="color:red">xmpp.geocoucou.im</span>:5443/ | |||
ProxyPassReverse / https://<span style="color:red">xmpp.geocoucou.im</span>:5443/ | |||
</VirtualHost> | |||
* Pour appliquer la nouvelle configuration, '''activer''' le nouveau VHost puis '''redémarrer''' le serveur '''Apache2''' : | |||
{{ Box Console | objet=a2ensite upload.geocoucou.im.conf<br />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 : | |||
[[Image: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 : | |||
<span style="color:purple">2001:41d0:305:2100::9789</span> - - [03/Aug/2024:11:36:49 +0000] "<span style="color:orange">POST</span> <span style="color:blue">/api/check_password</span> HTTP/1.1" <span style="color:green">200</span> 3072 "-" "-" | |||
* | * L'<span style="color:purple">'''adresse IP'''</span> 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 <span style="color:orange">'''POST'''</span> à l'url <span style="color:blue">'''/api/check_password</span>. Le serveur retourne un code d'état <span style="color:green">'''200'''</span> 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:<span style="color:purple">51.38.231.60</span>]:51652 -> [::ffff:<span style="color:pink">152.228.135.223</span>]:'''5443''' | |||
2024-08-03 11:36:53.025377+00:00 [info] <0.2740.0>@mod_http_api:log/3:510 API call <span style="color:red">check_password</span> [{<span style="color:cyan"><<"user">>,<<"cach3ln">></span>}, | |||
{<span style="color:cyan"><<"host">>,<<"geocoucou.im">></span>}, | |||
{<span style="color:cyan"><<"password">>,<<"***">></span>}] 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'<span style="color:purple">adresse IP du serveur web proxy</span> et celle du <span style="color:purple">serveur Ejabberd</span>. 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 <span style="color:red">'''check_passord'''</span>, on retrouve bien les <span style="color:cyan">paramètres d'authentification</span> soumis via la commande '''POST''' par le <span style="color:purple">'''serveur web proxy'''</span>. | |||
== | == 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ètres DNS === | |||
Dans la '''zone DNS''' du nom de domaine '''geocoucou.im''', créer un nouvel enregistrement '''CNAME''' avec les caractéristiques suivantes : | |||
{| class="wikitable" style="margin:auto" | |||
|+ Enregistrement DNS | |||
|- | |||
! Sous-domaine | |||
! Type | |||
! Priorité | |||
! Poids | |||
! Port | |||
! Cible | |||
! Rôle | |||
|- | |||
| webchat | |||
| CNAME | |||
| — | |||
| — | |||
| — | |||
| web.cachelou.net | |||
| sous-domaine pointant vers le site hébergeant le client web de messagerie instantannée XMPP-CLIENT. | |||
|} | |||
* Vérifions le pointage du '''champs DNS''' de type '''CNAME''' pour le sous-domaine '''webchat.geocoucou.im'''. Ce dernier doit pointer sur le serveur web '''web.cachelou.net''' : | |||
{{ Box Console | objet=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: | |||
<span style="color:green">webchat.geocoucou.im. 3600 IN CNAME web.cachelou.net.</span> | |||
;; 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 | |||
=== Création du VHost proxy reverse === | |||
{{ Box Information | objet=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 proxy reverse suivante ''(adapter les éléments en <span style="color:red">rouge</span>)'' : | |||
ProxyRequests Off | |||
RewriteEngine on | |||
SSLProxyEngine on | |||
SSLProxyVerify none | |||
SSLProxyCheckPeerCN off | |||
SSLProxyCheckPeerName off | |||
SSLProxyCheckPeerExpire off | |||
<VirtualHost *:80> | |||
ServerName <span style="color:red">wss.geocoucou.im</span> | |||
ErrorLog ${APACHE_LOG_DIR}/<span style="color:red">rev-wss.geocoucou.im_error.log</span> | |||
CustomLog ${APACHE_LOG_DIR}/<span style="color:red">rev-wss.geocoucou.im_access.log</span> combined | |||
ProxyPreserveHost On | |||
ProxyVia Full | |||
RequestHeader edit Transfer-Encoding Chunked chunked early | |||
RequestHeader unset Accept-Encoding | |||
CheckSpelling On | |||
TimeOut 1800 | |||
ProxyPass / <span style="color:red">wss://xmpp.geocoucou.im</span>:5443/ | |||
ProxyPassReverse / <span style="color:red">wss://xmpp.geocoucou.im</span>:5443/ | |||
</VirtualHost> | |||
* Pour appliquer la nouvelle configuration, '''activer''' le nouveau VHost puis '''redémarrer''' le serveur '''Apache2''' : | |||
{{ Box Console | objet=a2ensite wss.geocoucou.im.conf<br />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 : | |||
[[Image:EJABBERD_PROXY_WSS_INDEX.png]] | |||
{{ Box Remarque | objet=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. }} | |||
=== Installation et configuration === | |||
{{ Box Information | objet=Pour de plus amples informations sur la mise en place de ce logiciel, veuillez-vous référer à l'article dédié [[:XMPP-WEB | Installer XMPP-WEB]]. }} | |||
== 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. | |||
{| class="wikitable" style="margin:auto" | |||
|+ Matrice de flux | |||
|- | |||
! Source !! Protocole(s) !! Port(s) !! Description | |||
|- | |||
| * || tcp || 22 || Accès '''SSH''', '''SFTP'''. | |||
|- | |||
| * || tcp || 1883 || Services de messagerie '''MQTT''' non sécurisée. | |||
|- | |||
| * || tcp || 8883 || Services de messagerie '''MQTT''' en '''TLS'''. | |||
|- | |||
| * || tcp/udp || 3478 || Services de découverte '''STUN/TURN'''. | |||
|- | |||
| * || tcp || 5349 || Services de découverte '''STUNS/TURNS'''. | |||
|- | |||
| * || tcp || 5280 || Accès '''Web Admin''' du serveur '''Ejabberd'''. | |||
|- | |||
| * || tcp || 5222 || Connexion des '''clients Jabber/XMPP''' non sécurisée ou '''STARTTLS'''. | |||
|- | |||
| * || tcp || 5223 || Connexion des '''clients Jabber/XMPP''' en '''TLS'''. | |||
|- | |||
| * || tcp || 5225 || Connexion des '''clients Jabber/XMPP''' en '''TLS''' derrière un '''reverse proxy'''. | |||
|- | |||
| * || tcp || 5269 || Connexions '''serveurs Jabber/XMPP''' entrantes. | |||
|- | |||
| proxy.cachelou.net || tcp || 5443 || Requêtes '''API''', '''BOSH''', '''WEBSOCKET''', '''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)''. | |||
{{ Box Console | objet=root@apache2:~# apt-get install iptables iptables-persistent -y }} | |||
* Ajout des règles '''iptables''' pour autoriser les flux '''SSH''', '''ICMP''' et '''Ejabberd''' : | |||
{{ Box Console | objet=<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p tcp --dport 22 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p tcp --dport 1883 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p tcp --dport 8883 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p udp --dport 3478 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p tcp --dport 3478 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p tcp --dport 5349 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p tcp --dport 5280 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p tcp --dport 5222 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p tcp --dport 5223 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p tcp --dport 5225 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p tcp --dport 5269 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -s proxy.cachelou.net -p tcp --dport 5443 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p udp -m multiport -s <@IP_SUPERVISION> --dports 161,162 -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -p icmp -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -i lo -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT<br /> | |||
<span style="color:grey">root@ejabberd:~#</span> iptables -P INPUT DROP }} | |||
* '''Sauvegarde''' de la configuration et '''application automatique''' à chaque redémarrage du système. | |||
{{ Box Console | objet=<span style="color:grey">root@ejabberd:~#</span> dpkg-reconfigure iptables-persistent }} | |||
[[Category:Messagerie instantanée]] |
Dernière version du 21 août 2024 à 13:52
|
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 :
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._tcp | SRV | 0 | 0 | 5222 | xmpp.geocoucou.im | Configuration pour les échanges entre les clients de messagerie instantanés et le serveur XMPP. |
_xmpp-server._tcp | SRV | 0 | 0 | 5269 | xmpp.geocoucou.im | Configuration pour les échanges entre les serveurs XMPP. |
_xmpps-client._tcp | SRV | 0 | 0 | 5223 | xmpp.geocoucou.im | Configuration pour les échanges entre les clients de messagerie instantanés et le serveur XMPP via un canal sécurisé TLS. |
_xmpps-server._tcp | SRV | 0 | 0 | 5270 | xmpp.geocoucou.im | Configuration pour les échanges entre les serveurs XMPP via un canal sécurisé TLS. |
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 / invités. |
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 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 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 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 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._tcp.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.geocoucou.im :
|
|
; <<>> DiG 9.16.50-Debian <<>> srv _xmpp-client._tcp.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48499
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;_xmpp-client._tcp.geocoucou.im. IN SRV
;; ANSWER SECTION:
_xmpp-client._tcp.geocoucou.im. 3600 IN SRV 0 5 5222 xmpp.geocoucou.im.
;; Query time: 80 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sat Aug 03 22:22:08 UTC 2024
;; MSG SIZE rcvd: 96
- Vérifions le pointage du champs DNS de type SRV pour le sous-domaine _xmpps-client._tcp.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.geocoucou.im :
|
|
; <<>> DiG 9.16.50-Debian <<>> srv _xmpps-client._tcp.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50852
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;_xmpps-client._tcp.geocoucou.im. IN SRV
;; ANSWER SECTION:
_xmpps-client._tcp.geocoucou.im. 3600 IN SRV 0 5 5223 xmpp.geocoucou.im.
;; Query time: 76 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sat Aug 03 22:34:43 UTC 2024
;; MSG SIZE rcvd: 97
- Vérifions le pointage du champs DNS de type SRV pour le sous-domaine _xmpp-server._tcp.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.geocoucou.im :
|
|
; <<>> DiG 9.16.50-Debian <<>> srv _xmpp-server._tcp.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10740
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;_xmpp-server._tcp.geocoucou.im. IN SRV
;; ANSWER SECTION:
_xmpp-server._tcp.geocoucou.im. 3600 IN SRV 0 5 5269 xmpp.geocoucou.im.
;; Query time: 80 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sat Aug 03 22:37:40 UTC 2024
;; MSG SIZE rcvd: 96
- Vérifions le pointage du champs DNS de type SRV pour le sous-domaine _xmpps-server._tcp.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.geocoucou.im :
|
|
; <<>> DiG 9.16.50-Debian <<>> srv _xmpps-server._tcp.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19399
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;_xmpps-server._tcp.geocoucou.im. IN SRV
;; ANSWER SECTION:
_xmpps-server._tcp.geocoucou.im. 3600 IN SRV 0 5 5270 xmpp.geocoucou.im.
;; Query time: 40 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sat Aug 03 22:36:34 UTC 2024
;; MSG SIZE rcvd: 97
- 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 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 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 serveur web proxy reverse web.cachelou.net :
|
|
; <<>> 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 serveur web proxy reverse web.cachelou.net :
|
|
; <<>> 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 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 serveur web web.cachelou.net :
|
|
; <<>> 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 :
|
|
- Installation du paquet erlang-p1-mysql pour l'exploitation d'une base de données SQL (MySQL, MariaDB) :
|
|
- Pour vérifier si le service fonctionne normalement :
|
|
- Création d'un premier compte utilisateur sur le serveur :
|
|
Base de données SQL
- Le script d'installation de la base de données se trouve à la racine /usr/share/ejabberd/sql. Importer le script dans la base de données dédiée nommée ejabberd :
|
|
- Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis après la ligne :
auth_password_format: scram
- Ajouter et adapter les lignes suivantes en fonction des paramètres de connexion de la base de données :
# Méthode d'authentification par défaut : SQL auth_method: sql # Méthode de stockage par défaut : SQL default_db: sql # Paramètres de connexion de la base de données Ejabberd 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
La configuration du serveur Ejabberd est enregistrée dans le fichier /etc/ejabberd/ejabberd.yml. Il s'agit d'un fichier écrit en language YAML (Yet Another Markup Language). En cas d'erreur de démarrage du service Ejabberd, après la modification du fichier de configuration, consulter le journal des erreurs disponible à l'emplacement /var/log/ejabberd/error.log.
|
Veuillez respecter les indentations pour les différents paramètres. Il ne s'agit pas seulement d'un style de mise en forme. En cas de non respect, le service Ejabberd retournera des erreurs et ne démarrera pas. |
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
- Le compte administrateur dispose de privilèges étendus sur le serveur. Par défaut, aucun compte n'est associé à ce rôle. Pour cela, éditer le fichier ejabberd.yml puis rechercher la ligne :
acl:
admin:
user:
- ""
- Puis renseigner l'adresse JID du compte créé lors de l'installation du serveur Ejabberd :
acl:
admin:
user:
- "coyotte@geocoucou.im"
- Nous allons également déclarer une nouvelle ACL nommée net_remote_admin et qui contiendra l'adresse IP du client autorisé à se connecter avec le compte administrateur :
acl: net_remote_admin: ip: - 109.190.143.97/32
- Maintenant, il faut déclarer cette ACL dans les paramètres d'autorisation de l'API. Pour cela, rechercher le bloc :
api_permissions:
...
"admin access":
who:
access:
allow:
- acl: loopback
- acl: admin
- Puis, y ajouter l'ACL créée précédemment (identifiée en rouge) :
api_permissions: ... "admin access": who: access: allow: - acl: net_remote_admin - acl: loopback - acl: admin
- 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://xmpp.geocoucou.im: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 :
|
|
- 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
Paramètre du module mod_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. Pour cela, éditer 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
- Enfin, 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 :
|
|
- 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 proxy reverse 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 :
|
|
- 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
Fonctionnalités avancées
Configuration du module ARCHIVAGE (mod_mam)
Ce module permet aux utilisateurs de conserver un historique de leurs dernières conversations. L'implémentation de cette fonction est décrite dans la norme XEP-0313.
Activation du module
Paramètre | Type | Description |
---|---|---|
access_preferences | AccessName | Permet de définir qui peut modifier les paramètres d'archivage. Par défaut, tout le monde peut gérer cette fonctionnalité pour son propre compte. |
compress_xml | true / false | Active la compression pour les messages archivés. Cette fonctionnalité est uniquement compatible avec des moteurs de bases de données SQL. Par défaut, la valeur est définie à false. |
db_type | mnesia / sql | Type de bases de données utilisée pour ce module. |
default | always / never / roster | Définit la stratégie d'activation par défaut de ce module. Par défaut, la valeur est définie à never. Les options possibles sont : - always : tout les messages sont archivé. |
- Pour activer le module avec les paramètres par défaut, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml puis ajouter les éléments suivants (identifiés en rouge) :
modules: (...) mod_mam: db_type: sql compress_xml: true default: always
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Définir qui est autorisé à gérer cette fonction
- Dans cet exemple, la fonctionnalité pourra uniquement être paramétré par les administrateurs. Dans la section access_rules, déclarer une nouvelle règle d'accès nommée mam_preferences (identifiés en bleu):
access_rules: (...) mam_preferences: allow: admin deny: all
- Enfin, dans la section module, ajouter le paramètre access_preferences pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment :
modules: (...) mod_mam: access_preferences: mam_preferences db_type: sql compress_xml: true default: always
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Configuration du module INSCRIPTION (mod_register)
Ce module permet aux utilisateurs de créer un nouveau compte XMPP sur le serveur Ejabberd depuis un client de messagerie instantané compatible avec la norme XEP-0077.
Pour illustrer cette section, nous prendrons comme exemple les besoins suivants :
- Seuls les clients fonctionnant sur notre réseau informatique ou hébergé sur notre serveur web peuvent créer un nouveau compte XMPP sur le serveur Ejabberd.
- Seuls les clients fonctionnant sur notre réseau informatique ou hébergé sur notre serveur web peuvent supprimer leur compte XMPP sur le serveur Ejabberd.
- Le nom d'utilisateur doit respecter les exigences de syntaxe suivantes :
- Être composé de caractères alphanumériques.
- Ne pas commencer par un chiffre ou le caractère spécial _ ou -.
- Ne pas se terminer par le caractère spécial _ ou -.
- Ne pas contenir de termes techniques réservés comme admin, abuse, contact, tech, webmaster, staff, dns, mail, xmpp, ... .
- Pour toutes nouvelles inscription, le compte XMPP cach3ln@geocoucou.im sera notifié.
- Les nouveaux utilisateurs seront accueillis par un message de bienvenue leur rappelant les règles d'usage.
Activation du module
- Voici la liste des paramètres optionnels qui seront détaillés par la suite :
Paramètre | Type | Description |
---|---|---|
access | AccessName | Permet de contrôler la syntaxe du login souhaité par l'utilisateur. Le contrôle s'effectue via un filtre basé sur les expressions régulières (REGEXP). |
access_from | AccessName | Par défaut, Ejabberd n'autorise pas la création de nouveau compte XMPP depuis une connexion s2s ou encore une session c2s existante. Cela permet d'éviter la création massive de comptes (via des robots notament). |
access_remove | AccessName | Par défaut, tout utilisateur peut supprimer son compte. Il est possible avec ce paramètre de restreindre cette fonction. |
ip_access | AccessName | Par défaut, il n'y a pas de restriction sur l'adresse IP du client XMPP souhaitant créer un nouveau compte sur le serveur Ejabberd. Il est possible de définir via ce paramètre les adresses IP autorisées. |
redirect_url | URL | Si ce paramètres est définit, alors lors de la tentative de création d'un nouveau compte par un client XMPP, le serveur Ejabberd retournera l'url définit par ce paramètre. |
registration_watchers | JIDs | Ce paramètre permet de définir la liste des utilisateurs (en renseignant leur JID) qui seront notifiés lors de la création d'un nouveau compte sur le serveur. |
welcome_message | {subject: Subject, body: Body} | Permet de définir un message de bienvenu lors de la première connexion de l'utilisateur au service de messagerie instantané. |
Il existe d'autres paramètres de configuration. Pour une liste exhaustive visiter la documentation officiel. |
- Pour activer le module avec les paramètres par défaut, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml puis ajouter les éléments suivants (identifiés en rouge) :
modules: (...) mod_register: {}
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Filtrage IP des clients autorisés à s'inscrire
- Pour commencer, déclarons une ACL qui va contenir la liste des réseaux autorisés à effectuer cette action. Pour cela, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml, puis dans la section ACL, déclarer une nouvelle ACL nommée register_networks (identifiés en bleu):
acl: (...) register_networks: ip: - 109.190.125.2/32 - 51.38.231.60/32 - 2001:41d0:305:2100::9789
- Il faut définir le type d'accès octroyé à cette ACL. Dans notre cas, il s'agit d'une condition d'autorisation (allow). Dans la section access_rules, déclarer une nouvelle règle d'accès nommée register_access (identifiés en bleu):
access_rules: (...) register_access: allow: register_networks
- Enfin, dans la section module, ajouter le paramètre ip_access pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment :
modules: (...) mod_register: ip_access: register_access
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Filtrage IP des clients autorisés à se désinscrire
- Pour commencer, déclarons une ACL qui va contenir la liste des réseaux autorisés à effectuer cette action. Pour cela, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml, puis dans la section ACL, déclarer une nouvelle ACL nommée register_remove_networks (identifiés en bleu):
acl: (...) register_remove_networks: ip: - 109.190.125.2/32 - 51.38.231.60/32 - 2001:41d0:305:2100::9789
- Il faut définir le type d'accès octroyé à cette ACL. Dans notre cas, il s'agit d'une condition d'autorisation (allow). Dans la section access_rules, déclarer une nouvelle règle d'accès nommée register_remove_access (identifiés en bleu):
access_rules: (...) register_remove_access: allow: register_remove_networks
- Enfin, dans la section module, ajouter le paramètre access_remove pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment :
modules: (...) mod_register: ip_access: register_access access_remove: register_remove_access
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Filtrage par expression régulière du nom d'utilisateur
- Pour commencer, déclarons une ACL qui va contenir l'expression régulière permettant d'identifier un nom d'utilisateur valide. Pour cela, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml, puis dans la section ACL, déclarer une nouvelle ACL nommée rgxp_synthax_login (identifiés en bleu):
acl: (...) rgxp_synthax_login: user_regexp: - "^[a-zA-Z]+[a-zA-Z0-9_-]+[a-zA-Z0-9]+$": geocoucou.im
- Il faut définir le type d'accès octroyé à cette ACL. Dans notre cas, il s'agit d'une condition d'autorisation (allow). Dans la section access_rules, déclarer une nouvelle règle d'accès nommée rgxp_filtre_login (identifiés en bleu):
access_rules: (...) rgxp_filtre_login: allow: rgxp_synthax_login
- Enfin, dans la section module, ajouter le paramètre access_remove pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment :
modules: (...) mod_register: ip_access: register_access access_remove: register_remove_access access: rgxp_filtre_login
Filtrage par mots clés du nom d'utilisateur
Cette règle s'appuie la règle rgxp_filtre_login décrite dans la section Filtrage par expression régulière |
- Pour commencer, déclarons une ACL qui va contenir la liste des mots à interdire dans le nom d'utilisateur. Pour cela, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml, puis dans la section ACL, déclarer une nouvelle ACL nommée rgxp_termes_techniques (identifiés en bleu):
acl: (...) rgxp_termes_techniques: user_regexp: - "(abuse|tech|admin|staff|contact|webmaster|mail|dns|xmpp)": geocoucou.im
- Il faut définir le type d'accès octroyé à cette ACL. Dans notre cas, il s'agit d'une condition d'interdiction (deny) qui viendra compléter la règles d'accès déjà créée à l'étape précédente. Dans la section access_rules, rechercher la règle d'accès nommée rgxp_filtre_login puis y ajouter les éléments suivants (identifiés en bleu):
access_rules: (...) rgxp_filtre_login: deny: rgxp_termes_techniques allow: rgxp_synthax_login
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Notification pour les nouvelles inscriptions
- Lorsqu'un nouvel utilisateur créé un nouveau compte sur le serveur Ejabberd, il est possible de notifier un utilisateur. Pour définir une notification, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml, puis dans la section modules / mod_register ajouter / adapter les éléments suivants (identifiés en bleu):
modules: (...) mod_register: ip_access: register_access access_remove: register_remove_access access: rgxp_filtre_login registration_watchers: - cach3ln@geocoucou.im
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Message de bienvenue aux nouveaux inscrits
- Le message de bienvenue est envoyé lors de la première connexion de l'utilisateur au service XMPP. Pour en définir un, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml, puis dans la section modules / mod_register ajouter / adapter les éléments suivants (identifiés en bleu):
modules: (...) mod_register: ip_access: register_access access_remove: register_remove_access access: rgxp_filtre_login registration_watchers: - cach3ln@geocoucou.im welcome_message: subject: "Bienvenue !" body: |- Bienvenue sur le serveur XMPP Geocoucou ChatMail, En cas de problèmes ou de difficultés rendez-vous sur le Salon de Discussion support@conference.geocoucou.im. Un abus, un comportement suspect ? Signalez-le à abuse@geocoucou.eu ! Cordialement. L'équipe support Geocoucou ChatMail.
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Configuration du module CHAT MULTI-UTILISATEURS (mod_muc)
Ce module permet aux utilisateurs de bénéficier des fonctions de discussion de groupe. L'implémentation de cette fonction est décrite dans la norme XEP-0045.
Activation du module
Paramètre | Type | Description |
---|---|---|
access | AccessName | Permet de définir qui est autorisé à accéder au service de salons de discussion. Par défaut, tout le monde est autorisé à utiliser ce service. |
access_admin | AccessName | Permet de définir qui est autorisé à administrer les salons de discussion. Par défaut, ce paramètre est définit à none. Seul le créateur du salon de discussion dispose des pouvoirs d'administration. |
access_create | AccessName | Permet de définir qui est autorisé à créer des salons de discussion. Par défaut, ce paramètre est définit à all. Tout le monde peut créer de nouveaux salons de discussion. |
access_mam | AccessName | Permet de définir qui est autorisé à gérer les paramètres d'archivage des salons de discussion. Par défaut, ce paramètre est définit à all. Tout le monde peut modifier les paramètres d'archivage des salons de discussion. |
access_persistent | AccessName | Permet de définir qui est autorisé à gérer le caractère persistant d'un salon de discussion. Par défaut, ce paramètre est définit à all. Tout le monde peut modifier le paramètre de persistance des salons de discussion. |
default_room_options | Options | Définit les paramètres par défaut des salons de discussion. Le créateur du salon peut modifier ces paramètres à tout moment à l'aide de son client de messagerie si il est compatible avec les fonctions MUC. |
max_room_id | Nombre | Permet de définir une limite sur le nombre de caractères composant l'ID du salon de discussion (chaîne se trouvant avant le @ dans l'adresse JID du salon). |
max_user_conferences | Nombre | Permet de définir une limite sur le nombre maximum de salons auxquels les membres peuvent participer. |
max_users | Nombre | Permet de définir un nombre maximum de participants pour chacun des salons de discussion. |
min_message_interval | Nombre | Permet de définir une temporisation entre deux messages d'un même participant. |
- Pour activer le module avec les paramètres par défaut, éditer le fichier de configuration /etc/ejabberd/ejabberd.yml puis ajouter /décommenter les éléments suivants (identifiés en rouge) :
modules: (...) mod_muc: access: - allow access_admin: - allow: admin access_create: muc_create access_persistent: muc_create
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Définir les autorisations d'accès à ce service
- Il faut définir le type d'accès octroyé à cette ACL. Dans notre cas, il s'agit d'une condition d'autorisation (allow). Dans la section access_rules, déclarer une nouvelle règle d'accès nommée muc_access (identifiés en bleu):
access_rule: (...) muc_access: allow: all
- Dans la section module, rechercher le paramètre access puis remplacer les éléments identifiés en rouge :
modules: (...) mod_muc: access: - allow access_admin: - allow: admin access_create: muc_create access_persistent: muc_create
- Par :
modules: (...) mod_muc: access: muc_access access_admin: - allow: admin access_create: muc_create access_persistent: muc_create
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Définir les autorisations d'administration
- Il faut définir le type d'accès octroyé à cette ACL. Dans notre cas, il s'agit d'une condition d'autorisation (allow). Dans la section access_rules, déclarer une nouvelle règle d'accès nommée muc_access_admin (identifiés en bleu):
access_rule: (...) muc_access_admin: allow: admin
- Dans la section module, rechercher le paramètre access puis remplacer les éléments identifiés en rouge :
modules: (...) mod_muc: access: muc_access access_admin: - allow: admin access_create: muc_create access_persistent: muc_create
- Par :
modules: (...) mod_muc: access: muc_access access_admin: muc_access_admin access_create: muc_create access_persistent: muc_create
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Définir les utilisateurs autorisés à créer de nouveaux salons
- Dans la section module, l'ACL muc_create est associée au paramètre access_create (identifiés en bleu) :
modules: (...) mod_muc: access: muc_access access_admin: muc_access_admin access_create: muc_create access_persistent: muc_create
- La modification des droits d'accès s'effectue en adaptant la valeur de l'ACL nommée muc_create. Dans ce cas de configuration, seuls les utilisateurs locaux peuvent créer de nouveaux salons de discussion sur le serveur :
access_rule: (...) muc_create: allow: local
Permettre aux utilisateurs de rendre un salon persistant
- Il faut définir le type d'accès octroyé à cette ACL. Dans notre cas, il s'agit d'une condition d'autorisation (allow). Dans la section access_rules, déclarer une nouvelle règle d'accès nommée muc_access_admin (identifiés en bleu):
access_rule: (...) muc_persistent: allow: admin
- Dans la section module, rechercher le paramètre access puis remplacer les éléments identifiés en rouge :
modules: (...) mod_muc: access: muc_access access_admin: muc_access_admin access_create: muc_create access_persistent: muc_access
- Par :
modules: (...) mod_muc: access: muc_access access_admin: muc_access_admin access_create: muc_create access_persistent: muc_persistent
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Droits d'accès aux paramètres d'archivage
- Il faut définir le type d'accès octroyé à cette ACL. Dans notre cas, il s'agit d'une condition d'autorisation (allow). Dans la section access_rules, déclarer une nouvelle règle d'accès nommée muc_mam (identifiés en bleu):
access_rule: (...) muc_mam: allow: all
- Ensuite, dans la section modules / mod_muc, ajouter le paramètre access_mam pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment :
modules: (...) mod_muc: access: muc_access access_admin: muc_access_admin access_create: muc_create access_persistent: muc_persistent access_mam: muc_mam
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Droits d'accès aux paramètres d'archivage
- Il faut définir le type d'accès octroyé à cette ACL. Dans notre cas, il s'agit d'une condition d'autorisation (allow). Dans la section access_rules, déclarer une nouvelle règle d'accès nommée muc_mam (identifiés en bleu):
access_rule: (...) muc_mam: allow: all
- Ensuite, dans la section modules / mod_muc, ajouter le paramètre access_mam pour activer le filtrage, suivi du nom de la règle d'accès créée précédemment :
modules: (...) mod_muc: access: muc_access access_admin: muc_access_admin access_create: muc_create access_persistent: muc_persistent access_mam: muc_mam
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Filtrage par mots clés du nom du salon
- Dans notre exemple, nous souhaitons contrôler la syntaxe des adresses des salons de discussion (ce qui précède le @). Ce contrôle s'effectue via les expressions régulières. Dans notre cas nous souhaitons :
- Autoriser uniquement les caractères alphanumériques.
- Autoriser les caractères _ et/ou - en milieu de chaîne.
- Pour cela, dans la section modules / mod_muc, ajouter le paramètre regexp_room_id avec pour valeur l'expression régulière suivante :
modules: (...) mod_muc: regexp_room_id: "^[a-zA-Z]+[a-zA-Z0-9_-]*[a-zA-Z0-9]$"
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Il est possible de vérifier la syntaxe et le bon fonctionnement des expressions régulières grâce à l'outil en ligne https://regex101.com/. |
Paramètres par défaut des nouveaux salons
- Lors de la création d'un nouveau salon de discussion, un certain nombre de paramètres sont définit par défaut. Il est possible de modifier ce comportement depuis le fichier de configuration du serveur Ejabberd. Voici une liste non exhaustive des paramètres les plus courant :
Paramètre | Type | Description |
---|---|---|
allow_change_subj | true / false | Autoriser les participants du salon à modifier le sujet de discussion. Par défaut, cette valeur est définie à true. |
allow_private_messages_from_visitors | anyone / moderators / nobody | Autoriser les visiteurs à envoyer un message aux participants du salon. Par défaut, cette valeur est définie à anyone. |
allow_query_users | true / false | Les participants peuvent s'envoyer des requêtes. Par défaut, cette valeur est définie à true. |
allow_subscription | true / false | Autorise les utilisateurs à souscrire aux notifications sur évènements pour le salon de discussion souhaitée. Par défaut, cette valeur est définie à false. |
allow_user_invites | true / false | Autorise les participants du salon à envoyer des invitations. Par défaut, cette valeur est définie à false. |
allow_visitor_nickchange | true / false | Autorise les visiteurs à modifier leur pseudonyme. Par défaut, cette valeur est définie à true. |
allow_visitor_status | true / false | Autorise les visiteurs à envoyer un message de statut lors de la mise à jour de leur disponibilité. Par défaut, cette valeur est définie à true. |
anonymous | true / false | Le salon de discussion est anonyme. Les participants ne peuvent pas voir l'adresse réel XMPP (JID) des autres participants. Seuls les modérateurs peuvent voir cette information. Par défaut, cette valeur est définie à true. |
lang | code langue RFC 5646 | Indique la langue d'usage pour le salon de discussion. Par défaut, cette valeur n'est pas définie. |
logging | true / false | Les messages publiques sont journalisées suivant les paramètres du module mod_muc_log. Par défaut, cette valeur est définie à false. |
mam | true / false | Activer l'archivage des messages. Le module mod_mam doit être actif. Par défaut, cette valeur est définie à false. |
max_users | Nombre | Nombre maximum de participants dans le salon de discussion. Par défaut, cette valeur est définie à 200. |
members_by_default | true / false | Les personnes entrants dans le salon sont par défaut des participants et peuvent donc s'exprimer sans modération. Par défaut, cette valeur est définie à true. |
members_only | true / false | Seuls les membres du salon peuvent entrer. Par défaut, cette valeur est définie à false. |
moderated | true / false | Seuls les participants disposant de la parole (voice) peuvent envoyer des messages publiques. Par défaut, cette valeur est définie à true. |
persistent | true / false | Le salon de discussion continu d'exister même s'il n'y a plus aucun participant. Par défaut, cette valeur est définie à false. |
presence_broadcast | moderator / participant / visitor | Liste des rôles pour lesquels la présence des participants est diffusée dans le salon. |
public | true / false | Le salon de discussion peut être découvert dans la liste des services et des salons de discussions hébergés sur le domaine. Par défaut, cette valeur est définie à true. |
public_list | true / false | La liste des participants est publique, sans avoir besoin d'entrer dans le salon de discussion. Par défaut, cette valeur est définie à true. |
- Dans la section modules / mod_muc, ajouter le paramètre default_room_options avec la liste des sous-paramètres définissant les options par défaut des nouveaux salons de discussion :
modules: (...) mod_muc: access: muc_access access_admin: muc_access_admin access_create: muc_create access_persistent: muc_persistent access_mam: muc_mam default_room_options: mam: true allow_change_subj: true allow_private_messages: true allow_private_messages_from_visitors: anyone allow_query_users: true allow_subscription: false allow_user_invites: false allow_visitor_nickchange: false allow_visitor_status: true anonymous: false lang: fr logging: false members_by_default: true members_only: false moderated: true persistent: false presence_broadcast: [moderator,participant,visitor] public: true public_list: true
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Nombre de caractères maximum composant l'ID d'un salon
- Pour définir une limite sur le nombre de caractères composant l'ID du salon de discussion, renseigner la paramètre max_room_id avec la valeur souhaitée dans la section du module mod_muc :
modules: (...) mod_muc: (...) max_room_id: 24
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Nombre de salons qu'un utilisateur peut rejoindre
- Pour limiter le nombre de salons maximum auxquels les utilisateurs peuvent participer, renseigner la paramètre max_user_conferences avec la valeur souhaitée dans la section du module mod_muc :
modules: (...) mod_muc: (...) max_user_conferences: 100
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Nombre maximum de participants par salon de discussion
- Pour limiter le nombre maximum de participants pour chacun des salons de discussion, renseigner la paramètre max_users avec la valeur souhaitée dans la section du module mod_muc :
modules: (...) mod_muc: (...) max_users: 200
Ce paramètre peut également être appliqué de manière individuel aux salons de discussion. Cependant, le paramètre individuel ne pourra pas se substituer au paramètre globale si ce dernier est plus restrictif. |
Définir une temporisation entre deux messages
- Pour définir une temporisation entre deux messages d'un même participant, renseigner la paramètre min_message_interval avec la valeur souhaitée dans la section du module mod_muc :
modules: (...) mod_muc: (...) min_message_interval: 0.4
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Cette valeur est exprimée en seconde et accepte les nombres décimaux. |
Nombre de messages à afficher lors de la connexion
- Lorsqu'un participant accède au salon de discussion, il est possible d'afficher les n derniers messages envoyés dans le salon. Pour définir ce nombre n, renseigner le paramètre history_size avec la valeur souhaitée dans la section du module mod_muc :
modules: (...) mod_muc: (...) history_size: 50
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Définir le nom du service à afficher lors de la découverte
- Permet de personnaliser le nom du service s'affichant lors de la découverte par les clients de messagerie XMPP. Pour cela, renseigner le paramètre name avec le nom souhaité dans la section du module mod_muc :
modules: (...) mod_muc: (...) name: "Salons de discussion"
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
...
modules:
(...)
mod_muc:
max_rooms_discoitems: 100
max_users_admin_threshold: 5
max_users_presence: 1000
min_presence_interval: 4
preload_rooms: true
room_shaper: none
user_message_shaper: none
user_presence_shaper: none
Définir un hôte pour les connexions invitées
Ejabberd peut être paramétré pour permettre un accès au service sans inscription. Dans ce cas, une adresse JID est générée automatiquement pour l'utilisateur. Une fois déconnectée, cette adresse temporaire est détruite. On parlera ici d'une authentification anonyme sur le serveur.
Pour la mise en place de ce mot de connexion, le paramétrage suivant sera ici mis en place et détaillé :
- Création de l'hôte public.geocoucou.im dans le DNS.
- Déclaration du nouvel hôte virtuel dédié aux connexions anonymes dans Ejabberd.
- Paramétrage des droits des utilisateurs hébergés par ce nouvel hôte.
Paramètres DNS
- Dans la zone DNS du nom de domaine geocoucou.im, créer un nouvel enregistrement CNAME avec les caractéristiques suivantes :
Sous-domaine | Type | Priorité | Poids | Port | Cible | Rôle |
---|---|---|---|---|---|---|
public | CNAME | — | — | — | xmpp.geocoucou.im | Spécifique pour les connexions invités / anonymes au service. |
- Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine public.geocoucou.im. Ce dernier doit pointer sur l'hône xmpp.geocoucou.im :
|
|
; <<>> DiG 9.16.50-Debian <<>> cname public.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51235
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;public.geocoucou.im. IN CNAME
;; ANSWER SECTION:
public.geocoucou.im. 3600 IN CNAME xmpp.geocoucou.im.
;; Query time: 68 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Mon Aug 12 04:46:07 UTC 2024
;; MSG SIZE rcvd: 67
Configuration de l'hôte
Matrice des droits
Ici, nous faisons le choix de limiter les fonctions des utilisateurs au strict minimum. S'agissant d'une connexion anonyme et temporaire, il n'est pas utile :
- De permettre l'accès aux fonctions de gestion des contacts XMPP.
- D'offrir la possibilité de téléverser des pièces jointes.
- De permettre l'accès ou la création de salons de discussion : cette fonctionnalité sera simplement désactivée pour cet hôte virtuel.
Pour résumer, voici un tableau listant les paramètres qui seront défini pour le nouvel hôte :
Fonctions | Module | Paramètre modifiable par l'utilisateur | Niveau d'accès |
---|---|---|---|
Téléverser des pièces jointes | mod_http_upload | Non | Interdit |
Voir la dernière date de connexion des membres | mod_last | Non | Autorisé |
Archiver les messages | mod_mam | Non | Autorisé |
Accéder aux salons de discussion | mod_muc / access | Non | Interdit |
Créer de nouveaux salons de discussion | mod_muc / access_create | Non | Interdit |
Créer un compte utilisateur | mod_register | Non | Autorisé |
Gérer la liste des contacts | mod_roster | Non | Interdit |
Gérer la liste des contacts partagés | mod_shared_roster | Non | Autorisé |
Déclaration de l'hôte
- Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis après la ligne :
hosts: - geocoucou.im
- Ajouter les éléments suivants (repérés en vert) :
hosts:
- geocoucou.im
- public.geocoucou.im
allow_multiple_connections: true
host_config:
public.geocoucou.im:
auth_use_cache: false
auth_method:
- anonymous
anonymous_protocol: both
Configuration de l'hôte
- Depuis la section access_rule, ajouter les règles muc_public et muc_create_public :
access_rule: (...) muc_public: deny: all muc_create_public: deny: all
- À la fin du fichier de configuration, ajouter les éléments de configuration de l'hôte :
append_host_config: public.geocoucou.im: modules: mod_adhoc: {} mod_client_state: {} mod_configure: {} mod_disco: {} mod_http_upload: access: - deny mod_last: {} mod_mam: access_preferences: - deny db_type: sql default: roster mod_muc: access: muc_public access_create: muc_create_public mod_proxy65: {} mod_pubsub: access_createnode: none mod_register: {} mod_register_web: {} mod_roster: access: deny versioning: true mod_shared_roster: {} mod_stun_disco: {} mod_time: {} mod_version: {}
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
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 :
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ètres DNS
- Dans la zone DNS du nom de domaine geocoucou.im, créer un nouvel enregistrement CNAME avec les caractéristiques suivantes :
Sous-domaine | Type | Priorité | Poids | Port | Cible | Rôle |
---|---|---|---|---|---|---|
api | CNAME | — | — | — | xmpp.geocoucou.im | Spécifique pour les échanges nécessitant une connexion à l'API. Configuration en reverse proxy. |
- Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine api.geocoucou.im. Ce dernier doit pointer sur le web proxy reverse web.cachelou.net :
|
|
; <<>> DiG 9.16.50-Debian <<>> cname api.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54871
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;api.geocoucou.im. IN CNAME
;; ANSWER SECTION:
api.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 13:48:44 UTC 2024
;; MSG SIZE rcvd: 75
Création du VHost proxy reverse
|
Les applications web utilisant une connexion API pointeront plutôt sur le serveur web proxy reverse 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 proxy reverse 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 :
|
|
- 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 :
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ètres DNS
Dans la zone DNS du nom de domaine geocoucou.im, créer un nouvel enregistrement CNAME avec les caractéristiques suivantes :
Sous-domaine | Type | Priorité | Poids | Port | Cible | Rôle |
---|---|---|---|---|---|---|
webchat | CNAME | — | — | — | web.cachelou.net | sous-domaine pointant vers le site hébergeant le client web de messagerie instantannée XMPP-CLIENT. |
- Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine webchat.geocoucou.im. Ce dernier doit pointer sur le serveur web web.cachelou.net :
|
|
; <<>> 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
Création du VHost proxy reverse
|
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 proxy reverse 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 :
|
|
- 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 :
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. |
Installation et configuration
|
Pour de plus amples informations sur la mise en place de ce logiciel, veuillez-vous référer à l'article dédié Installer XMPP-WEB. |
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.
Source | Protocole(s) | Port(s) | Description |
---|---|---|---|
* | tcp | 22 | Accès SSH, SFTP. |
* | tcp | 1883 | Services de messagerie MQTT non sécurisée. |
* | tcp | 8883 | Services de messagerie MQTT en TLS. |
* | tcp/udp | 3478 | Services de découverte STUN/TURN. |
* | tcp | 5349 | Services de découverte STUNS/TURNS. |
* | tcp | 5280 | Accès Web Admin du serveur Ejabberd. |
* | tcp | 5222 | Connexion des clients Jabber/XMPP non sécurisée ou STARTTLS. |
* | tcp | 5223 | Connexion des clients Jabber/XMPP en TLS. |
* | tcp | 5225 | Connexion des clients Jabber/XMPP en TLS derrière un reverse proxy. |
* | tcp | 5269 | Connexions serveurs Jabber/XMPP entrantes. |
proxy.cachelou.net | tcp | 5443 | Requêtes API, BOSH, WEBSOCKET, 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).
|
|
- Ajout des règles iptables pour autoriser les flux SSH, ICMP et Ejabberd :
|
|
- Sauvegarde de la configuration et application automatique à chaque redémarrage du système.
|
|