Configurar un servidor de mensajería instantánea XMPP (Prosody 0.11)

Esta guía no es un trabajo de la comunidad elbinario, sino que nos ha llegado por distintos medios (email,xmpp) indicándonos que ha sido un trabajo realizado en el evento XMPP Sprint en Dusseldorf, y después de pedir permiso a las personas que la han realizado para obtenerla y publicarla, hemos decidido replicarla, puesto que nuestra anterior guía de configuración xmpp estaba bastante desactualizada, y consideramos necesario difundir este trabajo de documentación y actualización, cuyo original podrás encontrar aquí

Introducción

Esta es una guía para configurar un servidor de mensajería instantánea basado en XMPP moderno, enfocado a la seguridad, mensajería móvil y fácil de usar. La guía asume que usas ‘Debian Stable’ en el servidor, que quieres alojar y administrar la mensajería instantánea para tu grupo de amigos y que tienes conocimiento básico de usar la línea de comandos en Linux.

Firewall y DNS

Abre los siguientes puertos en tu firewall para poder comunicarte con el servidor:

5000 (hacer de proxy para intercambiar archivos grandes entre clientes)
5222 (para comunicación entre cliente y servidor, C2S)
5269 (para comunicación entre servidores, S2S)
5281 (el puerto https por defecto de prosody)

También asegúrate de que tienes un dominio con DNS A-records para los siguientes subdominios

myserver.org (el dominio principal)
muc.myserver.org (para sala de grupos)
dump.myserver.org (para componente HTTP-Upload)
proxy.myserver.org (para el proxy de transferencia de archivos)

Esta guía usa los dominios escritos arriba, pero puedes ser más creativo :)

Habilitar HTTPS

Primero, conseguimos un certificado HTTPS firmado por Let’s Encrypt:

Se necesita para un servidor XMPP moderno, los certificados auto-firmados no funcionarán.

Instala Certbot:

sudo apt-get update && sudo apt-get install certbot

Si tienes un servidor web funcionando, deberás pararlo antes de ejecutar el comando certbot:

service apache2 stop # En el caso de tener apache
service nginx stop # En en caso de tener nginx

Consigue los certificados para tu dominio (reemplaza myserver.org por el tuyo):

certbot certonly -d myserver.org -d muc.myserver.org -d dump.myserver.org -d proxy.myserver.org

Si funciona, deberías poder ver algo así:

Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/myserver.org/fullchain.pem. Your cert will expire on 2019-02-15. 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»

Instalar y configurar Prosody, el servidor XMPP

Instala la version Prosody 0.11 y sus dependencias desde el repositorio oficial de Prosody:

echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list
wget https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add -
sudo apt-get update && sudo apt-get install prosody lua-sec

Instala los plugins más recientes de Prosody:

apt-get install mercurial 
cd /usr/src
hg clone https://hg.prosody.im/prosody-modules/ prosody-modules

Haz una copia de seguridad de la configuración de Prosody por defecto e instala la de homebrewserver.club

cd /etc/prosody
cp prosody.cfg.lua prosody.cfg.lua.original
wget https://homebrewserver.club/downloads/prosody.0.11.cfg.lua -O prosody.cfg.lua

La configuración de homebrewserver.club

-- una configuración de prosody enfocado a la seguridad, mensajería móvil y fácil de usar.
-- proporcionada por homebrewserver.club 
-- el archivo de la configuración original(prosody.cfg.lua.original) tendrá mas información

plugin_paths = { "/usr/src/prosody-modules" } 

-- el directorio de los plugin no estándar para mantenerlos al dia con mercurial

modules_enabled = { "roster"; -- Permite a los usuarios tener una lista de contactos. Recomendado ;) 
                    "saslauth"; -- Autenticación entre clientes y servidores. Recomendado si quieres iniciar sesión. 
                    "tls"; -- Permite conexiones c2s/s2s seguras con TLS 
                    "dialback"; -- Permite s2s dialback 
                    "disco"; -- Descubrir servicios entre servidores y clientes 
                    "private"; -- Almacenamiento XML privado (para guardar las salas a las que te has unido) 
                    "vcard4"; -- Perfiles de usuarios (guardado en PEP) 
                    "vcard_legacy"; -- Convierte entre legacy vCard y PEP Avatar, vcard 
                    "version"; -- Contesta a las peticiones de la versión del servidor 
                    "uptime"; -- Informa sobre cuánto tiempo ha estado funcionando el servidor 
                    "time"; -- Permite conocer la hora en el servidor 
                    "ping"; -- Contesta XMPP pings con pongs 
                    "register"; --Permite registrar una cuenta en tu servidor desde un cliente 
                    "pep"; -- Entre otras cosas, permite a usuarios publicar sus claves OMEMO publicas 
                    "carbons"; -- XEP-0280: Message Carbons, sincroniza mensajes entre dispositivos 
                    "smacks"; -- XEP-0198: Stream Management, mantiene conversaciones incluso cuando la red se cae 
                    "mam"; -- XEP-0313: Message Archive Management, permite descargar el historial de conversaciones del servidor 
                    "csi_simple"; -- XEP-0352: Client State Indication 
                    "admin_adhoc"; -- Permite la administración del servidor desde un cliente XMPP (que soporte comandos ad-hoc) 
                    "blocklist"; -- XEP-0191 bloquear usuarios 
                    "bookmarks"; -- Sincroniza entre clientes diferentes las salas a las que te has unido 
                    --"cloud_notify"; -- Soporta XEP-0357 Push Notifications para tener compatibilidad con ChatSecure/iOS. 
                    -- iOS normalmente aborta la conexión cuando una aplicación funciona en segundo plano y requiere el uso de los servidores de Push de Apple 
                    -- para levantar la conexión y recibir un mensaje. 
                    -- Habilitar este módulo permite a tu servidor comunicarse con los servidores Push de Apple para ayudar a tus usuarios de iOS. 
                    -- Sin embargo, lo dejamos comentado porque es otro ejemplo de una plataforma cloud integrada verticalmente 
                    -- que choca con las ideas de federación y las redes libres.
                    -- Descomentarlo tiene riesgo de vigilancia de los meta dados de tus usuarios por Apple. 
                    "server_contact_info"; -- Añade información de contacto en caso de incidencias con el servidor 
};

allow_registration = false; -- Permite registrar una cuenta en tu servidor desde un cliente, para más información visita http://prosody.im/doc/creating_accounts
certificates = "/etc/prosody/certs" -- Ruta donde Prosody busca los certificados: https://prosody.im/doc/letsencrypt 
https_certificate = "certs/myserver.org.crt"
c2s_require_encryption = true -- Fuerza a los clientes a usar conexiones cifradas
s2s_secure_auth = true -- Fuerza la autenticación de certificados para conexiones entre servidores
pidfile = "/var/run/prosody/prosody.pid"
authentication = "internal_hashed"

-- Historial de conversaciones 
-- Si mod_mam esta activo, Prosody guardara una copia de cada mensaje. 
-- Se usa para sincronizar conversaciones entre múltiples clientes, incluso si están desconectados. 
-- Esta configuración controla cuanto tiempo Prosody guarda los mensajes en el historial antes de eliminarlos.

archive_expires_after = "1w" -- Eliminar el historial de mensajes en una semana

log = { -- descomenta para mayor privacidad 
      info = "/var/log/prosody/prosody.log"; -- Cambia 'info' por 'debug' para un registro más detallado 
      error = "/var/log/prosody/prosody.err"; 
      "*syslog"; 
}

VirtualHost "myserver.org"

-- Habilita http_upload para permitir compartir imágenes entre diferentes dispositivos y diferentes clientes 
Component "dump.myserver.org" "http_upload"

-- Permite crear salas 
Component "muc.myserver.org" "muc" modules_enabled = { "muc_mam", "vcard_muc" }

-- Inicia un proxy para intercambiar archivos grandes entre clientes 
Component "proxy.myserver.org" "proxy65"

Reemplaza el dominio de ejemplo con tu dominio en el archivo de configuración:

sed -i 's/myserver.org/tu dominio/g' prosody.cfg.lua

De forma alternativa puedes reemplazarlos a mano. Están en las líneas 39, 75, 81, 85 de prosody.cfg.lua

Importa los certificados de LetsEncrypt con Prosody:

prosodyctl --root cert import /etc/letsencrypt/live

Es posible que recibas un resultado similar:

No certificate for host muc.myserver.org found :( No certificate for host dump.myserver.org found :( No certificate for host proxy.myserver.org found :( Imported certificate and key for hosts myserver.org

Pero no te preocupes, el último certificado contiene información de todos los subdominios.

Para acabar

Configura cron para renovar los certificados LetsEncrypt automáticamente:

sudo crontab -e 

Añade al final:

:::console 
0 4 0 * 0 /usr/bin/certbot renew --renew-hook "prosodyctl --root cert import /etc/letsencrypt/live" --quiet

Esta configuración comprueba y renueva los certificados cada domingo a las 04:00.

Cuando hayas hecho todo esto es hora de arrancar el servidor:

/etc/init.d/prosody restart

Se pueden añadir usuarios desde la línea de comandos. Te pedirá una contraseña:

prosodyctl adduser me@myserver.org

De otra forma puedes cambiar

allow_registration = false; a allow_registration = true;

en la configuración (linea 35) para permitir a los usuarios registrarse en tu servidor desde sus propios clientes.

Ahora puedes intentar conectarte a tu servidor usando un cliente como Gajim o Conversations. Inicia sesión con tu usuario y contraseña.

Si tienes preguntas sobre Prosody, la documentación del proyecto es bastante buena (pero en Inglés). Si eso no es suficiente, pregunta a los mismos desarrolladores en la sala XMPP de Prosody

Esta guía es una traducción de la guía del homebrewserver.club.)

Compartir

4 Comentarios

  1. También asegúrate de que tienes un dominio con DNS A-records para los siguientes subdominios…

    No se que hacer en este paso, tengo el servidor y el dominio en sitio distintos y no se como configurar el DNS del dominio (dondominio) para para que me lo dirija al servidor.

    ¿Alguien me echa una mano?

Deja una respuesta

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax