Publicado por & archivado en Postfix.

Cada vez se recibe más spam en el que el remitente es un email del mismo dominio o el mismo email del destinatario. Al ser un dominio local, por defecto Postfix permite el envío sin comprobar si el que envía el email es un usuario autorizado.

 

Para solucionar esto se puede añadir en smtpd_sender_restrictions la orden reject_sender_login_mismatch o bien reject_unauthenticated_sender_login_mismatch, para lo que es necesario antes indicarle a Postfix los usuarios permitidos en smtpd_sender_login_maps. Para hacerlo habría que añadir estas órdenes en el archivo main.cf, por ejemplo así:

smtpd_sender_login_maps = mysql:/etc/postfix/sender_login_maps.cf
smtpd_sender_restrictions =
 reject_unknown_sender_domain,
 reject_non_fqdn_sender,
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_sender_login_mismatch,
permit

 

 

Lo más habitual en los servidores de correo con muchos usuarios o dominios es utilizar una base de datos, en mi caso los tengo en MySQL que sirve para alimentar el SASL. Mi instalación está basada en webcyradm como gestor, pero servirá igual con otras instalaciones.

 

Para indicarle a smtpd_sender_login_maps los datos he creado un archivo en la carpeta postfix con el nombre sender_login_maps.cf, con el siguiente contenido:

hosts = 127.0.0.1
user = usuario-mysql
password = contraseña-mysql
dbname = nombre-base-de-datos
query = SELECT username FROM virtual WHERE alias LIKE '%s'

 

En este caso la consulta va a la tabla “virtual” de la base de datos, que tiene, estre otros, estos campos que he usado en la consulta SQL:

alias: Email del usuario
username: Usuario SASL correspondiente a ese email

 

Cuando un usuario conecta, Postfix envía el email de remite en sender_login_maps.cf y espera de vuelta el usuario SASL.  Si tienes una estructura de tablas distinta de la usada en las instalaciones de webcyradm, tienes que buscar una tabla que contenga los emails relacionados con los usuarios SASL y modificar la consulta MySQL para que encaje de esta forma:

query = SELECT usuario-sasl FROM tabla WHERE email LIKE '%s'

 

Si configuras mal la consulta simplemente no rechazará el correo con remites locales, pero puedes comprobar si lo has hecho bien enviando una consulta a postmap, de esta forma:

postmap -q email mysql:/etc/postfix/sender_login_maps.cf

 

Donde “email” es el email local para el que quieres hacer la comprobación. Por ejemplo, para el email pepe@intervia.com sería:

postmap -q pepe@intervia.com mysql:/etc/postfix/sender_login_maps.cf

 

La respuesta para que funcione bien, debe ser el usuario SASL, es decir, lo que pone el usuario en su cliente de correo (outlook, thunderbird, etc), en el caso de mi servidor todos los usuarios son iguales que el email pero cambiando @ por un punto, así que la respuesta a esa consulta sería: pepe.intervia.com

 

Si la respuesta es otra o sale vacía, es que tienes mal configurada la consulta SQL en sender_login_maps.cf, o que la tabla no contiene los valores adecuados.

 

6 Comentarios para “Bloquear remites de dominios locales a usuarios no autentificados en Postfix”

  1. David

    Hola, muchas gracias por el post es lo que andaba buscando, solo una duda que tengo, al párrafo:La respuesta para que funcione bien, debe ser el usuario SASL, es decir, lo que pone el usuario en su cliente de correo (outlook, thunderbird, etc), en el caso de mi servidor todos los usuarios son iguales que el email pero cambiando @ por un punto, así que la respuesta a esa consulta sería: pepe.intervia.com
    yo presupongo que lo que retorna la consulta és el nombre de ususario?
    Gracias por todo.

    Responder
    • Juan

      La respuesta del postmap es el usuario SASL que depende de cada instalación, en este caso la respuesta del postmap al comando postmap -q pepe@intervia.com mysql:/etc/postfix/sender_login_maps.cf sería, si el usuario y contraseña coinciden, “pepe.intervia.com”, en caso contrario no devolvería nada.

      Es decir, si está bien configurado te tiene que devolver el usuario SASL cuando preguntas al postmap por el email.

      Responder
  2. Joan

    Hola, me podrias decir si en el penultimo paragrafo, ” así que la respuesta a esa consulta sería: pepe.intervia.com “,
    la respuesta a la consulta és el nombre de usuario del correo electrónico, es que no me queda muy claro.

    Gracias de antemano.

    Responder
    • Juan

      La respuesta del postmap es el usuario SASL que depende de cada instalación, en este caso la respuesta del postmap al comando postmap -q pepe@intervia.com mysql:/etc/postfix/sender_login_maps.cf sería, si el usuario y contraseña coinciden, “pepe.intervia.com”, en caso contrario no devolvería nada.

      Es decir, si está bien configurado te tiene que devolver el usuario SASL cuando preguntas al postmap por el email.

      Responder
  3. Joan

    Hola, Gracias por la respuesta, pero mi duda és que no entiendo que quiere decir con devuelve el “usuario SASL”,
    es el nombre de usuario con el que se logea cada cuenta o es algo diferente?.
    Perdona, pero no lo acabo de entender.
    Gracias.

    Responder
    • Juan

      SASL quiere decir “Simple Authentication and Security Layer” (capa de seguridad y autenticación simple). Es un mecanismo de autentificación de usuarios utilizado por muchos servicios de Internet, y es prácticamente un estándar para la validación de usuarios en servidores de correo en plataformas *nix (Linux, BSD, etc.).

      Lo que devuelve ese comando es el nombre de usuario que corresponde a un email determinado.

      Es el usuario que el Postfix le va a pedir al que intente enviar un email con un remite local, ese usuario lo enviará al SASL, por lo que será necesario el usuario y la contraseña para enviar correo desde ese email en concreto.

      Por tanto, si, ese es el usuario que se usa para enviar el correo.

      Si al darle un email te devuelve un usuario, ese será el usuario que deberá usarse para enviar el correo (con su correspondiente contraseña), si en cambio sale vacío, significa que cualquier podrá enviar correo con ese email de remite (por lo tanto, no funcionará la limitación).

      Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada.