Envío de correos electrónicos desde un servidor con mSMTP
Escrito por Alfredo Delcalcetín | sin comentariosEn la sección ISPMail/Mail FAI encontrarás toda la información que necesitas para configurar un servidor de correo de calidad profesional. Pero hay muchos casos en los que puedes querer que un servidor pueda enviar correo sin convertirlo en un servidor de correo completo. A continuación, debe utilizar un "smarhost", es decir, un servidor smtp para retransmitir su correo.
El MTA (Mail Transfer Agent) ligero msmtp satisface perfectamente esta necesidad. Si tienes varios servidores y has configurado un servidor de correo en uno de ellos, será interesante asegurarte de que sus otros servidores puedan utilizarlo para reenviar su correo. También puedes utilizar el servidor de tu ISP o el de una plataforma como Gmail.
En un artículo anterior utilicé otro MTA ligero para satisfacer esta necesidad, ssmtp. Pero este último ya no se mantiene y ha sido eliminado de los repositorios de Debian para la versión 10 Stretch. Afortunadamente, se reemplaza ventajosamente por msmtp, cuya configuración es tan simple como ssmtp, pero más flexible.
¿Cuándo utilizar un MTA ligero como msmtp?
Es posible que deseas utilizar este tipo de software en varios casos:
- Deseas que tu servidor, o un servicio de monitoreo en este servidor, te envíe correos electrónicos regulares para mantenerte informado de cualquier problema ;
- para poder llevar a cabo estos envíos no quieres sin embargo tener que transformar tu servidor en un servidor de correo (lo que implica configuración, declaración de la máquina en el spf, firma dkim etc.) ;
- ya dispones de un servidor de correo completo con antispam, antivirus, capaz de firmar mensajes con una clave dkim y que aparece en los registros DNS de tu(s) dominio(s) ;
- alojas sitios web y deseas que tus sitios puedan enviar correos electrónicos y que cumplan con los estándares modernos (firma dkim, registros spf y dmarc).
Instalación de msmtp
El programa está en repositorios de Debian, así tienes que ejecutar el comando:
apt install msmtp-mta
para instalarlo.
configuración de msmtp
Las configuraciones msmtp se realizan a través de un archivo /etc/msmtprc
(opcional) que permite definir una configuración por defecto para los usuarios que no tienen una configuración personalizada, luego a través de archivos .msmtprc ubicados en el directorio de inicio de cada usuario del sistema para configuraciones personalizadas. Esto permite tener una configuración general para el servidor y una configuración diferente para cada usuario sin ninguna dificultad.
Configuración por defecto
Una configuración típica sería definir para todo el servidor un smarthost que utilizar, un usuario por defecto para conectarse a este smarthost, el puerto al que conectarse, la dirección de correo electrónico en el encabezado del correo electrónico y el requisito de usar encriptación TLS para las conexiones (o STARTTLS). Para todos los usuarios que no tengan un archivo .msmtprc en su /home
, msmtp utilizará este archivo por defecto. Toda esta configuración está en el archivo /ets/msmtprc
, algo así:
account default host mail.example.net from admin@example.net auto_from off add_missing_from_header on auth on port 587 user admin@example.net password Y8eqFDJNFPTp logfile ~/.msmtp.log tls on tls_starttls on tls_trust_file /etc/ssl/certs/ca-certificates.crt
Para todos los usuarios que no tengan una configuración específica, msmtp utilizará este archivo para reenviar el correo. Los correos electrónicos se enviarán al servidor de correo mail.example.net con admin@example.net como remitente. Por supuesto, el usuario utilizado para la autenticación debe existir en el smarthost (aquí admin@example.net). La contraseña está en texto claro en el archivo, veremos a continuación cómo evitarlo si eso te molesta (pero complica mucho las cosas).
Configuración específica de usuario
Podemos entonces, según sea necesario, crear en su directorio de inicio un archivo /home/nomuser/.msmtprc
que contendrá la información necesaria para enviar correo (servidor smtp e información de conexión).
Por ejemplo, si aloja un blog utilizando el servidor Apache y el modo suexec que permite ejecutar Apache bajo el nombre del usuario que posee los directorios y archivos de su sitio de blog. Asumiendo que su usuario se llama blog, la página de inicio del blog será, por ejemplo, /var/www/monblog/
. En este directorio se puede poner un archivo .msmtprc de este tipo:
account default host smtp.laposte.net from toto@laposte.net auto_from off add_missing_from_header on auth on port 587 user toto@laposte.net password Xu7OeboAyADn logfile ~/.msmtp.log tls on tls_starttls on tls_trust_file /etc/ssl/certs/ca-certificates.crt
Y si por ejemplo usas la función de mail de php al haber declarado msmtp en tu php.ini, tu blog enviará sus correos a través del smtp de la oficina de correos, bajo la identidad toto@laposte.net.
Algunos CMS utilizan clases (como PhpMailer) que pueden enviar correos electrónicos directamente a un smarthost. Pero si simplemente utilizas la función php mail, puedes declarar msmtp como el método de envío, que le permitirá con la función mail utilizar un smarthost. Simplemente agregue la siguiente línea en el archivo php.ini que estás usando:
sendmail_path = /usr/sbin/sendmail -t -icomo
/usr/sbin/sendmail
es en realidad un enlace simbólico en/usr/bin/msmtp
php enviará su correo a través de msmtp.
Almacenamiento de contraseñas
Con todos los servidores smtp, a menos que uno se encuentre en su red de confianza, sólo podrá transmitir sus correos una vez que haya sido autenticado (es decir, que haya demostrado al servidor que tiene acceso a una de sus cuentas que puede enviar correos). Esta autenticación se realiza normalmente mediante nombre de usuario y contraseña, y esta información debe transmitirse cifrada. La transmisión encriptada es proporcionada por TLS. Pero ¿qué pasa con la contraseña que debe estar en algún lugar de su servidor para que msmtp pueda transmitirla al servidor smtp?
Hasta ahora, en nuestros ejemplos, la contraseña estaba en texto plano en el archivo .msmtprc. Esta es una posible violación de la seguridad si usted no cuida los derechos de sus archivos para que nadie más que el propietario del archivo pueda leerlos. En su documentación online el desarrollador explica las 5 formas en que msmtp puede almacenar la contraseña de inicio de sesión, y los métodos que soporta para transmitirla al servidor.
Recomienda las dos primeras formas:
- el uso de un llavero, que es un software que almacena los identificadores y contraseñas de un sistema en la memoria. Pero los únicos sistemas compatibles son el llavero Gnome y el llavero de Mac OSX. Esto es posible si usamos msmtp en una estación de trabajo pero en un servidor no instalaremos Gnome, y usamos un servidor Debian y no un sistema Apple.
- Usar GPG para encriptar la contraseña. Para hacer esto, necesita instalar GnuPG y su agente, generar una clave GPG y usarla para encriptar su contraseña. Cada vez que se inicia el sistema, se debe proporcionar la frase clave al agente GPG. Es bastante restrictivo, depende de ti ver si lo necesitas absolutamente.
Por mi parte, me inclino a pensar que si le das 600 permisos a tu archivo .msmtprc, el riesgo es aceptable (y si no lo haces msmtp se negará a enviar tus emails).
Si tu servidor está comprometido y alguien logra convertirse en root o simplemente ejecutar un script como uno de los usuarios de tu sistema, por supuesto podrá ver todas las contraseñas o contraseñas del archivo del usuario cuya identidad esta robando. Pero si ha encriptado tu contraseña con GnuPG y el agente tiene la contraseña en claro en la memoria, el intruso ciertamente no verá la contraseña, pero podrá enviar todos los email que quiera. La única limitación puede venir entonces de tu smarthost que puede negarse a enviar más de un cierto número de correos electrónicos por período de tiempo para un usuario.
Si realmente no te agrada la presencia de una contraseña no cifrada o si hay muchos usuarios accediendo a tu máquina, aquí tienes cómo usar GnuPG y el comando passwordeval de msmtp para cifrar tus contraseñas.
Encriptación de contraseñas con GnuPG
Primero instalamos los programas necesarios:
apt install gnupg gnupg-agent
A continuación, se inician las cosas serias, primero debes generar tu clave con la frase de contraseña. Sin la frase de contraseña cualquier intruso podría descifrar su contraseña como lo hace msmtp.
La frase de contraseña es simplemente una cadena lo suficientemente larga y compleja que sirve para encriptar la propia clave de GnuPG y descifrarla para poder usarla. Como estamos en un servidor y no puedes introducir la frase de contraseña para cada envío, la frase de contraseña desencriptada se almacena en la memoria por un programa gpg-agent que proporciona esta información a programas como msmtp.
Durante la generación se te hará el programa diferentes preguntas, así es como se ve el cuestionario.
[20:38:35] root@srv1.mydomain.net : [~] # gpg --full-generate-key gpg (GnuPG) 2.1.18; Copyright (C) 2017 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (3072) Requested keysize is 3072 bits Please specify how long the key should be valid. 0 = key does not expire = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years Key is valid for? (0) 10y Key expires at Sat 08 Dec 2029 08:45:25 PM CET Is this correct? (y/N) y GnuPG needs to construct a user ID to identify your key. Real name: Toto LESBONNESHISTOIRES Email address: toto@laposte.net Comment: You selected this USER-ID: "Toto LESBONNESHISTOIRES " Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. gpg: key 9FC9759BD0EA2805 marked as ultimately trusted gpg: directory '/root/.gnupg/openpgp-revocs.d' created gpg: revocation certificate stored as '/root/.gnupg/openpgp-revocs.d/0BCD1DA5B34581AFF5F57ACB9FC9759BD0EA2805.rev' public and secret key created and signed. pub rsa3072 2019-12-11 [SC] [expires: 2029-12-08] 0BCD1DA5B34581AFF5F57ACB9FC9759BD0EA2805 0BCD1DA5B34581AFF5F57ACB9FC9759BD0EA2805 uid Toto LESBONNESHISTOIRES sub rsa3072 2019-12-11 [E] [expires: 2029-12-08]
En general para generar entropía ejecuto en otro terminal ssh el comando tree /
que ocupa el procesador y el disco. Al generar la clave (no aparece aquí) se te pedirá tu frase de contraseña. Tendrás que guardarla cuidadosamente (por ejemplo, usando el software keepass), porque se le preguntará cada vez que ejecute el agente gpg. Para generar una clave compleja se puede, por ejemplo, ejecutar el comando :
pwgen -1sncy 40
Si no instalaste pwgen:
apt install pwgen
Ahora podrás crear en la carpeta del usuario, el archivo que contenga la contraseña, y luego encriptar este archivo con GnuPG. Dijimos que la contraseña para toto@laposte.net era Xu7OeboAyADn. Por lo tanto, se crea un fichero que contiene este valor:
echo 'Xu7OeboAyADn' > .msmtp-password
A continuación, lanzarás el comando de encriptación:
gpg --encrypt .msmtp-password
El programa te pedirá tu ID (aquí tu nombre es Toto LESBONNESHISHISTOIRES) y obtendrás un archivo .msmtp-password.gpg. Borraras .msmtp-password y te aseguraras de darle al archivo .msmtp-password.gpg como proprietario tu usuario con los derechos unix 600.
rm .msmtp-password chown toto:toto .msmtp-password.gpg chmod 600 .msmtp-password.gpg