*************************************** Exim4 con MySQL y usuarios virtuales *************************************** Objetivos: #. Crear un usuario en el sistema para gestionar todo el correo #. Crear una base de datos con varias tablas para toda la gestión de: dominios,cuentas de correos, redirecciones (alias) y secundarios. #. Configurar Exim4 para que haga consultas a la base datos y entregue los correos en carpetas maildir indicadas en la base de datos. Creación del usuario ==================== En primer lugar hay que crear un usuario único del sistema bajo el cual estará todo el correo electrónico del sistema. En mi configuración utilizo *vmail*: .. code:: shell adduser --disabled-login vmail El directorio :file:`/home/vmail` será el directorio base donde se entreguen todos los correos Creación de las tablas MySQL ============================ LLegado aquí, se supone que se tiene instalado el servidor MySQL/MariaDB. Se debe crear una base de datos y usar el siguiente código para crear las 4 tablas: .. literalinclude:: files/tablas.sql :language: sql :caption: Fichero: :download:`tablas.sql` Configuración MySQL en Exim4 ============================ La configuración descrita a continuación supone que tienes el modo de configuración de Exim4 partido en diferentes archivos en */etc/exim4/conf.d* Para establecer algunas variables creo un nuevo fichero con prioridad y que contiene las opciones generales: */etc/exim4/conf.d/main/00_exim4-config_custom* .. code-block:: text :emphasize-lines: 4 # MyPanel configuration for virtual users with Exim4 # MySQL connection hide mysql_servers = localhost/DATABASE_NAME/DB_USER/DB_PASSWORD MYSQL_V_MAILDIR = SELECT maildir FROM mod_exim4_mailboxes WHERE email='${quote_mysql:$local_part@$domain}' MYSQL_V_AUTH_PLAIN = SELECT email FROM mod_exim4_mailboxes WHERE email='${quote_mysql:$2}' and password=sha2('${quote_mysql:$3}',256) MYSQL_V_AUTH_LOGIN = SELECT email FROM mod_exim4_mailboxes WHERE email='${quote_mysql:$1}' and password=sha2('${quote_mysql:$2}',256) MYSQL_V_ALIAS = SELECT destination FROM mod_exim4_alias WHERE alias='${quote_mysql:$local_part@$domain}' MYSQL_V_LOCAL_USER = SELECT email FROM mod_exim4_mailboxes where email='${quote_mysql:$local_part@$domain}' # Primary domains MYSQL_V_DOMAINS = SELECT domain FROM mod_exim4_domains WHERE domain='${quote_mysql:$domain}' # Hosts Relay - Secondary MX records MYSQL_V_RELAY = SELECT domain FROM mod_exim4_relays WHERE domain='${quote_mysql:$domain}' # Get domains from MYSQL queries MAIN_LOCAL_DOMAINS = mysql;MYSQL_V_DOMAINS MAIN_RELAY_TO_DOMAINS = mysql;MYSQL_V_RELAY .. attention:: No te olvides de establecer correctamente el usuario y base de datos en la línea resaltada En las dos últimas líneas de la configuración anterior se ha establecido que Exim4 obtenga los dominos locales y los secundarios de las consultas SQL. Pero para procesar los correos entrantes y, sin entrar en detalles internos sobre el diseño de Exim4, hay que crear dos elementos de configuración nuevos: un *router* y un *transport*. Alias virtuales --------------- El primer router es para los alias y se creará en el directorio/fichero :file:`/etc/exim4/conf.d/router/270_exim4-config_virtual_aliases_mypanel`. Es importante el prefijo *270_* ya que se procesan por orden y quiero que estos tengan preferencia a los usuarios locales y alias del sistema. El fichero sería: .. literalinclude:: files/270_exim4-config_virtual_aliases_mypanel :caption: Fichero: :download:`270_exim4-config_virtual_aliases_mypanel` Correos virtuales ------------------ El segundo router estará en el fichero :file:`/etc/exim4/conf.d/router/275_exim4-config_virtual_local_user_mypanel` y se encarga de buscar las direcciones de correo en la tabla MySQL y en caso de encontrarla procesa el correo con el transporte *virtual_local*: .. literalinclude:: files/275_exim4-config_virtual_local_user_mypanel :caption: Fichero: :download:`275_exim4-config_virtual_local_user_mypanel` :emphasize-lines: 8 El transporte *virtual_local* es el encargado de entregar el correo en la carpeta *maildir* del usuario virtual. Se creará en un nuevo fichero para este transporte: :file:`/etc/exim4/conf.d/transport/30_exim4-config_virtual_mypanel`: .. literalinclude:: files/30_exim4-config_virtual_mypanel :caption: Fichero: :download:`30_exim4-config_virtual_mypanel` :emphasize-lines: 7,8 El transporte está configurado de la siguiente forma: - Se fuerza que los correos se entreguen en una subcarpeta de :file:`/home/vmail`. Con esto las entradas de la base de datos siempre son relativas. - El transporte ya tiene preparada la entrega del spam en la carpeta *SPAM*, solo hay que configurar correctamente Spamassassin posteriormente. Autenticación usuarios virtuales -------------------------------- El siguiente paso es configurar los métodos de autenticación para el envío de correo mediante SMTP. En primer lugar se desactiva la configuración predeterminada renombrando el fichero :file:`/etc/exim4/conf.d/auth/30_exim4-config_examples` del modo indicado: .. code:: shell cd /etc/exim4/conf.d/auth/ mv 30_exim4-config_examples 30_exim4-config_examples.disabled Para configurar la autenticación contra la la base de datos MySQL hay que desactivar la configuración por defecto, por ejemplo renombrando el fichero: Ahora se crea un nuevo fichero :file:`/etc/exim4/conf.d/auth/20_exim4-config_mysql_mypanel` con este contenido: .. literalinclude:: files/20_exim4-config_mysql_mypanel :caption: Fichero: :download:`20_exim4-config_mysql_mypanel` Tras estos cambios se debe comprobar la configuración de Exim4 y reiniciar el servicio: .. code:: shell update-exim4.conf --check systemctl restart exim4 .. TODO: Comentar como hacer los test de esta config.