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/modules
donde 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_ldap
como 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.