En las entregas anteriores, las direcciones de correo electrónico sólo estaban disponibles para los usuarios del sistema. Esto puede o no ser buena idea según el ámbito que tenga el sistema de correo electrónico que estemos implementando, pero lo que sí es cierto es que implementar usuarios virtuales es algo prácticamente imprescindible.

Con esta premisa haremos que tanto OpenSMTPd como Dovecot se integren utilizando LMTP junto a un fichero que será el que contenga la lista de usuarios virtuales junto a sus contraseñas.

Configuración

Crear el usuario vmail

Necesitamos a este usuario, que será el que almacene el correo de todos los usuarios virtuales.

mkdir /var/vmail
adduser

Username: vmail
Full name:
Uid (Leave empty for default):
Login group [vmail]:
Login group is vmail. Invite vmail into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: nologin
Home directory [/home/vmail]: /var/vmail
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]: yes
Lock out the account after creation? [no]: yes
Username   : vmail
Password   : <blank>
Full Name  :
Uid        : 1002
Class      :
Groups     : vmail
Home       : /var/vmail
Home Mode  :
Shell      : /usr/sbin/nologin
Locked     : yes
OK? (yes/no): yes
adduser: INFO: Successfully added (vmail) to the user database.
adduser: INFO: Account (vmail) is locked.
Add another user? (yes/no): no
Goodbye!

Y le damos la propiedad de su directorio $HOME.

chown -R vmail:vmail /var/vmail

Configurar LMTP para OpenSMTPd

Necesitamos instalar una extensión de OpenSMTPd que le permite utilizar el fichero de usuario y contraseña que mencionamos más arriba.

pkg install -y opensmtp-extras-table-passwd

Editamos /usr/local/etc/mail/smtpd.conf para incluirlo.

table passwd passwd:/etc/mail/passwd
table virtuals file:/etc/mail/virtuals

Además de redirigir local que gestiona el correo entrante para enviarlo a LMTP que utilizará estos ficheros para comprobar la validez de estos usuarios virtuales como destino.

action "local" lmtp "/var/run/dovecot/lmtp" rcpt-to virtual <virtuals>

Y también necesitmos cambiar la autenticación para que utilice el fichero passwd que vamos a utilizar.

listen on lo1 smtps pki mail.correo.com auth <passwd>
listen on lo1 port submission tls-require pki mail.correo.com auth <passwd>

Nos falta el alias para vmail editando /etc/mail/aliases.

vmail: /dev/null

Configurar LMTP para Dovecot

Ahora le llega el turno a Dovecot. Necesitamos una réplica de las configuraciones anteriores, pero para que las utilice este último.

Cambiamos la autenticación editando /usr/local/etc/dovecot/conf.d/10-auth.conf.

#!include auth-system.conf.ext
!include auth-passwdfile.conf.ext

Cambiamos las fuentes de usuario y contraseña en /usr/local/etc/dovecot/conf.d/auth-passwdfile.conf.ext.

passdb {
  driver = passwd-file
  args = scheme=CRYPT /etc/mail/passwd
}

userdb {
  driver = static 
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n

  # Default fields that can be overridden by passwd-file
  #default_fields = quota_rule=*:storage=1G

  # Override fields from passwd-file
  #override_fields = home=/home/virtual/%u
}

Recogida de correo en /usr/local/etc/dovecot/conf.d/10-mail.conf.

mail_location = maildir:/var/vmail/%d/%n

Aquí se generará una estructura jerárquica dentro de /var/vmail con la siguiente estructura.

/var/vmail
├── dominio1
│   ├── usuario1
├── dominio2
│   ├── usuario1

Crear usuarios virtuales

El fichero /etc/mail/passwd tiene el formato siguiente.

usuario@dominio.correo:la contraseña enciptada va aquí::::::

Así que necesitamos generar las contraseñas de los usuarios. Para ello.

smtpctl encrypt

A lo que silenciosamente se nos pedirá el texto plano con la contraseña.

supersecreta
$6$eXaww4eIZKR9711q$lM0HOy.W1dAvUscZ1pB9H1odNqZCJA8G3rvIoVSxhe3SIltI5iask.xWXJKkS0vsJXBK6ucRn4TxAzaEveH6U1

Este último hash, en este caso SHA512, es el que introduciremos para el usuario virtual.

Por último, necesitamos mapearlo al usuario vmail para que el correo se entregue en su buzón. Editamos /etc/mail/virtuals.

usuario@dominio.correo vmail

Reiniciar los demonios

service restart opensmtpd
service restart dovecot

Pruebas

Ahora podemos configurar nuestro cliente de correo y utilizar estas credenciales para hacer algunas pruebas enviando y recibiendo correos electrónicos con el.

Conclusiones

Junto a los otras dos entradas ya publicadas, ésta cierra el core de la implementación de un servidor de correo electrónico. Es obvio que faltan asuntos como la securización, DKIM, DMARC, tratamiento de spam, greylisting, webmail, etc… Esto ya se sale de la funcionalidad básica pero es posible que trate algunos de ellos en futuras entradas.