Servidor Jabber/XMPP con LDAP y certificados Let’s Encrypt

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:

  1. Cuentas XMPP para todos los usuarios del dominio.
  2. Conexiones seguras entre el servidor, los clientes y otros servidores.
  3. Conservación de datos (conversaciones, datos de usuario, …) en un servidor SQL.

Antes de proceder nos aseguramos de tener funcionando estos servicios:

  1. Servidor LDAP con un árbol de entradas para los usuarios.
  2. Servidor SQL donde podamos crear una cuenta y una base de datos.
  3. 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:

  1. Instalar el paquete prosody.
  2. Instalar el complemento mod_auth_ldap:
    1. Crear un directorio especial para modulos locales /usr/local/lib/prosody/modules donde situar el archivo .lua correspondiente.
    2. Indicar a prosody que busque allí otros módulos añadiendo plugin_paths = { "/usr/local/lib/prosody/modules" } a su configuración.
    3. Declarar el módulo auth_ldap como activo en la configuración.
  3. 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:

  1. 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:
    1. 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.
    2. Cada vez que los certificados son renovados es necesario reiniciar el servidor (o que releea su configuración según versión).
  2. 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.