3. Configuración simplificada con usuarios virtuales

En este modo de configuración se utilizarán ficheros de texto para gestionar las cuentas de correo, contraseñas y ubicación de los buzones (en formato Maildir) de cada usuario de correo electrónico.

La configuración se realizará de la siguiente forma:

  1. Se usará un único usuario de sistema «vmail» y en su directorio home estarán todos los Maildirs de las cuentas de correo.

  2. El listado de cuentas de correo electrónico estarán en un fichero de texto.

  3. La autenticación de Exim4 y Dovecot se realizará contra ese mismo fichero, compartido entre los dos programas.

3.1. Ficheros: usuarios virtuales y dominios

En primer lugar toda la configuración se basa en tener un único usuario del sistema llamado «vmail» y con él, funcionará todo el servidor de correo. Para crearlo los comandos serían:

adduser --disabled-login --disabled-password vmail

Ahora, el listado de cuentas de correo estará en un fichero de usuarios, usando el mismo formato que el de Linux /etc/passwd. Este formato consiste en que los datos de cada usuario están en una línea, y cada línea tiene multiples campos separados por «:», concretamente el formato es:

user:password:uid:gid:(gecos):home:(shell):extra_fields

Tanto Dovecot como Exim4 son capaces de leer este tipo de ficheros para extraer los datos de usuario. Este fichero con los usuarios virtuales será /etc/exim4/virtual-users, y del fichero se usarán, de cada línea, los campos 1,2 y 5, que corresponden a «user», «passwd» y «home» respectivamente. Para generar el fichero solo hay que editarlo añadiendo cuentas de correo y generando el Hash de las claves con el siguiente comando:

openssl passwd -1 1234
$1$xyz$2ZMGVni83Z6eFAdInvJuE/

Nota

Si se desea mayor seguridad, también se puede usar openssl passwd -6 para usar la función Hash SHA256.

A continuación muestro un ejemplo de contenido del fichero de correos virtuales con la clave «1234», y así, poder hacer pruebas de conexión posteriormente. Uso un par de dominios, pero uno de ellos es ficticio.

Fichero /etc/exim4/virtual-users
prueba@profesor.tai:$1$bL0vc3F2$JvSkNtvGkAsLOzH1F0BlG/:65534:65534:,,,:/home/vmail/profesor.tai/prueba@profesor.tai
info@art-website.com:$1$xyz$2ZMGVni83Z6eFAdInvJuE/:65534:65534:,,,:/home/vmail/art-website.com/info@art-website.com

Advertencia

Los campos «uid» y «gid» se pueden rellenar con cualquier número menos «0», ya que el sistema de autenticación detectaría un intento de escalado de privilegios y denegaría el acceso.

Ambos campos no se usan en esta configuración y serán reemplazados por el «uid» y «gid» del usuario del sistema «vmail».

Ahora hay que crear el segundo fichero con el listado de dominios para los que el servidor aceptará el correo entrante. Estará en otro fichero de texto llamado /etc/exim4/virtual-domains. En este fichero sólo hay que poner cada dominio en una línea. Un ejemplo, concordante con el anterior, sería:

Fichero /etc/exim4/virtual-domains
profesor.tai
art-website.com

3.2. Correo entrante con Exim4

En la sección Configuración dividida en ficheros se creo el fichero 00_exim4_config_custom para establecer las variables de configuración de Exim4. Este fichero se puede usar para establecer el origen del listado de dominios (fichero /etc/exim4/virtual-domains) de la forma indicada:

Fichero /etc/exim4/conf.d/main/00_exim4_config_custom
MAIN_LOCAL_DOMAINS = partial-lsearch;CONFDIR/virtual-domains

Para procesar los correos entrantes se creará un nuevo «router» de Exim4, el cual, buscará el destinatario del correo entrante en el fichero de usuarios virtuales. Estará en el fichero 275_exim4-config_virtual_local_user, está de antes de «300» para que tenga prioridad sobre los usuarios locales del sistema.

virtual_local_user:
    debug_print = "R: virtual_user for $local_part@$domain"
    driver = accept
    domains = +local_domains
    condition = ${lookup{$local_part@$domain}lsearch*@{CONFDIR/virtual-users}}
    transport = virtual_local

Este «router», en caso de cumplirse las condiciones, envía los correos entrantes a ser procesados por el transporte «virtual_local», así que hay que crear un nuevo transporte en el fichero 30_exim4-config_virtual con el siguiente contenido:

virtual_local:
    debug_print = "T: virtual_local for $local_part@$domain"
    driver = appendfile
    # directory= ${extract{5}{:}{${lookup{$local_part@$domain}\
    #                lsearch{CONFDIR/virtual-users}{$value}}}}/\
    #            ${if eq {$h_X-Spam-Flag:}{YES} {.Junk/}}

    directory = ${extract{5}{:}{${lookup{$local_part@$domain}\
                    lsearch{CONFDIR/virtual-users}{$value}}}}
    delivery_date_add
    envelope_to_add
    return_path_add
    maildir_format
    mode = 0660
    mode_fail_narrower = false
    user=vmail
    group=vmail

La parte comentada contiene la condición para colocar el SPAM detectado en la carpeta IMAP Spam, para ello hay que configurar Spamassassin, lo cual se trata en otra parte de este manual.

Para probar la configuración se debe enviar un correo a uno de los usuarios virtuales, revisar el log de Exim4 y comprobar que se ha creado y entregado el correo en la carpeta Maildir correspondiente. Los comandos y la salida debería ser la siguiente:

echo "Hola mundo"  | mail prueba@profesor.tai -s "Primer envío"

tail /var/log/exim4/mainlog

2023-03-20 19:45:05 1peKVF-0000ty-EZ <= root@profesor U=root P=local S=365
2023-03-20 19:45:05 1peKVF-0000ty-EZ => prueba <prueba@profesor.tai> R=virtual_local_user T=virtual_local
2023-03-20 19:45:05 1peKVF-0000ty-EZ Completed

ls -l /home/vmail/profesor.tai/prueba@profesor.tai/new/

total 4
-rw-rw---- 1 vmail vmail 474 mar 20 19:45 1679337905.H458007P3472.profesor

3.3. Correo saliente con Exim4

El siguiente paso es activar la autenticación usando el fichero de usuarios virtuales /etc/exim4/virtual-users con los HASH de las claves. En el directorio /etc/exim4/conf.d/auth/ hay ficheros con ejemplos y con una configuración ya activa. La mejor opción es desactivar este fichero, renombrando de la siguiente forma:

cd /etc/exim4/conf.d/auth
mv 30_exim4-config_examples 30_exim4-config_examples.disabled

Ahora se creará una configuración de autenticación en /etc/exim4/conf.d/auth/30_exim4-auth_vmail con el siguiente contenido:

login_server:
    driver = plaintext
    public_name = LOGIN
    server_prompts = "Username:: : Password::"
    server_condition = "${if crypteq{$auth2}{${extract{1}{:}{${lookup{$auth1}lsearch{CONFDIR/virtual-users}{$value}{*:*}}}}}{1}{0}}"
    server_set_id = $auth1
    .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS
    server_advertise_condition = ${if eq{$tls_in_cipher}{}{}{*}}
    .endif

La configuración de autenticación se puede comprobar mediante línea de comandos siguiendo el siguiente ejemplo. Primero, suponiendo que la clave de «info@art-website.com» está establecida a «1234» hay que codificarla en base 64 para usarla posteriormente:

echo -ne "info@art-website.com" | base64
aW5mb0BhcnQtd2Vic2l0ZS5jb20=
echo -ne "1234" | base64
MTIzNA==

Ahora hay que conectarse localmente usando cifrado (con openssl) e intentar identificarse, reutilizando lo obtenido anteriormente, tal y como se muestra en las líneas resaltadas:

openssl s_client -starttls smtp -connect localhost:25

EHLO prueba.com
AUTH LOGIN
334 VXNlcm5hbWU6
aW5mb0BhcnQtd2Vic2l0ZS5jb20=
334 UGFzc3dvcmQ6
MTIzNA==
235 Authentication succeeded

3.4. Configurando Dovecot

En Debian Dovecot está dividido en múltiples paquetes, ya que es un software muy extenso y modularizado. Para realizar la configuración propuesta en este manual basta con los siguientes:

apt install dovecot-core dovecot-imapd dovecot-pop3d

Del mismo modo que Exim4, la configuración está partida en ficheros ubicados en el directorio /etc/dovecot/conf.d/ y sólo los ficheros que terminan en «.conf» son incluidos desde el principal que es /etc/dovecot/dovecot.conf.

La nueva configuración consistirá en desactivar la autenticación predeterminada incluida desde 10-auth.conf, y añadir una nueva basada en el fichero /etc/exim4/virtual-users en un nuevo fichero /etc/dovecot/conf.d/auth-vmail.conf.ext

Para hacer estos cambios hay que editar el fichero indicado a continuación comentando la inclusión indicada y añadiendo la nueva:

Fichero /etc/dovecot/conf.d/10-auth.conf (Línea 122 aprox.)
#!include auth-system.conf.ext
!include auth-vmail.conf.ext

El contenido del nuevo fichero es el mostrado a continuación:

# Authentication for passwd-file users. Included from 10-auth.conf.

passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/exim4/virtual-users
}

userdb {
  driver = passwd-file
  args = username_format=%u /etc/exim4/virtual-users
  override_fields = uid=vmail gid=vmail
}

Tras los cambios hay que reiniciar dovecot con systemctl restart dovecot y se puede testear la nueva configuración con los siguiente comandos:

doveadm user prueba@profesor.tai

field   value
uid     1001
gid     1001
home    /home/vmail/profesor.tai/prueba@profesor.tai
mail    mbox:~/mail:INBOX=/var/mail/prueba@profesor.tai

doveadm auth login prueba@profesor.tai

3.5. Ajustes de seguridad

El primer ajuste importante es conseguir que sólo Dovecot y Exim4 puedan tener acceso al fichero de usuarios y contraseñas /etc/exim4/virtual-users. Hay que quitar el permiso de lectura global para que sólo lo puedan leer estos dos programas. Una opción es la siguiente:

chmod o-r /etc/exim4/virtual-users
chown Debian-exim:dovecot /etc/exim4/virtual-users

Otro aspecto importante es el cifrado de las conexiones de red. Actualmente es necesario activar SSL/TLS en Dovecot, lo cual se cubre en otra parte de este manual, concretamente Dovecot configuración SSL

3.6. Siguientes pasos

El resto de configuración es similar a la propuesta para Configuración Macro-Servidor:

Advertencia

La configuración del plugin de cambio de contraseña de Roundcube, con el fichero de contraseñas /etc/exim4/virtual-users no está contemplado en este manual.