XMPP: Messagerie sécurisée

XMPP: Messagerie sécurisée

Cette procédure va couvrir l’installation et la configuration d’un serveur XMPP de messagerie instantanée personnel et sécurisé.

Afin de me rapprocher de mon objectif de réduire ma dépendance à l’égard des services centralisés, j’ai décidé de configurer mon serveur XMPP / Jabber sur un VPS exécutant Debian Jessie. J’ai choisi ejabberd car il a été recommandé par le site RTC Quick Start.

DNS et SSL

Mon domaine personnel est vpnwall.xyz et j’ai donc créé les enregistrements DNS suivants:

 jabber-gw CNAME vpnwall.xyz.
 _xmpp-client._tcp SRV 5 0 5222 jabber-gw.vpnwall.xyz.
 _xmpp-server._tcp SRV 5 0 5269 jabber-gw.vpnwall.xyz.

Ensuite, je suis allé chercher un certificat TLS gratuit pour jabber-gw.vpnwall.xyz et vpnwall.xyz.
La façon la plus simple d’obtenir un certificat est d’installer certbot à partir des back-end debian en ajoutant ce qui suit à votre /etc/apt/sources.list:
deb http://httpredir.debian.org/debian jessie-backports main contrib non-free

Puis installez le paquet:
apt update && apt install certbot

Ensuite, fermez votre serveur Web existant si vous avez un fonctionnement et demandez un cert comme ceci:
certbot certonly -d jabber-gw.vpnwall.xyz, vpnwall.xyz --standalone

Une fois que vous avez le cert, vous pouvez fusionner les clés privées et publiques dans le fichier que ejabberd attend:
chat /etc/letsencrypt/live/jabber-gw.vpnwall.xyz/privkey.pem /etc/letsencrypt/live/jabber-gw.vpnwall.xyz/fullchain.pem> ejabberd.pem

Puis redémarrez le service:
systemctl restart ejabberd.service

StartSSL

J’ai également utilisé StartSSL avec succès. C’est ainsi que j’ai généré la CSR (Certificate Signing Request) sur une machine à haute entropie:
openssl req -new -newkey rsa: 2048 -sha256 -nodes -out ssl.csr -keyout ssl.key -subj "/C=NZ/CN=jabber-gw.vpnwall.xyz"

J’ai téléchargé le certificat signé ainsi que le certificat intermédiaire StartSSL et les combiné de cette façon:
cat ssl.crt ssl.key sub.class1.server.ca.pem> ejabberd.pem

Installation ejabberd

L’installation d’ejabberd sur Debian est assez simple et j’ai surtout suivi les étapes sur le wiki Ubuntu avec une personnalisation supplémentaire pour résoudre les problèmes de connexion Pidgin « Non autorisés ».
Installez le package en utilisant « admin » comme nom d’utilisateur pour l’utilisateur administrateur:
apt-get install ejabberd

Réglez ce qui suit dans /etc/ejabberd/ejabberd.yml (n’oubliez pas les points de départ!):

 acl:
 admin:
 user:
 - "admin": "vpnwall.xyz"
 hosts:
 - "vpnwall.xyz"
 auth_password_format: scram
 fqdn: "jabber-gw.vpnwall.xyz"

Copiez le certificat SSL dans le répertoire /etc/ejabberd/ et définissez les permissions correctement:

Améliorez la configuration TLS client-à-serveur en ajoutant starttls_required à ce bloc:
chown root: ejabberd /etc/ejabberd/ejabberd.pem
chmod 640 /etc/ejabberd/ejabberd.pem

 listen:
 -
 port: 5222
 ip: "::"
 module: ejabberd_c2s
 certfile: "/etc/ejabberd/ejabberd.pem"
 starttls: true
 starttls_required: true
 protocol_options:
 - "no_sslv3"
 - "no_tlsv1"
 - "no_tlsv1_1"
 - "cipher_server_preference"
 cipher: "ECDHE-ECDSA-AES256-GCM-SHA384: ECDHE-RSA-AES256-GCM-SHA384: ECDHE-ECDSA-CHACHA20-POLY1305: ECDHE-RSA-CHACHA20-POLY1305: ECDHE-ECDSA-AES128-GCM-SHA256: ECDHE -RSA-AES128-GCM-SHA256: ECDHE-ECDSA-AES256-SHA384: ECDHE-RSA-AES256-SHA384: ECDHE-ECDSA-AES128-SHA256: ECDHE-RSA-AES128-SHA256 "
 tls_compression: false
 dhfile: "/etc/ssl/ejabberd/dh2048.pem"
 max_stanza_size: 65536
 shaper: c2s_shaper
 access: c2s

s2s_use_starttls: required_trusted
 s2s_protocol_options:
 - "no_sslv3"
 - "no_tlsv1"
 - "no_tlsv1_1"
 - "cipher_server_preference"
 s2s_dhfile: /etc/ssl/ejabberd/dh2048.pem
 s2s_ciphers: "ECDHE-ECDSA-AES256-GCM-SHA384: ECDHE-RSA-AES256-GCM-SHA384: ECDHE-ECDSA-CHACHA20-POLY1305: ECDHE-RSA-CHACHA20-POLY1305: ECDHE-ECDSA-AES128-GCM-SHA256: ECDHE -RSA-AES128-GCM-SHA256: ECDHE-ECDSA-AES256-SHA384: ECDHE-RSA-AES256-SHA384: ECDHE-ECDSA-AES128-SHA256: ECDHE-RSA-AES128-SHA256 "

Créez le fichier dh2048.pem requis:
openssl dhparam -out /etc/ssl/ejabberd/dh2048.pem 2048

Redémarrez le démon ejabberd:
/etc/init.d/ejabberd restart

Créez un nouveau compte utilisateur par vous-même:
ejabberdctl register me vpnwall.xyz P@ssw0rd1!

Ouvrez les ports suivants sur le pare-feu du serveur:
iptables -A INPUT -p tcp --port 5222 -j ACCEPTER
iptables -A INPUT -p tcp --port 5269 -j ACCEPTER

En option, créez un cronjob dans /etc/cron.d/restart-ejabberd pour redémarrer ejabberd une fois par jour pour vous assurer qu’il ne cesse de répondre aux demandes après avoir fonctionné pendant un certain temps:
0 4 * * * root /bin/systemctl restart ejabberd.service

Notez que si vous souhaitez communiquer avec le serveur GMAIL XMPP, vous devez malheureusement modifier le paramètre s2s_use_starttls à l’étape 3 comme suit:
s2s_use_starttls: optional