Ejabberd

De NCad Wiki
Aller à la navigation Aller à la recherche

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 :
Enregistrement DNS
Sous-domaine Type Priorité Poids Port Cible Rôle
@ A 152.228.135.223 Pointage du serveur XMPP pour le nom de domaine geocoucou.im
@ AAAA 2001:41d0:404:200::5eee Pointage du serveur XMPP pour le nom de domaine geocoucou.im
xmpp A 152.228.135.223
xmpp AAAA 2001:41d0:404:200::5eee
_xmpp-client SRV 0 0 5222 xmpp.geocoucou.im Enregistrement pour la découverte automatique des paramètres XMPP pour les clients.
_xmpp-server SRV 0 0 5269 xmpp.geocoucou.im Enregistrement pour la découverte automatique des paramètres XMPP pour les serveur.
conference CNAME xmpp.geocoucou.im Domaine XMPP réservé pour l'hébergement des salons de discussion.
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 a geocoucou.im

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

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

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

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

dig aaaa geocoucou.im

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

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

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

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

dig a xmpp.geocoucou.im

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

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

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

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

dig aaaa xmpp.geocoucou.im

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

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

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

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

dig srv _xmpp-client.geocoucou.im

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

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

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

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

dig srv _xmpp-server.geocoucou.im

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

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

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

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

dig cname conference.geocoucou.im

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

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

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

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

Pointage DNS pour 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 cname upload.geocoucou.im

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

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

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

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

Pointage DNS pour 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 cname webchat.geocoucou.im

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

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

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

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

Installation

Serveur Ejabberd

  • Installation du paquet ejabberd :

apt-get install ejabberd

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

apt-get install erlang-p1-mysql

  • Pour vérifier si le service fonctionne normalement :

service ejabberd status

  • Créer un premier compte utilisateur sur le serveur :

ejabberdctl register coyotte geocoucou.im password

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 :

mysql -u root ejabberd < mysql.sql

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

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

Configuration

Définition du domaine de messagerie

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

Définition 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.

Installation du certificat SSL

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

  • Installation de Certbot et de ses dépendances :

apt-get install certbot

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

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

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

Sécu

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

Configuration de l'adresse de contact Abuse

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
  • Le redémarrage du service Ejabberd est nécessaire pour la bonne prise en compte des nouveaux paramètres :

service ejabberd stop
service ejabberd start

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 :

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

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

Paramétrage du reverse proxy

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.

Paramétrage du pare-feu

Matrice des flux autorisés

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

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

Configuration iptables sur la couche IPv4

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

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

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

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

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

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