Ejabberd
|
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
- Nom d'hôte de messagerie : geocoucou.im
- Adresses IP :
- IPv4 : 152.228.135.223
- IPv6 : 2001:41d0:404:200::5eee
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 | SRV | 0 | 0 | 5222 | xmpp.geocoucou.im | Enregistrement pour la découverte automatique des paramètres XMPP pour les clients. |
_xmpp-server | SRV | 0 | 0 | 5269 | xmpp.geocoucou.im | Enregistrement pour la découverte automatique des paramètres XMPP pour les serveur. |
conference | CNAME | — | — | — | xmpp.geocoucou.im | Domaine XMPP réservé pour l'hébergement des salons de discussion. |
webchat | CNAME | — | — | — | web.cachelou.net | sous-domaine pointant vers le site hébergeant le webchat Converse.js. |
upload | CNAME | — | — | — | web.cachelou.net | Spécifique pour la fonction File HTTP Upload (mod_http_upload). Configuration en reverse proxy. |
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.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.geocoucou.im :
|
|
; <<>> DiG 9.16.50-Debian <<>> srv _xmpp-client.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43567
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;_xmpp-client.geocoucou.im. IN SRV
;; ANSWER SECTION:
_xmpp-client.geocoucou.im. 3600 IN SRV 0 0 5222 xmpp.geocoucou.im.
;; Query time: 52 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sun Jul 28 18:22:38 UTC 2024
;; MSG SIZE rcvd: 91
- Vérifions le pointage du champs DNS de type SRV pour le sous-domaine _xmpp-server.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.geocoucou.im :
|
|
; <<>> DiG 9.16.50-Debian <<>> srv _xmpp-server.geocoucou.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14041
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;_xmpp-server.geocoucou.im. IN SRV
;; ANSWER SECTION:
_xmpp-server.geocoucou.im. 3600 IN SRV 0 0 5269 xmpp.geocoucou.im.
;; Query time: 68 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Sun Jul 28 18:24:40 UTC 2024
;; MSG SIZE rcvd: 91
- Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine conference.geocoucou.im. Ce dernier doit pointer sur le sous-domaine xmpp.geocoucou.im :
|
|
; <<>> DiG 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 la fonction HTTP FILE UPLOAD
- Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine upload.geocoucou.im. Ce dernier doit pointer sur le sous-domaine web.cachelou.net :
|
|
; <<>> DiG 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 le portail ChatMail (spécifique Géocoucou)
- Vérifions le pointage du champs DNS de type CNAME pour le sous-domaine webchat.geocoucou.im. Ce dernier doit pointer sur le sous-domaine web.cachelou.net :
|
|
; <<>> DiG 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
Installation
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éer un premier compte utilisateur sur le serveur :
|
|
Base de données SQL
|
Les scripts d'installation de la base de données se trouvent à la racine /usr/share/ejabberd/sql. |
- Procéder à l'importation de la structure des tables à l'aide de la commande mysqldump :
|
|
- Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis après la ligne :
auth_password_format: scram
- Ajouter et adapter les lignes suivantes :
auth_method: sql default_db: sql sql_type: mysql sql_server: "localhost" sql_database: "ejabberd" sql_username: "ejabberd" sql_password: "password"
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Configuration
Définition du domaine de messagerie
- Editer le fichier ejabberd.yml puis rechercher la ligne :
hosts:
- localhost
- Remplacer par :
hosts
- geocoucou.im
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
Paramètre du compte administrateur
- Editer le fichier ejabberd.yml puis rechercher la ligne :
acl:
admin:
user:
- ""
- Remplacer par :
acl:
admin:
user:
- "coyotte@geocoucou.im"
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
|
Dès à présent, il est possible de se connecter à l'interface d'administration du serveur ejabberd via le lien https://<IP_SERVEUR_EJABERD:5280/admin. |
Activation des protocoles de découverte TURN/STUN
- Editer le fichier ejabberd.yml puis rechercher la ligne :
- port: 3478 ip: "::" transport: udp module: ejabberd_stun use_turn: true ## The server's public IPv4 address: # turn_ipv4_address: "203.0.113.3" ## The server's public IPv6 address: # turn_ipv6_address: "2001:db8::3"
- Décommenter les lignes ci-dessous et adapter le contenu (éléments en rouge) :
- port: 3478 ip: "::" transport: udp module: ejabberd_stun use_turn: true ## The server's public IPv4 address: turn_ipv4_address: "152.228.135.223" ## The server's public IPv6 address: turn_ipv6_address: "2001:41d0:404:200::5eee"
- Redémarrer le serveur Ejabberd pour la prise en compte des nouveaux paramètres :
service ejabberd restart
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
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
Sécu
- Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis après :
loopback: ip: - 127.0.0.0/8 - ::1/128
- Ajouter :
net_ncad: ip: - 109.190.9.125/32
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
- Le redémarrage du service Ejabberd est nécessaire pour la bonne prise en compte des nouveaux paramètres :
|
|
Paramètre du mode moc_http_upload
|
Ce mode permet d'héberger des fichiers sur le serveur de messagerie instantané. Cette fonction est particulièrement utile pour partager des images sur le chat. |
Configuration du connecteur Ejabberd
- Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis rechercher le bloc suivant :
- port: 5443 ip: "::" module: ejabberd_http tls: true protocol_options: 'TLS_OPTIONS' request_handlers: /api: mod_http_api ##/bosh: mod_bosh ##/upload: mod_http_upload /ws: ejabberd_http_ws
- Puis, décommenter la ligne suivante :
/upload: mod_http_upload
- 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 :
mod_http_upload: access: local thumbnail: false docroot: "/var/lib/ejabberd/upload" put_url: "https://upload.geocoucou.im/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 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
ProxyRequests Off RewriteEngine on SSLProxyEngine on SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off <VirtualHost *:80> ServerAdmin tech@ncad.fr 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>
Paramètres de l'API
Permissions
- Editer le fichier de configuration /etc/ejabberd/ejabberd.yml puis remplacer :
who:
ip:
- 127.0.0.1/8
what:
- status
- connected_users_number
- Par les éléments suivants :
who: ip: - 127.0.0.1/8 - 51.38.231.60/32 - 2001:41d0:305:2100:9789/56 what: "*"
Installation de Converse
Converse est un client web XMPP.
- Récupération du script : https://conversejs.org/
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. |
* | udp | 3478 | Protocole STUN/TURN pour Ejabberd. |
* | tcp | 5280 | Accès interface d'administration Ejabberd. |
* | tcp | 5222 | Connexion des clients XMPP au serveur Ejabberd. |
* | tcp | 5223 | Connexion des clients XMPP au serveur Ejabberd avec TLS. |
* | tcp | 5269 | Echanges entre serveurs XMPP. |
proxy.cachelou.net | tcp | 5443 | Flux spécifiques pour les requêtes API, BOSH et HTTP_UPLOAD. |
<@IP_SUPERVISION> | udp | 161,162 | Accès SNMP depuis serveur supervision. |
* | icmp | — | Réponse aux requêtes ping. |
Configuration iptables sur la couche IPv4
- Installation des paquets iptables (pare-feu) et iptables-persistent (sauvegarde persistante de la configuration).
|
|
- Ajout des règles iptables pour autoriser les flux SSH, ICMP et MySQL :
|
|
- Sauvegarde de la configuration et application automatique à chaque redémarrage du système.
|
|