Aujourd'hui, nous partons à la découverte de Matrix. Comme beaucoup je ne connaissais pas exactement le fonctionnement, mais finalement c'est un outil assez simple d'utilisation. Promis on ne va pas parler du célèbre film...

Mais avant tout, on va expliquer les différentes notions :

  • Matrix : Protocole pour la communication en temps réel. Il a été lancé en 2014 et se veut simple et léger.

  • Element : Client utilisant le protocole Matrix. Anciennement Riot.im, il est disponible via une application web, sur PC et mobile. Il y a même une intégration avec Nextcloud 😉

  • Bridge : Composant de l'architecture Matrix, qui joue le rôle d'intermédiaire entre le serveur Matrix, et les services externes (exemple : Facebook Messenger, Signal, SMS,) dont la liste est disponible ici :

Pour résumer, Matrix est un énorme réseau de messagerie, composé d'une multitude d'instances, fédérées entre elles. N'importe quel utilisateur inscrit sur une instance Matrix peut discuter à n'importe qui.

Nous allons voir aujourd'hui comment installer sa propre instance exploitant le protocole Matrix, à travers la solution Synapse. Dans notre cas nous utilisons un serveur Debian 11.

Prérequis

Avant d'installer Synapse, voici quelques prérequis :

  • Créer une entrée DNS de type A, par exemple matrix.example.com
  • Créer une entrée DNS de type SRV, par exemple : _matrix._tcp.example.com. 3600 IN SRV 10 0 8448 matrix.example.com.
  • Ouvrir le port 8448

Dans le cadre de notre article nous allons désactiver IPv6 sur la machine.

Installation de Synapse

Mettre à jour les sources et les paquets :

apt-get update
apt-get upgrade

Installer les différents paquets nécessaires :

apt-get install lsb-release wget apt-transport-https curl git

Installer la source de Synapse :

wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/matrix-org.list

Installer les paquets relatifs à Synapse :

apt-get update
apt-get install matrix-synapse-py3 python3-psycopg2

Il vous sera demandé le nom d'hôte de votre serveur. Dans notre cas, il s'agit de matrix.example.com. Poursuivre la configuration.

La configuration de Synapse se fait avec le fichier /etc/matrix-synapse/homeserver.yaml. Remplacer cette ligne :

    bind_addresses: ['::1', '127.0.0.1']

Par :

    bind_addresses: ['127.0.0.1']	### Mettre 0.0.0.0 si écoute externe

Créer un secret pour la valeur de registration_shared_secret :

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1

Puis (re)démarrer le service :

systemctl enable matrix-synapse
systemctl restart matrix-synapse

Vérifions que le service soit bien opérationnel :

Vérifions également l'écoute sur le port 8008 :

root@debian11:~# ss -tpln |grep 8008
LISTEN 0      50         127.0.0.1:8008      0.0.0.0:*    users:(("python",pid=9043,fd=13))   

Le composant Synapse est installé.

Configuration de Synapse avec PostgreSQL

Par défaut, Synapse est configuré avec une base de données SQLite, mais nous recommandons en production l'utilisation d'une BdD PostgreSQL.

Installer PostgreSQL :

apt-get install postgresql

Créer un utilisateur synapse :

root@debian11:~# su - postgres
postgres@debian11:~$ createuser --pwprompt synapse

Créer une base de données synapse :

postgres@debian11:~$ createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapse

Puis configurer Synapse pour fonctionner avec PostgreSQL, dans /etc/matrix-synapse/homeserver.yaml, commenter cette partie :

database:
  name: sqlite3
  args:
    database: /var/lib/matrix-synapse/homeserver.db

Et rajouter ceci :

database:
  name: psycopg2
  txn_limit: 10000
  args:
    user: synapse
    password: PasswordGenere
    database: synapse
    host: localhost
    port: 5432
    cp_min: 5
    cp_max: 10 

Redémarrer le service :

systemctl restart matrix-synapse

Configuration derrière un proxy Apache

Cette étape vous permettra de laisser le port TCP de Matrix (8008) fermé à l'extérieur, et de sécuriser vos requêtes à travers HTTPS.

Activer les modules suivants :

a2enmod proxy proxy_http proxy_balancer ssl headers lbmethod_byrequests

Si besoin d'accéder depuis l'extérieur, alors il faut suivre l'étape suivante : la configuration derrière un reverse-proxy. Ajouter cette ligne dans /etc/apache2/ports.conf :

Listen 8448

Et le Vhost :

<VirtualHost *:80>
   ServerName matrix.example.com
   Redirect Permanent / https://matrix.example.com/
</VirtualHost>
<VirtualHost *:443>
        ServerName matrix.example.com

        ProxyRequests off
        ProxyPreserveHost On
        ProxyVia full

        ProxyPass /_matrix/identity http://127.0.0.1:8090/_matrix/identity

        <Location />
            ProxyPass http://127.0.0.1:8008/ nocanon
            ProxyPassReverse  http://127.0.0.1:8008/
        </Location>

        RequestHeader set X-Forwarded-Proto "https"

        # Configuration of the SSL Certificate
        SSLEngine On
        SSLCertificateFile /etc/letsencrypt/live/matrix.example.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/matrix.example.com/privkey.pem
</VirtualHost>
<VirtualHost *:8448>
        ServerName matrix.example.com

        # Configuration of the SSL Certificate
        SSLEngine On
        SSLCertificateFile /etc/letsencrypt/live/matrix.example.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/matrix.example.com/privkey.pem

        <Location />
            ProxyPass http://127.0.0.1:8008/ nocanon
            ProxyPassReverse http://127.0.0.1:8008/
        </Location>
</VirtualHost>

Redémarrer Apache afin que les changements soient pris en compte :

systemctl restart apache2

Test du fonctionnement

Tester le bon fonctionnement : http://matrix.example.com

Sinon, aller sur : https://federationtester.matrix.org/ :

Utilisation

Pour créer un utilisateur sur sa propre plateforme, taper la commande suivante :

register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008

Vous pouvez utiliser l'application open-source Element (qui est utilisée par 85% des utilisateurs de Matrix).

Cliquez sur "Se connecter". Nous n'avons pas de compte sur la plateforme Element, mais un compte sur notre instance Matrix. Chaque élément a un identifiant unique, de cette forme :

  • #news:matrix.org : Channel #news du serveur @matrix.org
  • @clement:matrix.org : User "clement" du serveur @matrix.org

Changer le serveur d'accueil, pour ne pas utiliser le service Matrix.org, pour la simple et bonne raison que nous avons créé le nôtre. 😁

Vous êtes à présent connecté, vous pouvez discuter avec n'importe quel utilisateur d'une instance Matrix. Nous verrons dans un prochain article comment configurer un bridge, à travers l'exemple de Facebook Messenger !