Title: Configurar un servidor de mensajería instantánea XMPP seguro, para mensajería móvil y fácil de usar
Date: 2018-11-17
Tags: xmpp, chat, guide, instant messaging, prosody
Slug: configuring-a-modern-xmpp-server
Description: Hands-on step-by-step guide that shows how to configure Prosody 0.11 aimed at security, mobile messaging, rich features and ease of use.
Lang: es
Category: instant messaging

[TOC]

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:

    :::console
    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

    :::console
    myserver.org (el dominio principal)
    groups.myserver.org (para sala de grupos)
    upload.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](https://letsencrypt.org/):

Se necesita para XMPP moderno, certificados auto-firmados no funcionaran.

Instala Certbot y consigue los certificados para tu dominio (reemplaza `myserver.org` por el tuyo):

    :::console
    sudo apt-get update && sudo apt-get install certbot
    certbot certonly -d myserver.org
    certbot certonly -d groups.myserver.org
    certbot certonly -d upload.myserver.org
    certbot certonly -d proxy.myserver.org

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

    :::console
    - 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:

    :::console
    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:

    :::console
    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](https://homebrewserver.club/downloads/prosody.0.11.cfg.lua)

    :::console
    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
---

    :::console
    -- 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 conversasiones 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 un 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";
    }

    disco_items = { -- allows clients to find the capabilities of your server
        {"upload.myserver.org", "file uploads"};
        {"groups.myserver.org", "group chats"};
    }

    VirtualHost "myserver.org"

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

    -- Permite crear salas
    Component "groups.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:

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

De forma alternativa puedes reemplazarlos a mano. Estan en las lineas 70, 81, 84, 88, 91 de prosody.cfg.lua

Importa los certificados de LetsEncrypt con Prosody:

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

Es posible que recibas un resultado similar:

    No certificate for host groups.myserver.org found :(
    No certificate for host upload.myserver.org found :(
    No certificate for host proxy.myserver.org found :(
    Imported certificate and key for hosts myserver.org

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

Para acabar
---

Configura `cron` para renovar los certificados LetsEncrypt automáticamente

    :::console
    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:

    :::console
    /etc/init.d/prosody restart

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

    :::console
    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 nombre y contraseña.

Si tienes preguntas sobre Prosody, la [documentación](http://prosody.im/doc) del proyecto es bastante buena (pero en Ingles). Si eso no es suficiente, pregunta los mismos desarrolladores en [la sala XMPP de Prosody](xmpp://prosody.conference.prosody.im?join)

Esta guía es una traducción de la guía del [homebrewserver.club](https://homebrewserver.club/drafts/configuring-a-modern-xmpp-server.html).)
