Plugin para qmail

Procedo a «liberar» un plugin que hice hace unos meses para qmail mediante el cuál, se puede realizar un rate limit de los emails que envía una cierta dirección.

El proceso consiste en guardar en una tabla en MySQL las direcciones que qmail va «viendo». Existe otra tabla en la que se guarda el valor por defecto que se le quiere dar al límite (por ejemplo, 100 mensajes) y si se llega a dicho límite en un rango de tiempo (por defecto, en 1 hora) el mensaje es rechazado a nivel de SMTP temporalmente.

Existe también la posibilidad de poner límites diferentes para determinadas direcciones; por ejemplo, alguna persona que por X razón legítima necesite enviar más correos.

Además, existe una lista blanca para IPs a las cuáles no aplicar dichos límites. Por ejemplo, si tenemos unos relays de entrada.

Qmail debe estar parcheado con SPP para poder usar este plugin. Por ejemplo, el qmail de Plesk viene de serie ya parcheado, por lo que no hay más que copiarlo en /var/qmail/plugins/ y añadirlo en el archivo /var/qmail/control/smtpplugins.

En la siguiente URL puede ser descargado:

http://postmaster.hostalia.com/rate_from

31 comentarios en “Plugin para qmail

  1. hola Alvaro

    Voy a probar tu script.
    En teoría esto no sirve para limitar los emails que puede enviar un SCRIPT Via PHP, correcto ?

    Creo que he visto un script parecido en
    http://www.enderunix.org/spamguard/

    ¿Que soluciones usas para limitar los envios via php?

    Un saludo

    Oscar

  2. Efectivamente, los envíos desde PHP se hacen vía qmail-inject en vez de por qmail-smtpd, por lo que no pueden limitarse con este script.

    Para controlar esos mensajes (y todos en general), puedes usar un servidor externo a modo de relay de salida.

  3. Hola Alvaro,

    Has comentado que un servidor externo en modo de relay para controlar la salida de mensajes… Me he quedado casi igual …

    ¿porque ayudaría un servidor externo? Tienes alguna referencia que pueda usar para comprenderlo?

    ¿Qué haces tu para controlarlo desde el propio servidor?
    Me refiero sobre todo al envio de mensajes desde scripts php spammers que puedan haber infectado algun dominio y han subido mailers. En hotmail este mes me están fundiendo a bloqueos y no logro encontrar a los scripts malignos.

    Estoy usando el Smart Network Data Services de Hotmail para que me dé más información y he encontrado a algun dominio valido que envia mucho email pero a los scripts «malos» nó.

    Uso qmail y Plesk y sigo lo que describe en los articulos principalmente para encontrar a los sospechosos.
    http://kb.parallels.com/article_22_1711_en.html
    http://kb.parallels.com/en/766

    Que «protocolo» sigues tú ?

    Un abrazo

    Oscar

  4. Hola Oscar,

    enrutando por un servidor externo todo el tráfico SMTP saliente, todos los mensajes le llegan por qmail-smtpd a dicho servidor, por lo que el 100% de los mensajes salientes pueden ser controlados.

    Los artículos que enlazas, dan medidas para detectar esos envíos fraudulentos, sí. El protocolo que seguimos, obviamente, no puede hacerse público por medidas de seguridad.

    Un saludo,
    Álvaro.

  5. Buenos dias Alvaro

    Tienes alguna referencia para ver como se puede enrutar el trafico SMTP Saliente a un servidor externo ?

    Lo que no veo claro es como controlas los envios desde scripts php desde ese servidor externo…

    No he visto nada parecido en los foros habituales…

    A ver si puedes ilustrarnos sin dar los detalles del «protocolo» especifico que sigues para no desvelar el «secreto».

  6. Alvaro, solo queria agradecerte y felicitarte, muy bueno tu script y explicacion, me fue de mucha utilidad.

  7. Hola Álvaro,

    Soy un usuario de plesk y estoy intentando poner tu script para funcionar, pero tengo una duda.

    Que quieres decir como «añadirlo en el archivo /var/qmail/control/smtpplugins.»

    Que es lo que debo añadir y como exactamente?

    Gracias de ante mano
    Un saludo.

  8. Gracias Aldo!

    Marcelo, perdona el retraso, en el archivo /var/qmail/control/smtpplugins del qmail instalado por Plesk, tendrás algo como:

    [rcpt]
    plugins/chkrcptto
    plugins/badhelo

    Simplemente, debes añadir la línea de rate_from para dejarlo como:

    [rcpt]
    plugins/chkrcptto
    plugins/badhelo
    plugins/rate_from

    habiendo dejado el script de rate_from en /var/qmail/plugins/ con permisos de ejecución.

  9. Hola,

    Lo instalé y veo que genera registros en la tabla rate_frame pero no me funciona la limitación. Por ejemplo, si le pongo para el correo xxx@xxx.com un máximo de 8 correos a enviar (lo doy de alta en rate_from_default), cuando envio desde ese correo mas de 8 mensajes/hora pues me permite seguir enviando. Uso plesk con centos5.

    ¿Alguna pista?

    Gracias!

  10. Vaya ahora me sale esto al enviar un correo: »
    Insecure dependency in « while running setuid at plugins/rate_from line 158.»

    ¿pistas?

  11. Hola edu,

    ¿qué te sale en el archivo /var/log/rate_from.log ? Algún mensaje de REJECT, UPDATE…etc?

  12. Alvaro felicito nuevamente porque el plugin anda de maravillas. Mi consulta es, ya que busque por la web y no encontre, algo que limite a los envios a traves de scripts hechos con php.
    Cualquier sugerencia es valida (uso plesk 9.5, centos 5 y qmail)
    Ante todo mil gracias!

  13. @Aldo se agradece!
    El tema de los envíos a través de scripts PHP nosotros los controlamos en unos servidores de salida de correo. En el momento de hacer el «rate_from» no vi manera sencilla de hacerlo desde algún tipo de plugin :(

    Si es para detectar quién realiza los envíos, puedes usar algo como lo que dicen por aquí:

    http://kb.parallels.com/article_22_1711_es.html

    pero ya te digo que para controlarlos vía «rate_from» o similar, no vi forma sencilla.

  14. Alvaro, tu script es buenisimo, pero tengo una consulta, al agregarlo en el [rcpt] tambien me esta contando las direcciones de mail externas, hay alguna manera de no chequear esto ? que solamente chequee los mails locales ?

  15. Hola Gustavo,

    ummm si tus usuarios hacen login con SMTP AUTH para el envío de correo (y nada más, como la autenticación Pop-Before-SMTP), podrías añadir un «if» que compruebe la variable SMTPAUTHUSER al principio del script.

    Esta variable (ojo! el qmail de Plesk tenía un bug hasta hace poco con dicha variable, ya que eliminaba su valor) guarda el usuario con que se ha hecho login vía SMTPAUTH, por lo que entendemos que si está vacía es que el envío es remoto. Bastaría con añadir pues:

    if ( !$ENV{«SMTPAUTHUSER»} ){
    exit();
    }

    Como decía, esto solamente vale si todos tus usuarios usan la autenticación SMTP para el envío de correo.

    Nosotros disponemos de relays de entrada por lo que con poner las IPs de los relays en el array de @host_whitelist ya teníamos solucionado ese problema.

  16. Hola Alvaro, muchas gracias, creo que esto va a ser util ya que uso SMTP AUTH. Voy a probar y te cuento como me fue. FYI estoy usando la ultima version de Plesk.

  17. Hola Álvaro

    una duda muy breve , ¿qué pasa con los emails «temporalmente» rechazados? ¿Llegarán a enviarse? ¿Los podemos listar en la cola de qmail?

    Saludos

  18. Hola Rubén,

    el error temporal se da al que intenta enviar el mensaje, que puede ser:

    1) un servidor de correo: por lo que el mensaje se quedará encolado en dicho servidor origen. Éste, reintentará el envío varias veces durante varios días (es la configuración habitual), por lo que será entregado en el momento que expire el límite (1 hora como máximo).

    2) un cliente: le dará el error al hacer el envío desde su cliente de correo.

    En la cola de qmail no se guarda mail alguno de este tipo, ya que los rechazos se realizan a nivel SMTP.

    Saludos.

  19. Hola Alvaro,

    Soy Toni, te queria comentar que he implementado tu plugin en nuestro servidor y se han creado un total de 7 registros nuevos pero a partir de aqui no se ha creado ningún registro más ni he podido enviar correu alguno, no se si me podrías dar alguna pista de lo que podría estar ocurriendo.

    Muchas gracias por tu tiempo y un saludo.

  20. Hola Alvaro…muy interesante tu scrip, pero podrías ser un poco más explicito en las instrucciones de instalación de tu script. Por lo que veo se debe crear la BDD a mano….

    Gracias.

  21. Para crear la base de datos y las tablas, no hay más que seguir los pasos que se incluyen como comentarios en el propio script:

    # Installation steps:
    #
    # mysql> create database rate_from;
    # mysql> use rate_from;
    # mysql> create table rate_from (
    # id int NOT NULL auto_increment,
    # mail_from varchar(150) NOT NULL,
    # count int(10),
    # timestamp int(11),
    # PRIMARY KEY (`id`),
    # KEY `mail_from` (`mail_from`)
    # );
    # mysql> create table rate_from_default (
    # id int NOT NULL auto_increment,
    # mail_from varchar(150) NOT NULL,
    # count int(10),
    # PRIMARY KEY (`id`),
    # KEY `mail_from` (`mail_from`)
    # );
    #
    # Set the default limit:
    #
    # mysql> insert into rate_from_default values(«»,»default»,»100″);
    #
    # You can insert in rate_from_default a different value for some accounts:
    #
    # mysql> insert into rate_from_default values(«»,»foo@foobar.com»,»1000″);
    #
    # Set permissions to access:
    #
    # mysql> grant all on rate_from.* to user@’127.0.0.1′ identified by «password»;
    #
    # Create an archive called: /var/log/rate_from.log with write permissions for qmail user.
    #

  22. Buenos días Alvaro.
    He seguido los pasos para poner en marcha el plug-in, pero al activarlo y enviar, recibo la siguiente respuesta por parte del servidor.
    «Ocurrio un error al enviar el mensaje. El servidor de correo respondió: qmail-spp:failure:plug-in/rate_form: can’t execute (#4.3.0). Por favor compruebe el destinatario del mensaje xxx@xxxxx.com y vuelva a intentarlo».
    Se trata de un Plesk 11.5 y el archivo plug-in tiene permisos para ser ejecutado por el usuario qmail.

    Muchas gracias y recibe un cordial saludo.

  23. Hola Jesús G,

    Comprueba lo siguiente:

    $ perl -wc /var/qmail/plugins/rate_from
    /var/qmail/plugins/rate_from syntax OK

    Debe darte ese «syntax OK».

  24. Hola,

    Funciona bien, pero tambien controla los emails entrantes. ¿ Hay manera de que no registre los usuarios del server?. En princiio no me interesa controlar los entrantes

  25. Hola Anabel,

    en nuestro caso, para el tráfico entrante, era fácil ya que todo el correo venía desde unas máquinas frontera; de ahí esta variable:

    # Whitelisted hosts
    my @host_whitelist=(«X.X.X.X»,»X.X.X.X»);

    Se me ocurre que se podría sacar un listado de todas las cuentas del servidor y añadirlas a la tabla rate_from_default con un límite deseado y luego poner el default a un valor muy alto. De esta forma, el correo saliente tendría como límite el introducido para la cuenta y el correo entrante, el default.

  26. Hola Alvaro, por favor tu orientación respecto a este plug in.

    ultimamente en ese log esta quedando registrado unos avisos con «Update» , «expire» y «New Record» , ejemplo.

    14/12/14 07:21:05 – EXPIRE: user@dominio.com: 1
    14/12/14 07:21:06 – UPDATE: user@dominio.com: 2
    14/12/14 07:21:07 – UPDATE: user@dominio.com: 3
    14/12/14 12:29:33 – NEW RECORD: bounce-mc.us9_33212137.734829-USER=DOMINIO.COM@mail183.atl61.mcsv.net: 1

    sabes por que puede estar ocurriendo ese error?

    te agradeceria infinitamente tu ayuda

  27. Hola Marcela Martinez Rojas,

    es normal, son los mensajes que deja el script para saber qué está ocurriendo en cada momento. Registros que expiran, que se actualizan, nuevos registros…etc

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *