====== Instalación de un servidor de correo ======
Vamos a ver cómo configurar un servidor de correo en linux. Tendremos las siguientes funcionalidades:
* Servidor de correo IMAP con dovecot por SSL
* Servidor SMTP con postfix por TLS mediante STARTTLS
* Gestión de usuarios y dominios virtuales vía web mediante aplicación vmail.
* Aplicación de webmail mediante Roundcubemail
* Filtros de mensajes
* Respuesta automática
* Filtro anti-spam
* y alguna cosa más.
Vamos a asumir que el host se llama `vmail`.
===== Base de datos =====
Si no está instalado, hay que instalar
```
apt install mariadb-server
```
Luego, entrar en el servidor, crear la base de datos y dar permisos
```
root@vmail:~# mariadb
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5851
Server version: 10.11.14-MariaDB-0+deb12u2 Debian 12
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> create database vmail;
Query OK, 1 row affected (0,000 sec)
MariaDB [(none)]> GRANT ALL ON vmail.* TO 'vmail'@'localhost' IDENTIFIED BY 'vmail';
Query OK, 1 row affected (0,000 sec)
MariaDB [(none)]> flush privileges;
Query OK, 1 row affected (0,000 sec)
MariaDB [(none)]> exit
Bye
root@vmail:~#
```
Para cada base de datos y usuario que haya que crear, repetir los pasos correspondientes
===== Instalación del software vmail =====
Vamos a instalar la aplicación web [[http://github.com/omgslinux/vmail|Vmail]]. Corre bajo `nginx`, y necesita `php` y una base de datos (que acabamos de crear). En primer lugar, vamos a hacerlo en un entorno debian 12 (bookworm), que no tiene diferencias para luego hacerlo en debian 13 (trixie). Instalamos:
* git
* php-cli y las extensiones php requeridas por symfony, como php-mysql
* php-fpm
* nginx
* [[https://github.com/omgslinux/nginx-vhost-generator|vhost generator]] para generar los vhosts
```
root@vmail:~# apt install git php-cli php-fpm php-mysql nginx php-xml php-curl curl
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
git-man liberror-perl libsodium23 patch php-common php8.2-cli php8.2-common php8.2-fpm php8.2-mysql php8.2-opcache php8.2-readline psmisc nginx nginx-common libxslt1.1 php8.2-xml libcurl4 php8.2-curl
```
Creamos el usuario vmail, con uid y gid 5000, así como los directorios necesarios para la aplicación:
```
root@vmail:~# useradd -u 5000 -m -s /bin/bash vmail
root@vmail:~# adduser www-data vmail
root@vmail:~# mkdir -p /var/lib/vmail
root@vmail:~# chown vmail:vmail /var/lib/vmail
```
===== Configurar nginx =====
Vamos a usar `http`, por hacerlo fácil en este punto y porque no tenemos certificados (aunque se podría usar el `snake-oil`).
```
root@vmail:~# cd /etc/nginx
root@vmail:/etc/nginx# rm sites-enabled/default
root@vmail:/etc/nginx# git clone https://github.com/omgslinux/nginx-vhost-generator vhost-generator
root@vmail:/etc/nginx# cd vhost-generator
root@vmail:/etc/nginx/vhost-generator# cp defaults.inc_dist defaults.inc
# Editar el fichero defaults.inc y poner el sufijo predeterminado en SUFFIX, etc.
root@vmail:/etc/nginx/vhost-generator# mkdir vmail
root@vmail:/etc/nginx/vhost-generator# cat > vmail/vmail.inc < roundcube/roundcube.inc <>/etc/hosts
```
===== Configuración con el usuario vmail =====
En los siguientes pasos, vamos a usar el usuario no privilegiado `vmail` que hemos creado para usar la aplicación y los directorios de correo.
```
root@vmail:~# su - vmail
vmail@vmail:~$ git clone https://github.com/omgslinux/vmail.git
vmail@vmail:~$ cd vmail
vmail@vmail:~/vmail$ echo 'APP_ENV=prod
vmail@vmail:~/vmail$ DATABASE_URL="mysql://vmail:vmail@mysql:3306/vmail?serverVersion=11.8.3-MariaDB&charset=utf8mb4"'>>.env
# Si tenemos el servidor mysql en localhost u otro, editar el fichero .env y modificar '@mysql:3306' por lo que proceda.
vmail@vmail:~/vmail$ composer install
vmail@vmail:~/vmail$ bin/console asset-map:compile
vmail@vmail:~/vmail$ bin/console doctrine:schema:update --force
vmail@vmail:~/vmail$ bin/console vmail:setup
```
En este último paso, nos muestra por pantalla las credenciales para poder entrar en la aplicación. En este instante, deberíamos poder entrar por http al vhost configurado en nginx, `http://vmail.dominio.com`, que si no está en el DNS, habrá que añadir una línea en el fichero `/etc/hosts` que apunte a la ip correspondiente.
Con la aplicación, ahora es el momento de crear el dominio y los usuarios de correo, que probaremos luego con `dovecot` primero y después con `postfix`.
===== DKIM =====
Si tenemos un dominio (que es lo normal para el correo), y queremos que el correo enviado no vaya a spam, una medida es instalar soporte DKIM. Esto hace que los correos salientes lleven una firma que puede identificar que el correo sale del servidor de correo del dominio y no de una fuente cualquiera.
```
apt install opendkim opendkim-tools
```
En una configuración muy básica, tenemos que mirar que el fichero `/etc/opendkim.conf` contenga estas líneas:
```
UserID opendkim:opendkim
Socket local:/run/opendkim/opendkim.sock
KeyTable /etc/opendkim/KeyTable
SigningTable /etc/opendkim/SigningTable
```
Especial atención al parámetro `Socket`, que habrá que copiar tal cual está en postfix
El objetivo es tener una estructura como ésta:
```
/etc/dkimkeys/
├── KeyTable
├── SigningTable
└── dominio.com/
├── mail.private
└── mail.txt
```
Ahora se puede crear una clave
```
root@vmail:/etc/dkimkeys# mkdir dominio.com
root@vmail:/etc/dkimkeys# opendkim-genkey -s mail -d dominio.com -D dominio.com
root@vmail:/etc/dkimkeys# cat dominio.com/mail.txt
mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArLGJuK6LNeE0CUW76tzJGSVRy/Wi3BEQUD4N70C3cyLkuCvzKB/QWqgOdNCdJacCs513kA+rDyShIvzADRhRWtjw+kSUf/JOhWcHF7H5aYW3nFxX8S/AquAmKE2UDYsTzycL/0DkFL51PD5MHL3sHpXNv/lGnQ
nOifH9Vzyd+Bv+CKbrkypxDPHwuUPZ2FOLnXt57fv93DBAsT"
"2ej7VBTGCNUlH4ePH6cdLr0LORg1YX9qn0YvDr2uyT/0MxDUgDBcNoTEDXMPYegQg7fij5hYnaviefxPig99QIvTqxT7CkacshtyeQKtwaO+OISYb3pFm2kAcpBBo9G55ZPNrTjQIDAQAB" ) ; ----- DKIM key mail for dominio.com
```
Eso quiere decir que habría que crear un registro `TXT` en el DNS de `dominio.com` bajo la clave `mail._domainkey` con el contenido desde `"v=DKIM1; ..."` hasta `"DAQAB"`.
**MUY IMPORTANTE**: El contenido del registro `TXT` debe incluir también las comillas dobles de apertura y cierre
Después, el fichero `/etc/dkimkeys/KeyTable` debe tener una línea por dominio con este formato:
```
mail._domainkey.dominio.com dominio.com:mail:/etc/dkimkeys/dominio.com/mail.private
```
De manera similar, el fichero `/etc/dkimkeys/SigningTable` debe tener una línea por dominio con este formato:
```
*@dominio.com mail._domainkey.dominio.com
```
Finalmente, nos aseguramos de que todos los ficheros tienen los permisos adecuados:
```
root@vmail:~# chown -R opendkim:opendkim /etc/dkimkeys
root@vmail:~# chmod -R og-rwx /etc/dkimkeys
```
Luego, una forma de comprobar si todo está correcto, es enviar un correo a `check-auth@verifier.port25.com`, donde se devuelve un informe con los detalles.
===== Dovecot y Postfix =====
Vamos a instalar el software necesario:
```bash
IMAP="dovecot-core dovecot-mysql dovecot-imapd dovecot-sieve dovecot-lmtpd dovecot-managesieved $SQLSERVER"
SMTP="postfix-mysql"
ANTISPAM="amavisd-new"
apt install -y $IMAP $SMTP $ANTISPAM
```
Una vez instalado, ejecutamos como usuario root unos comandos de la aplicación vmail preparados para configurar todos los servicios relacionados.
```
root@vmail:~# cd /home/vmail/vmail
root@vmail:/home/vmail/vmail# bin/console app:dovecot:conf
root@vmail:/home/vmail/vmail# bin/console app:postfix:conf
```
Verificamos varias cosas:
- Tener en `/etc/dovecot/private/` los certificados adecuados. Por defecto, se usa el de `snake-oil`.
- Si se usa DKIM, que el resultado de `postconf smtpd_milters` coincide con la línea descomentada de `Socket` en el fichero `/etc/opendkim.conf`. En el caso de ser un fichero y no un socket tcp, habrá que añadir al usuario de postfix al grupo: `adduser postfix opendkim`.
- Que tanto `dovecot -n` como `postfix check` no dan errores fatales. Revisar en todo caso los mensajes que puedan surgir.
- Que el servicio `amavis` está funcionando correctamente. En ocasiones, hay que indicarle de forma explícita un hostname en `/etc/amavis/conf.d/05-domain_id`.
Después, reiniciamos los servicios:
- `service opendkim restart`
- `service dovecot restart`
- `service postfix restart`
- Con `ss -punta` verificamos los puertos IMAP (993, si acaso 143), SMTP (25 y 587), el DKIM (sock o puerto 8891) y amavis (puerto 10024).
Partiendo de la base de haber creado antes un usuario `xxx` en el dominio `dominio.com`, usamos la utilidad `doveadm` para realizar comprobaciones básicas desde la línea de comandos. Vamos a hacer dos:
1) Devolución de los parámetros de usuario:
```
# doveadm user xxx@dominio.com
field value
uid 5000
gid 5000
home /var/lib/vmail/dominio.com/xxx
mail maildir:~/Maildir
quota_rule *:storage=0B
```
2) Autenticación del usuario (nos pide password):
```
# doveadm auth test xxx@dominio.com
Password:
passdb: xxx@dominio.com auth succeeded
extra fields:
user=xxx@dominio.com
```
3) Ubicación del INBOX:
```
# doveadm mailbox path -u xxx@dominio.com INBOX
/var/lib/vmail/dominio.com/xxx/Maildir
```
Tiene que devolver la ruta `home` de 1) con `Maildir` agregado al final.
===== Roundcubemail =====
Cuando todo esté correcto, podremos hacer pruebas de recepción y envío, pero vamos a instalar [[https://roundcube.net/download/|Roundcubemail]]. Vamos a usar la versión 1.6.12, que es la LTS:
RVERSION="1.6.12"
mkdir -p /var/www/vhosts
cd /var/www/vhosts
wget https://github.com/roundcube/roundcubemail/releases/download/${RVERSION}/roundcubemail-${RVERSION}-complete.tar.gz
tar zxf roundcubemail-${RVERSION}-complete.tar.gz
ln -s roundcubemail-${RVERSION} roundcube
chown -R www-data:www-data roundcubemail-${RVERSION}
pushd roundcube/public_html
ln -s ../installer
popd
Antes de nada, hay que crear una base de datos específica y un usuario en la base de datos. Repetir los pasos necesarios igual que se hizo al principio para la aplicación `vmail`.
Una vez hecho esto, y como ya preparamos `nginx` en su momento, podemos ir a http://roundcube.dominio.com/installer, para iniciar la instalación. Seguimos los pasos del instalador y hacemos los pasos del instalador.
Si hay un certificado autofirmado, antes de proceder a probar la recepción en el instalador, se puede añadir lo siguiente al final del archivo `/var/www/vhosts/roundcube/config/config.inc.php`:
$config['imap_conn_options'] = $config['smtp_conn_options'] = [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
],
];
Una vez pasadas las pruebas, se deshabilita el instalador con
$config['enable_installer'] = false;
Una vez instalado, podemos realizar pruebas de envío y recepción con varios usuarios simultáneos a través de la interfaz web.