xmpp/README.md

12 KiB

Service XMPP

Service de messagerie instantanée du candidat chaton de Libre en communs, basé sur XMPP et le serveur ejabberd.

Responsable: Adrien Bourmault (@neox)

Le contenu de ce répertoire est publié sous licence libre GNU AGPL3+.

Installation

Prérequis

On aura besoin de quelques paquets de base :

sudo apt install postgres erlang-p1-pgsql 
sudo apt install postgresql erlang-p1-pgsql 
sudo apt install certbot

On crée un utilisateur pour la base de données postgres :

sudo -u postgres createuser -P ejabberd
sudo -u postgres createdb -O ejabberd ejabberd

Installation du serveur XMPP ejabberd

On installe le paquet ejabberd des dépôts de Debian stable :

sudo apt install ejabberd

On initialise la base de données avec le schéma récupéré dans les fichiers installés par le paquet :

psql -U ejabberd ejabberd < /usr/share/ejabberd/sql/pg.new.sql

On édite ensuite la configuration dans /etc/ejabberd/ejabberd.yml.

Afin de pouvoir réaliser des statistiques sur l'utilisation des appels audio/vidéo, on renforce la verbosité tout en masquant le maximum de données privées :

# loglevel: Verbosity of log files generated by ejabberd
loglevel: info
hide_sensitive_log_data: true

On paramètre les domaines couverts par le service :

hosts:
  - chalec.org

On indique l'emplacement des certificats (préalablement créés avec certbot) et on désactive le système interne de demande de certificat :

certfiles:
  - /etc/letsencrypt/live/xmpp.chalec.org/fullchain.pem
  - /etc/letsencrypt/live/xmpp.chalec.org/privkey.pem
  - /etc/letsencrypt/live/chalec.org/fullchain.pem
  - /etc/letsencrypt/live/chalec.org/privkey.pem

acme: 
  auto: false

On peut alors paramétrer les différents modules du service XMPP, c'est à dire le C2S, le S2S, TURN/STUN pour les appels audio/vidéo :

listen:
  -
    port: 5222
    ip: "::"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    starttls_required: true
    protocol_options: 'TLS_OPTIONS'
  -
    port: 5223
    ip: "::"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    tls: true
    protocol_options: 'TLS_OPTIONS'
  -
    port: 5269
    ip: "::"
    module: ejabberd_s2s_in
    max_stanza_size: 524288
  -
    port: 5444
    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
  -
    port: 5280
    ip: "::"
    module: ejabberd_http
    tls: true
    protocol_options: 'TLS_OPTIONS'
    request_handlers:
      /admin: ejabberd_web_admin
      /.well-known/acme-challenge: ejabberd_acme

  # PUBLIC TURN
  -
    port: 3475
    ip: "::"
    transport: udp
    module: ejabberd_stun
    use_turn: true
    auth_type: anonymous
    #auth_realm: 
    turn_ipv4_address: PUBLIC_IPV4
    turn_ipv6_address: PUBLIC_IPV6
  -
    port: 3475
    ip: "::"
    transport: tcp
    module: ejabberd_stun
    use_turn: true
    auth_type: anonymous
    #auth_realm: 
    turn_ipv4_address: PUBLIC_IPV4
    turn_ipv6_address: PUBLIC_IPV6

  -
    port: 3478
    ip: "::"
    transport: udp
    module: ejabberd_stun
    use_turn: true
    #auth_type: anonymous
    auth_realm: chalec.org
    turn_ipv4_address: PUBLIC_IPV4
    turn_ipv6_address: PUBLIC_IPV6
  -
    port: 3478
    ip: "::"
    transport: tcp
    module: ejabberd_stun
    use_turn: true
    #auth_type: anonymous
    auth_realm: chalec.org
    turn_ipv4_address: PUBLIC_IPV4
    turn_ipv6_address: PUBLIC_IPV6

On active SCRAM pour les mots de passes utilisateurs et STARTTLS pour les connexions S2S :

s2s_use_starttls: required

## Store the plain passwords or hashed for SCRAM:
auth_password_format: scram

On met aussi en place la connexion à la base de données pour ejabberd :

auth_method: sql

sql_type: pgsql
sql_server: "localhost"
sql_database: "ejabberd"
sql_username: "ejabberd"


sql_pool_size: 10
new_sql_schema: true
default_db: sql

On paramètre notre système de génération de captcha :

## Full path to a script that generates the image.
captcha_cmd: "/opt/chalec-xmpp-outils/captcha/captcha.sh"
captcha_url: https://xmpp.chalec.org:5444/captcha
registration_timeout: 60

On active l'inscription "in-band" :

 mod_register:
    ## Only accept registration requests from the "trusted"
    ## network (see access_rules section above).
    ## Think twice before enabling registration from any
    ## address. See the Jabber SPAM Manifesto for details:
    ## https://github.com/ge0rg/jabber-spam-fighting-manifesto
    ip_access: all
    access: chalec_server
    captcha_protected: true
    registration_watchers: [admin@chalec.org]
    welcome_message:
      subject: Message de bienvenue
      body: "Salut! Nous vous souhaitons la bienvenue sur l'instance XMPP de Chalec, 
             
             opérée par l'association Libre en Communs !
        
        
        Pour plus d'informations sur nos actions : https://www.a-lec.org
        
        Vous pouvez également rejoindre le salon public de l'association ici : xmpp:a-lec@salons.a-lec.org?join
        
        
        Vous souhaitant un bon usage de nos services,
        
        Librement,
        
          
        L'équipe de Chalec."

On paramètre les quotas pour le téléversement de fichiers :

shaper_rules:
  max_user_sessions: 10
  max_user_offline_messages:
    5000: admin
    500: all
  c2s_shaper:
    none: admin
    normal: all
  s2s_shaper: fast
  soft_upload_quota: #MiB
    250: all
  hard_upload_quota: #MiB
    255: all


mod_http_upload:
    hosts: ["xmpp.@HOST@"]
    put_url: "https://xmpp.@HOST@:5444/upload"
    get_url: "https://xmpp.@HOST@:5444/upload"
    docroot: /var/www/upload
    max_size: 262144000 # 250 MB
    file_mode: "0644"
    dir_mode: "2755"
    secret_length: 20
    jid_in_url: sha1
    custom_headers:
      "Access-Control-Allow-Origin": "https://@HOST@"
      "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
      "Access-Control-Allow-Headers": "Content-Type"
  mod_http_upload_quota:
    max_days: 30

Et enfin, pour que les appels audio/vidéo fonctionnent correctement :

mod_stun_disco: {}

Note : il faut penser également à paramétrer un compte administrateur dans la section acl.

Une fois la configuration effectuée on recharge ejabberd avec :

sudo ejabberdctl reload_config

Le débogage peut se faire à l'aide du fichier journal /var/log/ejabberd/ejabberd.log.

Installation et configuration de Biboumi

On installe le paquet biboumi depuis les dépôts de Debian stable :

sudo apt install biboumi

On crée un utilisateur et un rôle pour psql :

sudo adduser _biboumi
sudo -u _biboumi psql
CREATE ROLE biboumi LOGIN PASSWORD '***masqué***';

On configure ensuite dans /etc/biboumi/biboumi.cfg.

Pour Biboumi il faut configurer la connexion à la base de données (créer un utilisateur dédié dans pgsql est le mieux à faire). On paramètre aussi la customisation des noms d'utilisateurs pour que les utilisateurs puissent changer de nick sur IRC. On rend les canaux IRC persistants pour que l'historique soit enregistré lorsque l'utilisateur est hors-ligne (effet BNC/ZNC) :

hostname=irc.chalec.org
password=***masqué***

xmpp_server_ip=127.0.0.1
port=8888

admin=admin@chalec.org
realname_customization=true
realname_from_jid=true
persistent_by_default=true

ca_file=
outgoing_bind=

log_level=1
db_name=postgresql://_biboumi:***masqué***@localhost

On oublie pas d'indiquer à ejabberd que Biboumi existe dans /etc/ejabberd/ejabberd.yml, en choississant son sous-domaine (ici, irc.chalec.org) :

listen:
[...]
  -
    port: 8888
    ip: "127.0.0.1"
    module: ejabberd_service
    access: all
    hosts:
      "irc.chalec.org":
         password: ***masqué***

On pense enfin à recharger la configuration d'ejabberd avec sudo ejabberdctl reload_config et à démarrer le service biboumi.service avec systemctl.

Création d'un premier compte

sudo ejabberdctl register admin@chalec.org mot_de_passe

Installation d'un serveur web pour rediriger vers la page du site www.chalec.org et déployer statoolinfos

On utilise le serveur nginx des dépôts Debian.

sudo apt install nginx

On crée le fichier de configuration approprié pour notre service (cf documentation infrastructure)

server { listen 80; listen [::]:80;

  server_name xmpp.chalec.org;

  access_log /var/log/nginx/xmpp.chalec.org-access.log;
  error_log /var/log/nginx/xmpp.chalec.org-error.log;

  return 302 https://xmpp.chalec.org$request_uri;

}

server { listen 444 ssl proxy_protocol; listen [::]:443 ssl; set_real_ip_from 192.168.0.1; real_ip_header proxy_protocol;

  server_name xmpp.chalec.org;

  root /var/www/html;

  access_log /var/log/nginx/xmpp.chalec.org-access.log;
  error_log /var/log/nginx/xmpp.chalec.org-error.log;

  ssl_certificate /etc/letsencrypt/live/xmpp.chalec.org/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/xmpp.chalec.org/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

  # Add index.php to the list if you are using PHP
  index index.html index.htm index.php index.xhtml;

  # StatoolInfos.
  include /etc/nginx/statoolinfos.conf;

  location / {
      # First attempt to serve request as file, then
      # as directory, then fall back to displaying a 404.
      return 302 https://www.chalec.org/services/xmpp.html;
  }

  ssi on;
  ssi_last_modified on;

  # pass PHP scripts to FastCGI server
  
  location ~ \.php$ {
      include snippets/fastcgi-php.conf;
      # With php-fpm (or other unix sockets):
      fastcgi_pass unix:/run/php/php7.4-fpm.sock;
      # With php-cgi (or other tcp sockets):
      # fastcgi_pass 127.0.0.1:9000;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
  }

}

Installation du client web movim

Prérequis

Installer les paquets :

sudo apt install composer php-fpm php-curl php-mbstring php-imagick php-gd php-pgsql php-xml

Installation du serveur movim

Récupération de la dernière version

Se placer dans le répertoire web :

cd /var/www

Cloner le dépôt de code de movim :

sudo -u www-data git clone https://github.com/movim/movim.git && cd movim

Récupérer la dernière version stable (ici : v0.21)

sudo -u www-data git checkout v0.21

On crée la branche dédiée :

sudo -u www-data git branch xmpp.chalec.org-v0.21
sudo -u www-data git checkout xmpp.chalec.org-v0.21

Déploiement avec php-composer

cd var/www/movim
sudo -u www-data composer install

Création de la base de données

sudo -i -u postgres
createuser --interactive  # créer le rôle movim avec les permissions minimales
sudo -u postgres psql
CREATE DATABASE movim OWNER movim;

Mise à jour du serveur movim

Avec vxxx la dernière version :

cd /var/www/movim
sudo -u www-data git fetch
sudo -u www-data git branch xmpp.chalec.org-vxxx
sudo -u www-data git checkout xmpp.chalec.org-vxxx
sudo -u www-data git merge vxxx
sudo -u www-data composer install