Servidor de Correo – Casillas y usuarios virtuales

Postscreen - Reducir la sobrecarga del servidor SMTP

Postfix puede generar hasta 100 procesos de servidor SMTP para manejar las conexiones de clientes SMTP. Se puede comprobar el límite de procesos ejecutando el siguiente comando.

# postconf default_process_limit
default_process_limit = 150

Si hay spambots intentando acceder constantemente al servidor, habrá menos procesos de Postfix para aceptar mensajes de correo legítimos. Y cuando el número de clientes SMTP excede el número de procesos del servidor Postfix, otros clientes SMTP deben esperar hasta que un proceso del servidor esté disponible.

Al bloquear los spambots con Postscreen, podemos reservar los procesos del servidor para los clientes SMTP legítimos. Postscreen está diseñado como una primera capa de defensa contra los spammers. Está implementado como un único proceso que escucha en el puerto 25 y puede manejar múltiples conexiones SMTP entrantes.

Medidas utilizadas por Postscreen contra los spambots

La mayoría de los spambots tienen una implementación defectuosa del protocolo SMTP. Postscreen puede aprovechar este hecho y utilizar varias medidas para bloquearlos.

  • Prueba de saludo previo. Si el cliente SMTP habla antes de su turno, detiene la conexión.
  • Comprobación de la lista negra en tiempo real. Si la dirección IP del cliente está en una lista negra, como la de Spamhaus, interrumpe la conexión.
  • Prueba profunda de protocolo.

Paso 1: Habilitar Postscreen en Postfix

Postscreen se introdujo por primera vez en Postfix 2.8. Si estás usando cualquier distribución de Linux actual, deberías tener Postfix 3.0 o superior. Para comprobar la versión de Postfix, ejecutar

# postconf mail_version
mail_version = 3.3.0

Edite el archivo de configuración master de Postfix.

nano /etc/postfix/master.cf

Comentar la siguiente línea

smtp inet n - y - - smtpd

Luego descomentar las siguientes 4 líneas

smtp inet n - y - 1 postscreen
smtpd pass - - y - - smtpd
dnsblog unix - - y - 0 dnsblog
tlsproxy unix - - y - 0 tlsproxy

Donde:

  • Las dos primeras líneas activan Postscreen. Tanto Postscreen como el demonio smtpd escucharán en el puerto 25. Postscreen comprobará primero el cliente SMTP y luego pasará la conexión al demonio smtpd.
  • El servicio dnsblog (DNS Blacklist Logger) permite registrar las comprobaciones de la lista negra de DNS.
  • El servicio tlsproxy habilita el soporte de STARTTLS para postscreen, por lo que los clientes SMTP remotos pueden establecer una conexión encriptada cuando Postscreen está habilitado.

Guardar y cerrar el archivo.

Crear una lista blanca/negra permanente

Editar el archivo de configuración main de Postfix.

nano /etc/postfix/main.cf

Necesitamos añadir nuestras propias direcciones IP a la lista blanca de Postscreen para que nuestras propias peticiones SMTP no sean comprobadas por Postscreen (prueba de saludo previo, comprobación de la lista negra, test de protocolo profundo, etc). Añadir las siguientes dos líneas al final del archivo.

postscreen_access_list = permit_mynetworks cidr:/etc/postfix/postscreen_access.cidr
postscreen_blacklist_action = drop

Guardar y cerrar el archivo. El valor permit_mynetworks pondrá en la lista blanca cualquier dirección IP listada en el parámetro mynetworks.

También se pueden añadir manualmente direcciones IP adicionales en el archivo /etc/postfix/postscreen_access.cidr.

nano /etc/postfix/postscreen_access.cidr

Es posible que necesitemos poner en la lista blanca la dirección IPv4 e IPv6 pública del servidor de correo. Así que agregamos las siguientes líneas en el archivo. Tener en cuenta que se debe utilizar la notación CIDR: Para una única dirección IPv4, añadir /32 al final; Para una única dirección IPv6, añadir /128 al final.

#permitir mis propias direcciones IP.
179.0.132.51/32 permit
2800:110:5::66/128 permit

Para poner una dirección IP en la lista negra de forma permanente

12.34.56.78/32 reject

Guardar y cerrar el archivo. Reiniciar Postfix para que los cambios surtan efecto.

systemctl restart postfix

Nota: Postscreen escucha en el puerto 25 solamente, así que los usuarios autenticados del puerto 587 o 465 no serán afectados por Postscreen.

El propio Postscreen también mantiene una lista blanca dinámica para minimizar el retraso de los correos legítimos, definida por el parámetro postscreen_cache_map.

# postconf postscreen_cache_map
postscreen_cache_map = btree:$directory/postscreen_cache

Cada dirección IP de la lista blanca dinámica tiene un tiempo de vida.

Paso 2: Prueba de saludo previo

Hay una prueba de saludo previo en Postscreen para detectar el spam. En el protocolo SMTP, el servidor SMTP receptor debe declarar siempre su nombre de host antes de que lo haga el servidor SMTP emisor. Algunos spammers violan esta regla y declaran sus nombres de host antes de que lo haga el servidor SMTP receptor.

Postscreen habilita la prueba de saludo previo de manera predeterminada, pero no hará nada con el resultado de la prueba. Como se puede ver en las siguientes líneas de log de ejemplo, el texto “PREGREET” indica que el cliente SMTP declaró su nombre de host primero, pero Postscreen igualmente pasó la conexión al demonio smtpd de Postfix.

mail postfix/postscreen[24075]: CONNECT from [156.96.118.171]:62604 to [23.254.225.226]:25
mail postfix/postscreen[24075]: PREGREET 11 after 0.07 from [156.96.118.171]:62604: EHLO User\r\n
mail postfix/smtpd[24076]: connect from unknown[156.96.118.171]
mail postfix/smtpd[24076]: disconnect from unknown[156.96.118.171] ehlo=1 quit=1 commands=2

Para rechazar clientes SMTP que violan esta regla, editar el archivo main de configuración de Postfix.

/etc/postfix/main.cf

Agregar la siguiente linea al final.

postscreen_greet_action = enforce

Guardar y cerrar el archivo. Luego reiniciar Postfix.

systemctl restart postfix

}

A partir de ahora, Postscreen detendrá la conexión si un cliente SMTP viola esta regla. Como se puede ver en el siguiente registro, Postscreen detuvo la conexión, por lo que el spammer no tiene la oportunidad de acosar al demonio smtpd.

mail postfix/postscreen[6471]: CONNECT from [192.241.239.123]:48014 to [23.254.225.226]:25
mail postfix/postscreen[6471]: PREGREET 19 after 0 from [192.241.239.123]:48014: EHLO zg-0131a-136\r\n
mail postfix/postscreen[6471]: DISCONNECT [192.241.239.123]:48014

Postscreen sigue permitiendo que se completen otras pruebas antes de detener la conexión. Para interrumpir la conexión inmediatamente sin realizar otras pruebas, utilizar la siguiente configuración en su lugar.

postscreen_greet_action = drop

Paso 3: Uso de listas negras y blancas públicas

El parámetro postscreen_dnsbl_sites puede ser utilizado para comprobar la dirección IP del cliente SMTP contra las listas negras públicas (DNSBL). Es posible que ya esté utilizando el reject_rbl_client de Postfix smtpd para rechazar un cliente SMTP si su dirección IP está en una lista negra pública. Sin embargo, eso puede causar falsos positivos porque la dirección IP de un servidor SMTP inocente podría estar en una lista negra por cualquier razón, incluso si usas permit_dnswl_client para verificar también contra la lista blanca pública (DNSWL).

Para reducir los falsos positivos, Postscreen le permite comprobar múltiples listas negras y añadir un factor de peso a cada lista negra. Por ejemplo, si una dirección IP está en la lista negra de Spamhaus, añade 3 puntos; si una dirección IP está en la lista negra de BarracudaCentral, añade 2 puntos. Si la puntuación combinada es lo suficientemente alta (definida por postscreen_dnsbl_threshold), rechaza el cliente SMTP. Este sistema de puntuación es similar al de SpamAssassin.

En la siguiente configuración, fijamos el umbral en 3 puntos. Spamhaus tiene un peso de 3. BarracudaCentral tiene un peso de 2. SpamCop tiene un peso de 1. Si la puntuación combinada es igual o mayor que 3, Postscreen rechazaría el cliente SMTP.

postscreen_dnsbl_threshold = 3
postscreen_dnsbl_action = enforce
postscreen_dnsbl_sites =
        zen.spamhaus.org*3
        b.barracudacentral.org=127.0.0.[2..11]*2
        bl.spameatingmonkey.net*2
        bl.spamcop.net
        dnsbl.sorbs.net

También se puede usar postscreen_dnsbl_sites para verificar la dirección IP del cliente SMTP contra la lista blanca pública (DNSWL). Si la dirección IP del cliente está en la lista blanca, agregar puntaje negativo.

postscreen_dnsbl_sites =
        zen.spamhaus.org*3
        b.barracudacentral.org=127.0.0.[2..11]*2
        bl.spameatingmonkey.net*2
        bl.spamcop.net
        dnsbl.sorbs.net
       swl.spamhaus.org*-4,
       list.dnswl.org=127.[0..255].[0..255].0*-2,
       list.dnswl.org=127.[0..255].[0..255].1*-4,
       list.dnswl.org=127.[0..255].[0..255].[2..3]*-6

Si utiliza el parámetro reject_rbl_client o permit_dnswl_client de Postfix smtpd, se debería eliminarlos, para que el demonio smtpd no realice comprobaciones de IP de nuevo después de Postscreen. Postscreen no comprueba el nombre de dominio basado en la lista negra/blanca, por lo que deberíamos seguir utilizando reject_rhsbl para realizar la búsqueda de nombres de dominio en las listas negras públicas.

smtpd_recipient_restrictions =
     permit_mynetworks,
     permit_sasl_authenticated,
     ...
     ...
     reject_rhsbl_helo dbl.spamhaus.org,
     reject_rhsbl_reverse_client dbl.spamhaus.org,
     reject_rhsbl_sender dbl.spamhaus.org,

Guardar y cerrar el archivo de configuración main de Postfix. Luego reiniciar Postfix para que los cambios surtan efecto.

systemctl restart postfix

Nota: Si ve el siguiente mensaje en su registro de correo, significa que la dirección IP del cliente SMTP no está en la lista blanca (list.dnswl.org). Esto no es un error.

warning: dnsblog_query: lookup error for DNS query 179.0.132.51.list.dnswl.org: Host or domain name not found. Name service error for name=179.0.132.51.list.dnswl.org type=A: Host not found, try again

Si está en la lista blanca, el mensaje será como este:

postfix/dnsblog[21188]: addr xx.xx.xx.xx listed by domain list.dnswl.org as 127.0.10.0

Si una dirección IP aparece como 127.0.0.255 en list.dnswl.org, como en el siguiente mensaje, significa que ha alcanzado el límite de consulta. Se eberá ejecutar un DNS local propio.

postfix/dnsblog[11951]: addr 202.66.174.152 listed by domain list.dnswl.org as 127.0.0.255

Es necesario tener en cuenta también que BarracudaCentral Blocklist requiere un registro, que es gratuito. Después de crear una cuenta, simplemente hay que añadir la dirección IP del DNS y ya está.

Utilizar DNS local propio

Debemos tener en cuenta que se debe configurar un DNS local cuando se utilicen listas negras y blancas públicas, porque la mayoría de ellas tienen un límite de consultas. Si se emplea un DNS público como 8.8.8.8, es probable que se alcance el límite de consulta antes de lo pensado.

Algunos sitios DNSBL muertos o cerrados

No se debe utilizar sitios DNSBL muertos o cerrados, o el servidor de correo rechazará correos legítimos.

dnsbl.njabl.org: está desactivado desde 2013.
dnsbl.ahbl.org: el acceso público a la lista finalizó en 2015.

Paso 4: Habilitar las pruebas de protocolo profundo

Hay 3 pruebas profundas de protocolo comunes en Postscreen:

  • Prueba de canalización SMTP
  • Prueba de comandos no SMTP
  • Prueba de línea nueva vacía

La canalización es una extensión del protocolo SMTP. Permite al cliente SMTP enviar múltiples comandos SMTP a la vez sin esperar la respuesta del servidor SMTP. Postfix los soporta de manera predeterminada. Para comprobarlo, se puede utilizar telnet para conectar al servidor de correo.

telnet correo.midominio.edu.ar 25

A continuación, utilizar el comando EHLO para declarar el nombre de host.

EHLO mail.google.com

La respuesta del servidor SMTP que aparece a continuación indica que admite la canalización.

250-PIPELINING
250-SIZE 157286400
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Luego cerrar la conexión.

quit

Algunos spammers utilizan la canalización de comandos para emitir varios comandos RCPT TO: a la vez, con el fin de enviar spam a varios destinatarios en una sesión SMTP. Si el servidor SMTP no anuncia el soporte de canalización, entonces el cliente SMTP no debería emitir múltiples comandos a la vez.

Agregar las siguientes dos líneas en el archivo /etc/postfix/main.cf para habilitar la prueba de canalización y rechazar a los clientes SMTP que fallen esta prueba.

postscreen_pipelining_enable = yes
postscreen_pipelining_action = enforce

Como el nombre sugiere, la prueba de comandos no SMTP hace que Postscreen detecte clientes SMTP que envían comandos no SMTP. Agregar las siguientes dos líneas en el archivo /etc/postfix/main.cf para rechazar tales clientes SMTP.

postscreen_non_smtp_command_enable = yes
postscreen_non_smtp_command_action = enforce

Un problema de vieja data para los administradores de sistemas, debido al diferente soporte de los distintos sistemas operativos, es la diferencia entre los retornos de carro y los saltos de línea, conocidos como y , respectivamente, en SMTP.

La prueba de nuevas líneas limpias permite a Postscreen detectar clientes SMTP que terminan una línea con , en lugar del estándar . Agregar las siguientes dos líneas en el archivo /etc/postfix/main.cf para rechazar tales clientes SMTP.

postscreen_bare_newline_enable = yes 
postscreen_bare_newline_action = enforce

Guardar y cerrar el archivo. A continuación, reiniciar Postfix para que los cambios surtan efecto.

systemctl restart postfix

El efecto de greylisting de las pruebas de protocolo profundas

La limitación de las pruebas de protocolo profundas es que Postscreen desconectaría a los nuevos clientes SMTP sin importar si las pruebas se superan o no. Postscreen desconecta cada cliente con el siguiente mensaje:

450 4.3.2 Service currently unavailable

Y el cliente debe volver a intentarlo más tarde desde la misma dirección IP. Esto es efectivamente una forma de greylisting, por lo que se necesita desactivar otras formas de greylisting. Por ejemplo, si se usa Postgrey como servidor de política de greylisting, entonces en el archivo /etc/postfix/main.cf hay que comentar la línea

check_policy_service inet:127.0.0.1:10023,

Guardar y cerrar el archivo. Luego reiniciar Postfix.

systemctl restart postfix

Cómo minimizar la mala experiencia del usuario

Las listas grises son bastante molestas para el usuario final, ya que éste tiene que esperar varios minutos más para que le llegue el correo electrónico. Para minimizar esta mala experiencia, hay 3 formas posibles cuando se utilizan las pruebas de protocolo profundo de Postscreen.

  • Crear un segundo registro MX que apunte a la misma dirección IP.
  • Si la dirección IP de un cliente SMTP está en una lista blanca pública, omitir las pruebas profundas de protocolo.
  • Utilizar Postwhite para añadir direcciones IP buenas y conocidas a la lista blanca de Postscreen.
Crear un segundo registro MX que apunte a la misma dirección IP

Se puede especificar más de un registro MX para el nombre de dominio como se indica a continuación.

Registro   Nombre    Servidor de Correo        Prioridad

MX           @       correo.midominio.edu.ar    0
MX           @       correo.midominio.edu.ar    5

El remitente intentará el primer servidor de correo (con prioridad 0). Si correo.midominio.edu.ar rechaza el correo por greylisting, entonces el remitente intentará inmediatamente el segundo servidor de correo (con prioridad 5).

El greylisting en Postscreen no tiene un tiempo de retraso como en Postgrey. Si los dos nombres de host del servidor de correo tienen la misma dirección IP, entonces cuando el remitente intente el segundo, el correo electrónico será aceptado inmediatamente (si todas las demás comprobaciones pasan) y los usuarios finales no notarán el retraso del correo electrónico causado por la lista gris.

Tener en cuenta que no todos los servidores de correo intentarán inmediatamente el segundo host MX. Algunos, como Gmail, usarán una dirección IP diferente para intentarlo de nuevo, que por supuesto será rechazada de nuevo. Postfix intentaría el segundo host MX.

Omitir pruebas de protocolo profundas si la dirección IP de un cliente SMTP está en una lista blanca pública

Gmail nunca volverá a intentar enviar un correo electrónico desde la misma dirección IP. Sin embargo, la dirección IP de Gmail está en list.dnswl.org. Podemos decirle a Postscreen que ignore a estos clientes SMTP. Añadir la siguiente línea en el archivo /etc/postfix/main.cf para ignorar a los clientes cuya puntuación sea igual a -2 o inferior.

postscreen_dnsbl_whitelist_threshold = -2

Reiniciar Postfix para que los cambios surtan efecto.

systemctl restart postfix

El siguiente mensaje del log de correo indica que Postscreen no realizó pruebas de protocolo profundas y pasó la conexión al demonio smtpd porque la dirección IP de Gmail está en la lista blanca pública.


Feb 10 10:31:14 mail postfix/postscreen[16579]: CONNECT from [209.85.166.44]:38543 to [23.254.225.226]:25
Feb 10 10:31:14 mail postfix/dnsblog[16582]: addr 209.85.166.44 listed by domain list.dnswl.org as 127.0.5.0
Feb 10 10:31:15 mail postfix/postscreen[16579]: PASS NEW [209.85.166.44]:38543
Feb 10 10:31:15 mail postfix/smtpd[16639]: connect from mail-io1-f44.google.com[209.85.166.44]

De hecho, la mayoría de los principales proveedores de correo (Gmail, Hotmail/Outlook, Yahoo Mail, GMX Mail, ProtonMail, etc) están en la lista blanca de list.dnswl.org. También incluye servidores de correo de otros sectores, como puede verse en dnswl.org.

Así que el uso de postscreen_dnsbl_whitelist_threshold ayudará a omitir el greylisting la mayor parte del tiempo.

Uso de Postwhite

Postwhite es un script escrito por Steve Jenkins para generar automáticamente una lista blanca de IPs estáticas para Postscreen utilizando los registros SPF publicados de webmailers conocidos, redes sociales, proveedores de comercio electrónico y remitentes masivos que cumplen con los requisitos. De debe teern en cuenta que esta lista blanca hace que Postscreen omita todas las pruebas (prueba de saludo previo, comprobación de lista negra/lista blanca pública, pruebas de protocolo profundas) para las direcciones IP de la lista blanca, por lo que ayudará a reducir la carga de Postscreen y las solicitudes de DNS a las listas negras/listas blancas públicas.

Para usar Postwhite, primero ir a /usr/local/bin/.

cd /usr/local/bin/

Instalar git.

apt install git

Clonar los repositorios SPF-Tools y Postwhite de Github.

git clone https://github.com/spf-tools/spf-tools.git
git clone https://github.com/stevejenkins/postwhite.git

Copiar el archivo postwhite.conf a /etc/.

cp /usr/local/bin/postwhite/postwhite.conf /etc/

Ejecutar Postwhite.

/usr/local/bin/postwhite/postwhite

La lista blanca ser guarda como /etc/postfix/postscreen_spf_whitelist.cidr. Editar el main.cf de Postfix.

/etc/postfix/main.cf

En la linea

postscreen_access_list = permit_mynetworks cidr:/etc/postfix/postscreen_access.cidr

Agregar el archivo de lista blanca

postscreen_access_list = permit_mynetworks cidr:/etc/postfix/postscreen_access.cidr cidr:/etc/postfix/postscreen_spf_whitelist.cidr

Guardar y cerrar el archivo. Luego reiniciar Postfix para que los cambios surtan efecto.

systemctl restart postfix

Editar el crontab del usuario root.

crontab -e

Añadir las dos siguientes líneas al final para actualizar regularmente la lista blanca.

@daily /usr/local/bin/postwhite/postwhite > /dev/null 2>&1 #Actualizar las listas blancas de Postscreen
@weekly /usr/local/bin/postwhite/scrape_yahoo > /dev/null 2>&1 #Update Yahoo! IPs para las listas blancas de Postscreen

Guardar y cerrar el archivo. Ahora, si se envía un correo electrónico desde Gmail a la dirección de correo del dominio, y se comprueba el registro de correo, se verá que Postscreen no realiza ninguna prueba, porque la dirección IP está en la lista blanca.

Feb 10 13:04:17 mail postfix/postscreen[24895]: CONNECT from [209.85.166.44]:38257 to [23.254.225.226]:25
Feb 10 13:04:17 mail postfix/postscreen[24895]: WHITELISTED [209.85.166.44]:38257
Feb 10 13:04:17 mail postfix/smtpd[26596]: connect from mail-io1-f44.google.com[209.85.166.44]