Afin de répondre à un besoin de communication plus rapide que le mail, j’ai eu à utiliser divers systèmes de messagerie instantanée (IM) aux seins des entreprises par lesquelles je suis passé.
J’ai eu à déployer un système de chat avec salon de conversation à plusieurs acteurs.

Le cahier des charges que je me suis imposé est le suivant:

  • Le coût, gratuit et libre si possible.
  • Multi-plateforme, que se soit sur PC, MAC et smartphone.
  • Sécurisé, que ce soit en terme de communication et de connexion.
  • Administrable facilement, parce que personne n’a de temps à perdre.

J’ai donc opté pour un chat XMPP qui répondait à tous ces critères: Prosody (https://prosody.im/)

Nous verrons donc ici comment installer, sécuriser et administrer un serveur Prosody.
Dans un deuxième temps nous verrons comment créer des chatroom multi-utilisateurs (MUC)

Ce tuto sera réalisé sous Debian 9.

Nous partirons de la solution suivante:

Dans notre situation nous aurons deux PC (directeur et employé) sur le site principal, et un pc distant connecté au réseau local via VPN.

 

Préparation du serveur Prosody.

Au premier lancement de notre serveur Debian fraîchement installé, nous passerons en root puis nous exécuterons une mise à jour des dépôts et des paquets.

apt-get update && apt-get upgrade

Nous changerons le nom du serveur.

nano /etc/hostname

Dans le cadre de ce tuto nous nommerons le serveur « serverxmpp » (soit le FQDN serverxmpp.domain.local).

Puis nous redémarrerons.

reboot

Installation et configuration de Prosody

Nous commencerons par installer le paquet Prosody et ses dépendances.

apt-get install prosody

Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
The following additional packages will be installed:
  libevent-2.0-5 lua-event lua-expat lua-filesystem lua-sec lua-socket lua5.1 ssl-cert
Paquets suggérés :
  lua-dbi-mysql lua-dbi-postgresql lua-dbi-sqlite3 lua-zlib openssl-blacklist
Les NOUVEAUX paquets suivants seront installés :
  libevent-2.0-5 lua-event lua-expat lua-filesystem lua-sec lua-socket lua5.1 prosody ssl-cert
0 mis à jour, 9 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 620 ko dans les archives.
Après cette opération, 3 188 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] o

Une fois le paquet installé nous trouverons tous les fichiers nécessaires à la configuration dans le dossier « /etc/prosody/ ».

Avant même de modifier la configuration de Prosody, nous allons générer les fichiers de certificats nécessaires à la sécurisation des connexions. Nous commencerons par la génération de la clé privée (clé RSA) directement dans le dossier certificat de Prosody « /etc/prosody/certs/ ».

openssl genrsa -out /etc/prosody/certs/serverxmpp.domain.local.key 2048

Generating RSA private key, 2048 bit long modulus
..............................................+++
.....+++
e is 65537 (0x010001)

Nous générerons le certificat de connexion avec cette clé privée pour une période d’un an (365 jours).

openssl req -new -x509 -key /etc/prosody/certs/serverxmpp.domain.local.key -out /etc/prosody/certs/serverxmpp.domain.local.cert -days 365

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:fr
State or Province Name (full name) [Some-State]:Deux Servres
Locality Name (eg, city) []:Niort
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Demo Company
Organizational Unit Name (eg, section) []:Service Info
Common Name (e.g. server FQDN or YOUR name) []:domain.local
Email Address []:adminxmpp@domain.fr

Ensuite, nous pourrons ensuite attaquer la partie configuration du serveur Prosody d’abord en sauvegardant le fichier de configuration original et en l’éditant:

  • Sauvegarde du fichier:
cp /etc/prosody/prosody.cfg.lua /etc/prosody/prosody.cfg.lua.save
  • Edition du fichier de configuration:
nano /etc/prosody/prosody.cfg.lua

Dans le fichier nous définirons:

  • L’administrateur du serveur:
admins = {"remi@serverxmpp.domain.local"}
  • Nous forcerons l’utilisation du certificat entre le client et le serveur:
c2s_require_encryption = true
  • Puis nous définirons le premier serveur virtuel (Virtual Host). Cela nous permettra de définir plusieurs domaines DNS pour le serveur Prosody. Nous y spécifierons l’activation du virtualhost, l’authentification chiffrée, la clé et le certificat.
VirtualHost "serverxmpp.domain.local"
        enabled = true
        authentication = "internal_hashed"
        -- Assign this host a certificate for TLS, otherwise it would use the one
        -- set in the global section (if any).
        -- Note that old-style SSL on port 5223 only supports one certificate, and will always
        -- use the global one.
        ssl = {
                key = "/etc/prosody/certs/serverxmpp.domain.local.key";
                certificate = "/etc/prosody/certs/serverxmpp.domain.local.cert";
        }

Une fois ces paramètres définis nous pourrons sauvegarder le fichier de configuration, le recharger et redémarrer le service Prosody.

/etc/init.d/prosody reload
[ ok ] Reloading prosody configuration (via systemctl): prosody.service.

/etc/init.d/prosody restart
[ ok ] Restarting prosody (via systemctl): prosody.service.

Nous créerons ensuite les utilisateurs:

prosodyctl adduser remi@serverxmpp.domain.local
prosodyctl adduser directeur@serverxmpp.domain.local

 

Connexion des utilisateurs et ajout de contact.

Le protocole XMPP étant libre, il existe de nombreux clients pour s’y connecter. Le plus connu est sans doute Pidgin (https://www.pidgin.im/).

Nous utiliserons ce logiciel.

Pour ce faire, nous irons dans le menu « Comptes » > « Gérer les comptes ».

Puis, nous choisirons d’ajouter en cliquant sur le bouton « Ajouter » de la fenêtre  de gestion des comptes.

Nous définirons les options comme ceci:

Dans l’onglet « Essentiel »:

  • Protocole: XMPP
  • Utilisateur: nom de l’utilisateur que vous avez créé, ici « remi » pour le compte remi@sverxmpp@domain.local.
  • Domaine: le nom DNS défini dans le virtual host
  • Mot de passe: votre mot de passe que vous pouvez choisir d’enregistrer ou non.

Dans l’onglet « Avancé »:

  • Sécurité de la connexion: Nécessite chiffrement
  • Serveur de connexion: l’adresse DNS de votre serveur, ici serverxmpp.domain.local

Pour terminer la configuration du compte nous cliquerons sur « Ajouter », puis l’écran d’acceptation du certificat apparaîtra. Nous accepterons ce dernier.

Pour ajouter un contact nous irons dans le menu « Contacts »> »Ajouter un contact ».

Nous donnerons alors l’adresse XMPP de notre contact, un alias pour mieux le reconnaître et nous pourrons même le trier dans un groupe de contacts.

Le contact recevra alors une proposition d’ajout de contact qu’il pourra accepter.

Les contacts seront alors visibles et déjà triés dans les groupes sous cette forme:

 

Ajout d’un virtualhost.

Comme indiqué dans le schéma au début de cet article, il est tout à fait possible de créer un virtualhost supplémentaire et ainsi segmenter les contacts selon les besoins.
Pour cela nous commencerons par créer les certificats (comme ci dessus) pour le nouveau domaine DNS.

openssl genrsa -out /etc/prosody/certs/im.intranet.local.key 2048

Generating RSA private key, 2048 bit long modulus
..............................................+++
.....+++
e is 65537 (0x010001)
openssl req -new -x509 -key /etc/prosody/certs/im.intranet.local.key -out /etc/prosody/certs/im.intranet.local.cert -days 365

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:fr
State or Province Name (full name) [Some-State]:Deux Servres
Locality Name (eg, city) []:Niort
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Demo Company
Organizational Unit Name (eg, section) []:Service Info
Common Name (e.g. server FQDN or YOUR name) []:intranet.local
Email Address []:adminxmpp@domain.fr

Puis nous éditerons le fichier de configuration « /etc/prosody/prosody.cfg.lua »:

nano /etc/prosody/prosody.cfg.lua

Nous rajouterons sous notre premier bloc de virtualhost notre deuxième « zone »:

VirtualHost "im.intranet.local"
  enabled = true
  c2s_require_encryption = true
        authentication = "internal_hashed"
        -- Assign this host a certificate for TLS, otherwise it would use the one
        -- set in the global section (if any).
        -- Note that old-style SSL on port 5223 only supports one certificate, and will always
        -- use the global one.
        ssl = {
                key = "/etc/prosody/certs/im.intranet.local.key";
                certificate = "/etc/prosody/certs/im.intranet.local.cert";
        }

Une fois ces paramètres définis nous pourrons sauvegarder le fichier de configuration, le recharger et redémarrer le service Prosody.

/etc/init.d/prosody reload
[ ok ] Reloading prosody configuration (via systemctl): prosody.service.

/etc/init.d/prosody restart
[ ok ] Restarting prosody (via systemctl): prosody.service.

Nous créerons ensuite l’utilisateur:

prosodyctl adduser agent@im.intranet.local

Cet utilisateur pourra rajouter n’importe quels autres utilisateurs du serveur même si ce dernier n’est pas dans la même zone DNS.
Cela peut être pratique lorsque vous êtes sur une infrastructure multi-site et que vous souhaitez conserver le nom DNS de chaques sites dans vos contacts Prosody.

La logique de configuration et d’administration du deuxième virtualhost ne diffère pas du premier.
Nous connecterons également les utilisateurs de cette nouvelle zone de la même manière, seul le FQDN du serveur sera modifié, à savoir: im.intranet.local.

Mise en place d’une chatroom.

Afin de pouvoir dialoguer à plusieurs, nous avons la possibilité de créer une « chatroom » ou MUC.

Pour cela nous suivrons le même chemin que pour créer un virtualhost à savoir, créer une clé RSA et un certificat.

openssl genrsa -out /etc/prosody/certs/chatroom.domain.local.key 2048
openssl req -new -x509 -key /etc/prosody/certs/serverxmpp.domain.local.key -out /etc/prosody/certs/serverxmpp.domain.local.cert -days 365

Puis dans le fichier de configuration /etc/prosody/prosody.cfg.lua nous rajouterons les lignes suivantes à la fin du fichier:

Component "chatroom.domain.local" "muc"
  name = "Chatroom Domain.local"
  restrict_room_creation = true 
   ssl = {
                key = "/etc/prosody/certs/chatroom.domain.local.key";
                certificate = "/etc/prosody/certs/chatroom.domain.local.cert";
        }

Puis nous redémarrerons les services prosody.

/etc/init.d/prosody reload
[ ok ] Reloading prosody configuration (via systemctl): prosody.service.

/etc/init.d/prosody restart
[ ok ] Restarting prosody (via systemctl): prosody.service.

Ensuite nous pourrons connecter le client Pidgin à la chatroom.
Pour cela nous irons dans « Contacts »,  puis « Rejoindre une discussion… ».

Nous indiquerons le serveur de salle de discussion « chatroom.domain.local », puis nous cliquerons sur le bouton « Chercher un salon de discussions ».

La chatroom apparaîtra dans la liste, il nous suffira de cliquer dessus pour la rejoindre.

 

La chatroom sera toujours disponible dans la liste des contacts sous la forme suivante:

 

Pour aller plus loin.

Nous pourrons également jouer un peu plus avec les DNS pour obtenir une messagerie instantanée directement connectable depuis internet suivant le schéma suivant:

Ils nous faudra alors configurer les enregistrements DNS chez notre fournisseur et un NAT/PAT sur notre pare-feux.

Exemple de fichier de configuration.

Ci dessous vous trouverez le fichier de configuration /etc/prosody/prosody.cfg.lua obtenu après avoir suivi cet article.

-- Prosody Example Configuration File
--
-- Information on configuring Prosody can be found on our
-- website at http://prosody.im/doc/configure
--
-- Tip: You can check that the syntax of this file is correct
-- when you have finished by running: luac -p prosody.cfg.lua
-- If there are any errors, it will let you know what and where
-- they are, otherwise it will keep quiet.
--
-- The only thing left to do is rename this file to remove the .dist ending, and fill in the
-- blanks. Good luck, and happy Jabbering!


---------- Server-wide settings ----------
-- Settings in this section apply to the whole server and are the default settings
-- for any virtual hosts

-- This is a (by default, empty) list of accounts that are admins
-- for the server. Note that you must create the accounts separately
-- (see http://prosody.im/doc/creating_accounts for info)
-- Example: admins = { "user1@example.com", "user2@example.net" }
admins = {"remi@serverxmpp.domain.local"}

-- Enable use of libevent for better performance under high load
-- For more information see: http://prosody.im/doc/libevent
--use_libevent = true;

-- This is the list of modules Prosody will load on startup.
-- It looks for mod_modulename.lua in the plugins folder, so make sure that exists too.
-- Documentation on modules can be found at: http://prosody.im/doc/modules
modules_enabled = {

  -- Generally required
    "roster"; -- Allow users to have a roster. Recommended ;)
    "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
    "tls"; -- Add support for secure TLS on c2s/s2s connections
    "dialback"; -- s2s dialback support
    "disco"; -- Service discovery

  -- Not essential, but recommended
    "private"; -- Private XML storage (for room bookmarks, etc.)
    "vcard"; -- Allow users to set vCards
  
  -- These are commented by default as they have a performance impact
    --"privacy"; -- Support privacy lists
    --"compression"; -- Stream compression (Debian: requires lua-zlib module to work)

  -- Nice to have
    "version"; -- Replies to server version requests
    "uptime"; -- Report how long server has been running
    "time"; -- Let others know the time here on this server
    "ping"; -- Replies to XMPP pings with pongs
    "pep"; -- Enables users to publish their mood, activity, playing music and more
    "register"; -- Allow users to register on this server using a client and change passwords

  -- Admin interfaces
    "admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
    --"admin_telnet"; -- Opens telnet console interface on localhost port 5582
  
  -- HTTP modules
    --"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
    --"http_files"; -- Serve static files from a directory over HTTP

  -- Other specific functionality
    "posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
    --"groups"; -- Shared roster support
    --"announce"; -- Send announcement to all online users
    --"welcome"; -- Welcome users who register accounts
    --"watchregistrations"; -- Alert admins of registrations
    --"motd"; -- Send a message to users when they log in
    --"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
};

-- These modules are auto-loaded, but should you want
-- to disable them then uncomment them here:
modules_disabled = {
  -- "offline"; -- Store offline messages
  -- "c2s"; -- Handle client connections
  -- "s2s"; -- Handle server-to-server connections
};

-- Disable account creation by default, for security
-- For more information see http://prosody.im/doc/creating_accounts
allow_registration = false;

-- Debian:
--   send the server to background.
--
daemonize = true;

-- Debian:
--   Please, don't change this option since /var/run/prosody/
--   is one of the few directories Prosody is allowed to write to
--
pidfile = "/var/run/prosody/prosody.pid";

-- These are the SSL/TLS-related settings. If you don't want
-- to use SSL/TLS, you may comment or remove this
--ssl = {
--	key = "/etc/prosody/certs/localhost.key";
--	certificate = "/etc/prosody/certs/localhost.crt";
--}

-- Force clients to use encrypted connections? This option will
-- prevent clients from authenticating unless they are using encryption.

c2s_require_encryption = true

-- Force certificate authentication for server-to-server connections?
-- This provides ideal security, but requires servers you communicate
-- with to support encryption AND present valid, trusted certificates.
-- NOTE: Your version of LuaSec must support certificate verification!
-- For more information see http://prosody.im/doc/s2s#security

s2s_secure_auth = false

-- Many servers don't support encryption or have invalid or self-signed
-- certificates. You can list domains here that will not be required to
-- authenticate using certificates. They will be authenticated using DNS.

--s2s_insecure_domains = { "gmail.com" }

-- Even if you leave s2s_secure_auth disabled, you can still require valid
-- certificates for some domains by specifying a list here.

--s2s_secure_domains = { "jabber.org" }

-- Select the authentication backend to use. The 'internal' providers
-- use Prosody's configured data storage to store the authentication data.
-- To allow Prosody to offer secure authentication mechanisms to clients, the
-- default provider stores passwords in plaintext. If you do not trust your
-- server please see http://prosody.im/doc/modules/mod_auth_internal_hashed
-- for information about using the hashed backend.

-- authentication = "internal_plain"

-- Select the storage backend to use. By default Prosody uses flat files
-- in its configured data directory, but it also supports more backends
-- through modules. An "sql" backend is included by default, but requires
-- additional dependencies. See http://prosody.im/doc/storage for more info.

--storage = "sql" -- Default is "internal" (Debian: "sql" requires one of the
-- lua-dbi-sqlite3, lua-dbi-mysql or lua-dbi-postgresql packages to work)

-- For the "sql" backend, you can uncomment *one* of the below to configure:
--sql = { driver = "SQLite3", database = "prosody.sqlite" } -- Default. 'database' is the filename.
--sql = { driver = "MySQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }
--sql = { driver = "PostgreSQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }

-- Logging configuration
-- For advanced logging see http://prosody.im/doc/logging
--
-- Debian:
--  Logs info and higher to /var/log
--  Logs errors to syslog also
log = {
  -- Log files (change 'info' to 'debug' for debug logs):
  info = "/var/log/prosody/prosody.log";
  error = "/var/log/prosody/prosody.err";
  -- Syslog:
  { levels = { "error" }; to = "syslog";  };
}

----------- Virtual hosts -----------
-- You need to add a VirtualHost entry for each domain you wish Prosody to serve.
-- Settings under each VirtualHost entry apply *only* to that host.

VirtualHost "serverxmpp.domain.local"
  enabled = true
  authentication = "internal_hashed"
  -- Assign this host a certificate for TLS, otherwise it would use the one
  -- set in the global section (if any).
  -- Note that old-style SSL on port 5223 only supports one certificate, and will always
  -- use the global one.
  ssl = {
    key = "/etc/prosody/certs/serverxmpp.domain.local.key";
    certificate = "/etc/prosody/certs/serverxmpp.domain.local.cert";
  }

VirtualHost "im.intranet.local"
  enabled = true
  c2s_require_encryption = true
        authentication = "internal_hashed"
        -- Assign this host a certificate for TLS, otherwise it would use the one
        -- set in the global section (if any).
        -- Note that old-style SSL on port 5223 only supports one certificate, and will always
        -- use the global one.
        ssl = {
                key = "/etc/prosody/certs/im.intranet.local.key";
                certificate = "/etc/prosody/certs/im.intranet.local.cert";
        }

------ Components ------
-- You can specify components to add hosts that provide special services,
-- like multi-user conferences, and transports.
-- For more information on components, see http://prosody.im/doc/components

---Set up a MUC (multi-user chat) room server on conference.example.com:
--Component "conference.example.com" "muc"
Component "chatroom.domain.local" "muc"
  name = "Chatroom Domain.local"
  restrict_room_creation = true 
   ssl = {
                key = "/etc/prosody/certs/chatroom.domain.local.key";
                certificate = "/etc/prosody/certs/chatroom.domain.local.cert";
        }
-- Set up a SOCKS5 bytestream proxy for server-proxied file transfers:
--Component "proxy.example.com" "proxy65"

---Set up an external component (default component port is 5347)
--
-- External components allow adding various services, such as gateways/
-- transports to other networks like ICQ, MSN and Yahoo. For more info
-- see: http://prosody.im/doc/components#adding_an_external_component
--
--Component "gateway.example.com"
--	component_secret = "password"

------ Additional config files ------
-- For organizational purposes you may prefer to add VirtualHost and
-- Component definitions in their own config files. This line includes
-- all config files in /etc/prosody/conf.d/

Include "conf.d/*.cfg.lua"

 

 

Categories:

Comments are closed