💾 Archived View for elmau.net › notes › mailserver.gmi captured on 2023-11-04 at 11:30:52. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-03-20)

➡️ Next capture (2024-03-21)

🚧 View Differences

-=-=-=-=-=-=-

Mail Server

iRedMail es una solución todo en uno para un servidor de correo, esto significa que con solo pasarle unos pocos parámetros de configuración nos instala todos los componentes necesarios para tener tu propio servidor de correo totalmente funcional con buenas practicas de seguridad.

iRedMail

Antes de empezar planifica correctamente tu servidor con los siguientes datos:

1] Primer dominio a usar. Para este ejemplo usaremos el dominio: correolibre.org

2] Debes de tener ya configurados con tu proveedor de dominios los siguientes registros:

2.1] Un registro tipo A a la IP de tu VPS

2.2] Un registro tipo A al subdominio "mail" a la misma IP

2.3] Los mismos registros de los puntos 2.1 y 2.2 pero tipo AAAA, solo si tu VPS tiene soporte para IPv6

2.4] Un registro tipo MX con prioridad 10 al subdominio "mail"

2.5] Un registro TXT con el valor "v=spf1 ip4:IP_VPS a -all" la IP_VPS debe ser la de tu VPS

2.6] Un registro TXT a "_dmarc" con el valor "v=DMARC1; p=reject; adkim=s; aspf=s; sp=none; rua=mailto:dmarc@correolibre.org; ruf=mailto:dmarc@correolibre.org"

2.7] Un registro TXT a "dkim._domainkey" con el valor "v=DKIM1; p=" este valor será editado más adelante.

A modo de ejemplo:

@ 10800 IN A 188.68.36.124
@ 10800 IN AAAA 2a03:4000:13:a72:d8b7:60ff:fec0:ff2
@ 10800 IN MX 10 mail
@ 10800 IN TXT "v=spf1 ip4:188.68.36.124 a -all"
_dmarc 10800 IN TXT "v=DMARC1; p=reject; adkim=s; aspf=s; sp=none; rua=mailto:dmarc@correolibre.org; ruf=mailto:dmarc@correolibre.org"
dkim._domainkey 10800 IN TXT "v=DKIM1; p="
mail 10800 IN A 188.68.36.124
mail 10800 IN AAAA 2a03:4000:13:a72:d8b7:60ff:fec0:ff2

Otro punto importante es tener configurado correctamente tu DNS inverso, esto, generalmente es con el proveedor del VPS, verifica que todo este correctamente configurado antes de continuar.

host mail.correolibre.org
mail.correolibre.org has address 188.68.36.124

host 188.68.36.124
124.36.68.188.in-addr.arpa domain name pointer mail.correolibre.org.

Dependiendo de la velocidad de propagación de los servidores de tu proveedor, los cambios en los registros pueden ser más o menos rápidos, sobre todo la configuración del DNS inverso, no continue mientras no tengas estos registros correctamente establecidos.

El instalador de iRedMail solo funciona en un servidor limpio, para este ejemplo he usado un VPS con Ubuntu Server 22.04. La mayor parte de los procesos como root.

Pon al día el servidor en cuanto a actualizaciones.

apt update

apt upgrade

Establece la zona horario de tu preferencia, algunos servidor de correo se establecen en el horario UTC.

timedatectl set-timezone America/Mexico_City

Desactiva los locales no usados

dpkg-reconfigure locales

localectl set-locale LANG=en_US.UTF-8 LANGUAGE="en_US:en"

vim /etc/environment

    LANG=en_US.UTF-8
    LC_ALL=en_US.UTF-8

Instalar estos paquetes

apt install python-is-python3 mlocate

Establecer correctamente tu hostname es muy importante para que todo funciona, no uses solo el nombre de tu dominio.

hostnamectl set-hostname mail.correolibre.org

vim /etc/hosts

    127.0.0.1 mail.cuates.net mail localhost

Reinicia para que tengan efectos estos cambios.

reboot

Asegurate de estar en el home del root.

cd /root

Descargamos al última versión del instalador.

wget https://github.com/iredmail/iRedMail/archive/refs/tags/1.6.3.tar.gz

Descomprimimos y entramos en el directorio.

tar zxf 1.6.3.tar.gz

cd iRedMail-1.6.3/

Iniciamos el instalador.

bash iRedMail.sh

Presionar Enter en las dos opciones.

Adding component(s) 'multiverse' to all repositories.
Press [ENTER] to continue or Ctrl-c to cancel.
Adding component(s) 'universe' to all repositories.
Press [ENTER] to continue or Ctrl-c to cancel.

Debe de inciar el asistente de instalación, puedes usar el ratón para seleccionar la opción indicada y dar siguiente cuando corresponda:

1] Pantalla de bienvenida: Yes

2] Directorio de almacenamiento de los buzones de correo: /var/vmail

3] Instalar servidor web: Nginx

4] Seleccionar base de datos: PostgreSQL

5] Contraseña para admin PostgreSQL:

6] Capturar primer dominio: correolibre.org

7] Contraseña para el administrador:

8] Componentes opcionales: seleccionar todos, excepto SoGo

Después del último paso, debes de ver una confirmación con las opciones seleccionadas.





< Question > Continue? [y|N]

Escribe "y" Enter para continuar. Debe comenzar todo el proceso de descarga, instalación y configuración de todos los paquetes necesarios. En esta prueba el proceso tardo 5 minutos en un VPS con 2 cores y 8 de RAM.

Antes de terminar, puede que veas un mensaje como el siguiente, tal vez solo si cambiaste el puerto predeterminado SSH, si no lo ves, esta bien.

< Question > Would you like to use firewall rules provided by iRedMail?
< Question > File: /etc/nftables.conf, with SSHD ports: 22. [Y|n]Y
[ INFO ] Copy firewall sample rules.
< Question > Restart firewall now (with ssh ports: 22)? [y|N]y
[ INFO ] Restarting firewall ...

Al terminar, debes de ver un mensaje como este:


Tal como dice el mensaje, reinicia el servidor para activar todos los servicios. Toma nota de las credenciales del usuario: "postmaster@correolibre.org" son las predeterminadas para todos los servicios y el usuario administrador de todo.

reboot

Este archivo contiene información sensible, muevelo a un lugar seguro.

/root/iRedMail-1.6.0/config

Este archivo contiene información importante del servidor, tenlo a la mano para consulta.

/root/iRedMail-1.6.0/iRedMail.tips

En este momento, el instalador de iRedMail genero certificados autofirmados los cuales funcionan pero la mayoría de los servidores los rechazará. Vamos a reemplazarlos por los gratuitos de Let's Encrypt

Instalamos

apt install certbot -y

Aceptamos los terminos de uso y registramos un correo, en este correo recibirás notificaciones cuando esten por vencer los certificados.

certbot register --agree-tos -m EMAIL

Detenemos un momento el servidor web.

systemctl stop nginx

Solicitamos el certificado

certbot certonly --standalone --preferred-challenges http-01 -d correolibre.org -d mail.correolibre.org

Si todo esta bien el registro debe ser similar a.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for correolibre.org
http-01 challenge for mail.correolibre.org
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/correolibre.org/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/correolibre.org/privkey.pem
   Your cert will expire on 2021-12-27. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Borramos los certifidados autofirmados.

rm -f /etc/ssl/private/iRedMail.key

rm -f /etc/ssl/certs/iRedMail.crt

Creamos vínculos simbólicos a los nuevos.

ln -s /etc/letsencrypt/live/correolibre.org/privkey.pem /etc/ssl/private/iRedMail.key

ln -s /etc/letsencrypt/live/correolibre.org/fullchain.pem /etc/ssl/certs/iRedMail.crt

Probamos que todo esta bien.

nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Iniciamos de nuevo el servidor web.

systemctl start nginx

Vamos a probar cada servicio, para todos con las credenciales del "postmaster", entra al Web Admin Panel:

https://mail.correolibre.org/iredadmin/

Para el cliente web de correo Roundcube:

https://mail.correolibre.org/mail/

El monitor del sistema NetData:

https://mail.correolibre.org/netdata/

Vamos a actualizar la clave DKIM para el dominio, para ver la clave asignada usas:

amavisd-new showkeys

Copia la clave de modo que quede en una sola línea, ve al administrador de los DNS de tu proveedor de dominio y editar el valor TXT de "dkim._domainkey" con este valor.

CUIDADO: Asegurate de no borrar algún caracter de más al unificarla en una sola línea, cualquier caracter que falte, provocará que sean rechazados los correos, revisala al menos dos veces.

Asegurate de esperar el tiempo suficiente para validarla.

amavisd-new testkeys

TESTING#1 correolibre.org: dkim._domainkey.correolibre.org => pass

Algunos procedimientos especiales, requieren editar algunas tablas en la base de datos, para esto, nos aseguramos de poner como de confianza el acceso al usuario "postgres" localmente.

vim /etc/postgresql/14/main/pg_hba.conf

    local   all     postgres    trust

systemctl restart postgresql

Agrega un nuevo usuario para acceder remotamente. Reemplaza "USER" por tu nombre de usuario.

adduser USER

Lo agregamos al grupo de usuarios "sudo" para poder realizar las tareas administravias.

gpasswd -a USER sudo

Vamos a editar la configuración predeterminada del servidor SSH.

CUIDADO: Si no esta correcto puedes quedarte sin acceso remoto.

Reemplaza USER por el usuario que acabas de agregar y establece un puerto alterno al predeterminado 22. En algunos servidores estos valores pueden estar repartidos a lo largo del archivo de configuración, revisalo todo para asegurarte de no tener líneas repetidas.

vim /etc/ssh/sshd_config

    Port 22
    AllowUsers root USER
    PermitRootLogin yes
    LoginGraceTime 1m
    ClientAliveInterval 600
    ClientAliveCountMax 0
    MaxAuthTries 3
    IgnoreRhosts yes
    PermitEmptyPasswords no
    PasswordAuthentication yes
    LogLevel INFO

Nota que el acceso con contraseña esta activado (PasswordAuthentication yes) y el acceso de "root"", más adelante lo cambiaremos.

Reinicia el servidor SSH.

systemctl restart ssh

Sal del servidor

exit

Si ya tienes una clave para identificarte con un servidor puedes usarla, si no, genera una, usa "ssh-keygen" y sigue las instrucciones. CUIDADO, no vayas a reemplazar alguna existente.

ssh-keygen -t ed25519

Copiamos la clave publica al servidor. Reemplaza CLAVE por el nombre correcto de tu clave, asegurate que se la pública, la terminada en "pub" y reemplaza el USER por el usuario e IP_SERVER por la IP de tu servidor y captura la contraseña cuando se te solicite.

ssh-copy-id -i ~/.ssh/CLAVE.pub USER@IP_SERVER

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/mau/.ssh/office21.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
mau@303.72.304.13's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '303.72.304.13'"
and check to make sure that only the key(s) you wanted were added.

Ahora debe de poder conectarte directamente.

ssh USER@IP_SERVER

TIP: Si el usuario agregado es igual al usuario de donde te conectas, puede usar solo la IP.

TIP: Puedes configurar el archivo de tu home ".ssh/config" para establecer un nombre más amigable para conectarte a tu servidor en vez de la IP.

Si puedes conectar de nuevo a tu servidor con este usuario, todo esta bien, ya puedes desactivar el acceso por contraseña y el acceso a root. Nota que ahora usamos "sudo".

sudo vim /etc/ssh/sshd_config

    PermitRootLogin no
    PasswordAuthentication no

Renicia el servidor SSH

sudo systemctl restart ssh

Para agregar un nuevo dominio al servidor.

Generamos una clave para el nuevo dominio.

sudo amavisd-new genrsa /var/lib/dkim/cuates.net.pem 2048

Cambiamos el dueño del archivo.

sudo chown amavis:amavis /var/lib/dkim/cuates.net.pem

Cambiamos los permisos.

sudo chmod 400 /var/lib/dkim/cuates.net.pem

Agregamos la línea:

"cuates.net"  => { d => "cuates.net", a => 'rsa-sha256', ttl => 10*24*3600 },

Al archivo:

sudo vim /etc/amavis/conf.d/50-user

    # Add dkim_key here.
    dkim_key('correolibre.net', 'dkim', '/var/lib/dkim/correolibre.net.pem');
    dkim_key('cuates.net', 'dkim', '/var/lib/dkim/cuates.net.pem');

    @dkim_signature_options_bysender_maps = ({
        # 'd' defaults to a domain of an author/sender address,
        # 's' defaults to whatever selector is offered by a matching key

        # Per-domain dkim key
        "correolibre.net"  => { d => "correolibre.net", a => 'rsa-sha256', ttl => 10*24*3600 },
        "cuates.net"  => { d => "cuates.net", a => 'rsa-sha256', ttl => 10*24*3600 },

        # catch-all (one dkim key for all domains)
        #'.' => {d => 'correolibre.net',
        #        a => 'rsa-sha256',
        #        c => 'relaxed/simple',
        #        ttl => 30*24*3600 },
    });

Muestra la clave generada y agregala al correspondiente registro TXT como se vio al inicio.

sudo amavisd-new showkeys

Reinicia el servicio

sudo amavisd-new restart

Valida la clave, recuerda, hay que espera a que se propague.

sudo amavisd-new testkeys

Ahora, desde el Admin Web Panel, puedes agregar el nuevo dominio y agregar los usuarios de correo que quieras.

Eso es todo.

Disfruta.

Regresar el índice

Regresar el inicio