Ya he tenido que hacerlo en tres instalaciones: una en mi lugar de trabajo, otra en mis servidores personales y otra en los de una amiga.
En todos los casos pretendo conseguir lo siguiente:
- Cuentas XMPP para todos los usuarios del dominio.
- Conexiones seguras entre el servidor, los clientes y otros servidores.
- Conservación de datos (conversaciones, datos de usuario, …) en un servidor SQL.
Antes de proceder nos aseguramos de tener funcionando estos servicios:
- Servidor LDAP con un árbol de entradas para los usuarios.
- Servidor SQL donde podamos crear una cuenta y una base de datos.
- Certificados digitales para el dominio instalados y activos.
Y, dado que estamos en Debian, versión Jessie en el momento de escribir ésto, podemos emplear la versión de prosody de sus repositorios. Así pues, sólo necesitamos realizar lo siguiente:
- Instalar el paquete prosody.
- Instalar el complemento mod_auth_ldap:
- Crear un directorio especial para modulos locales /usr/local/lib/prosody/modulesdonde situar el archivo .lua correspondiente.
- Indicar a prosody que busque allí otros módulos añadiendo plugin_paths = { "/usr/local/lib/prosody/modules" }a su configuración.
- Declarar el módulo auth_ldapcomo activo en la configuración.
 
- Crear un directorio especial para modulos locales 
- Configurar el servidor para que use lo anterior, entre otros aspectos.
Configuración
El archivo principal de configuración está en /etc/prosody y se llama prosody.cfg.lua. He realizado pocas modificaciones en el mismo; las más importantes son:
-- Identificación de usuarios vía LDAP
-- Conexión con servidor local, sin cifrado,
-- e intentando acceso con contraseña para validar
-- usuarios en lugar de buscarlos (bind mode)
authentication = "ldap"
anonymous_login = false
ldap_base       = "ou=users,dc=empresa,dc=net"
ldap_server     = "localhost"
ldap_filter     = "(uid=$user)"
ldap_tls        = false
ldap_mode       = "bind"
-- Almacenamiento en servidor MySQL, conexión
-- local y sin cifrado. Necesario el paquete 
-- lua-dbi-mysql y lo siguiente, incluyendo la
-- autorización para gestionar tablas si no 
-- existen
storage = "sql"
sql_manage_tables = true
sql = { driver = "MySQL", 
        database = "prosody", 
        username = "prosody", 
        password = "XXXXXXXX", 
       host = "localhost" }
-- Definimos el servidor virtual XMPP y los 
-- certificados que puede obtener del sistema
VirtualHost "empresa.net"
        enabled = true -- Remove this line to enable this host
        ssl = { 
                key = "/etc/letsencrypt.sh/certs/empresa.net/privkey.pem";
                certificate = "/etc/letsencrypt.sh/certs/empresa.net/fullchain.pem";
        }
Aspectos a tener en cuenta:
- Los certificados digitales están creados y mantenidos por programas cliente para el proyecto Let’s Encrypt y sólo hay que tener en cuenta dos cosas:
- Es obligatorio que ambos archivos sean accesibles al usuario bajo el que funciona prosody. Lo mejor es asignarlos a un grupo concreto y hacer que esa cuenta pertenezca a él.
- Cada vez que los certificados son renovados es necesario reiniciar el servidor (o que releea su configuración según versión).
 
- Los servidores LDAP y MySQL están configurados para aceptar conexiones en claro sobre el interfaz local. Si se encuentran en otra máquina conviene asegurar la comunicación con cifrado.
