Configuración de MTA-STS con httpd
Por Francisco Gaitán el 26 de Abril de 2022
MTA-STS es el acrónimo de MTA Strict Transport Security y sirve para comunicar a otros servidores de correo que prefieres que la comunicación sea exclusivamente cifrada con TLS. Queda definido en el RFC 8461.
Como inconveniente está el uso de HTTP para una función de SMTP.
Referencias
- Setting an email server in 2020: advanced security
- Increase email security with MTA-STS and TLS reporting
Qué necesitas
- Entrada DNS para MTA-STS
- Servidor web con certificado SSL
- Archivo de políticas mta-sts.txt
Entrada DNS para MTA-STS
Necesitas crear una entrada DNS de tipo A y AAAA con la IP del servidor de correo y otra de tipo TXT:
mta-sts.example.com. IN A 203.0.113.1
mta-sts.example.com. IN AAAA 2001:0db8:85a3:0000:0000:8a2e:0370:7334
_mta-sts.example.com. IN TXT "v=STSv1; id=20220426"
El campo id es un identificador del archivo de políticas. He usado la fecha actual.
Servidor web con certificado SSL
Usaré el servidor web httpd(8) y un certificado válido que crearé con acme-client(1), lo cual queda fuera del alcance de este tutorial.
La entrada correspondiente para que el archivo mta-sts.txt cargue en la dirección https://mta-sts.example.com/.well-known/mta-sts.txt sería la siguiente (tomada del archivo de ejemplo /etc/examples/httpd.conf):
server "mta-sts.example.com" {
listen on * port 80
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
location * {
block return 302 "https://$HTTP_HOST$REQUEST_URI"
}
}
server "mta-sts.example.com" {
listen on * tls port 443
tls {
certificate "/etc/ssl/mta-sts.example.com.fullchain.pem"
key "/etc/ssl/private/mta-sts.example.com.key"
}
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
location "/.well-known/mta-sts.txt" {
root "/mta-sts"
request strip 1
}
location * {
block return 404
}
}
Archivo de políticas mta-sts.txt
Usaré el siguiente archivo de políticas:
Es recomendable usar el modo testing antes del modo enforce y leer los reportes para comprobar que todo esté correcto. Esta es la configuración que uso:
version: STSv1
mode: enforce
mx: mail.example.com
mx: mx-backup.example.com
max_age: 86400
- El modo enforce hace que requiera autenticación y encriptado al conectarse a servidores externos
- Las líneas mx listan los servidores de correo del dominio
- La variable max_age define el tiempo en segundos durante la política es válida
Necesitaré convertir el texto de formato UNIX a formato DOS para que tenga retorno de carro al final de cada línea, para lo cual usaré dos2unix, disponible como port:
# pkg_add dos2unix
Y lo uso:
$ unix2dos mta-sts.txt
Este archivo se guarda en el directorio /var/www/mta-sts/ con el nombre mta-sts.txt.
Reportes SMTP TLS
Si usas MTA-STS es recomendable configurar también los reportes SMTP TLS para saber si las sesiones TLS son correctas o hay algún problema. Esto se describe en el RFC 8460 y yo lo hago añadiendo esta entrada TXT al DNS:
_smtp._tls.example.com. IN TXT "v=TLSRPTv1;rua=mailto:reports@example.com;"
De esta forma los reportes llegan a la dirección de correo reports@example.com.