Greylisting per qmail

17 marzo 2025 by Roberto Puzzanghera 0 commenti

Il greylisting è un metodo per difendere le e-mail degli utenti dallo spam. Un mail transfer agent (MTA) che usa il greylisting rigetterà temporaneamente ogni mail da un mittente sconosciuto. Se la mail è legittima, il server di origine della mail ritenterà l'invio dopo un certo tempo, e se è trascorso un intervallo di tempo sufficiente, la mail verrà accettata.

Benchè il greylisting non sia effeicace come in passato, contribuisce sempre a eliminare una certa frazione dello spam totale.

Changelog

  • Mar 17, 2025
    - aggiunta una patch al plugin greylisting per qmail-spp per risolvere un problema di compilazione su rocky 8 (grazie a Shailendra Shukla)
  • 18 aprile 2023
    - Bai Borko ha suggerito un approccio differente per quanto riguarda la pulizia del database jgreylist e ha postato il suo script qui. Sostanzialmente, invece di eliminare i record più vecchi, il suo script lascia i record di IP affidabili negli ultimi 30 giorni, basandosi sul log di qmail-smtpd.

qmail-spp greylisting plugin

Introduciamo qui come implementare il greylisting su qmail attraverso un altro pluginqmail-spp, che salva i dati su MySQL. Avere i dati su MySQL è utile per misurare quanto spam è stato bloccato dal greylisting.

  • Maggiori informazioni qui
  • Autore: Manuel Mausz

Scarichiamo il programma

cd /usr/local/src
wget https://manuel.mausz.at/coding/qmail-spp/greylisting/greylisting-0.5.tgz
wget https://notes.sagredo.eu/files/qmail/patches/greylisting_DEFAULT_SOURCE.patch
tar xzf greylisting-0.5.tgz
cd greylisting-0.5
patch < ../greylisting_DEFAULT_SOURCE.patch

Abbiamo applicato una patch per risolvere un problema nella compilazione su rocky 8 (grazie a Shailendra Shukla). Compile and installare:

cc -std=c99 -o /var/qmail/plugins/greylisting greylisting.c -I/usr/include -I/usr/include/mysql -I/usr/local/include/mysql -L/usr/lib/mysql -L/usr/lib64/mysql -L/usr/local/lib/mysql -L/usr/local/lib64/mysql -lmysqlclient
strip /var/qmail/plugins/greylisting

Installiamo i file di configurazione

cp mysql.cnf /var/qmail/control
chown vpopmail:vchkpw /var/qmail/control/mysql.cnf
chmod 600 /var/qmail/control/mysql.cnf
cp greylisting.config /var/qmail/control/greylisting
chown root:root /var/qmail/control/greylisting
chmod 644 /var/qmail/control/greylisting

Prepariamo il database mysql e creiamo l'utente mysql

> mysql -u root -p

CREATE USER 'greylisting'@'localhost' IDENTIFIED BY '***';
GRANT USAGE ON *.* TO 'greylisting'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
CREATE DATABASE IF NOT EXISTS greylisting;
GRANT ALL PRIVILEGES ON greylisting.* TO 'greylisting'@'localhost';

Ora installiamo lo schema del database dal file greylisting.sql (notare che nello stesso file si trovano degli esempi per le query di tipo whitelist e blacklist):

mysql < greylisting.sql -D greylisting -u greylisting -p

Copiare le proprie credenziali mysql in mysql.cnf file. Per esempio:

cat > /var/qmail/control/mysql.cnf << __EOF__ 
[client] 
#socket=/run/mysqld/mysqld.sock 
#host=10.1.2.3   
user=greylisting 
password=secret
database=greylisting 
__EOF__

La connessione può essere fatta su un host mysql locale, oppure attraverso un socket mysql. Se, come nel mio caso, mysql è installato in un host differente, decommentare la riga "host".

Ora definire la "greylist" nel file smtpplugin:

# smtpplugins sample file 

# other lines here

[rcpt]
plugins/ifauthskip
plugins/greylisting

Per abilitare il greylisting è necessario esportare questa variabile nel proprio ambiente tcpserver. Ad esempio si può aggiungerla nel proprio fil qmail-smtpd/run

export GREYLISTING=""

o abilitare una tcprule in tcp.smtp, per esempio:

:allow,GREYLISTING=""

Notare che il greylisting non è mai abilitato per i RELAYCLIENTS.

Infine modificare i parametri nel file /var/qmail/control/greylisting

cat > /var/qmail/control/greylisting << __EOF__ 
mysql_default_file=control/mysql.cnf 
block_expire=2  
record_expire=2000  
record_expire_good=36  
loglevel=4 
__EOF__

block_expire=2 indica che l'IP verrà bloccato per 2 minuti, mentre record_expire=2000 significa che dopo 2000 minuti sarà nuovamente posto in greylist.

Ora installare in un cronjob il programma che ripulirà il database:

cp greylisting_cleanup.sh /usr/local/sbin/greylisting_cleanup.sh
chmod +x /usr/local/sbin/greylisting_cleanup.sh

Ecco un esempio di crontab

# greylisting 
0 2 * * * /usr/local/sbin/greylisting_cleanup.sh >> /var/log/cron

Se si vuole usare il greylisting anche nella porta submission, sarebbe bene disabilitarlo quando l'utente ha superato l'autenticazione. Per fare questo installiamo il plugin "ifauthskip" dello stesso autore

wget https://notes.sagredo.eu/files/qmail/patches/qmail-spp/plugins/ifauthskip.c
cc -o /var/qmail/plugins/ifauthskip ifauthskip.c

e inseriamolo prima del greylisting in control/smtpplugin

[rcpt]
plugins/ifauthskip
plugins/greylisting

jgreylist

This is a greylist program by John Simpson. It is very good and I honestly I don't know if suggest this one or the previous one. It stores the data on files (have a look to the page of the author for details). He ships both a Perl and a C version of the program.

Here is how to install anche configure the C program:

cd /usr/local/src
wget https://notes.sagredo.eu/files/qmail/patches/greylisting/jms/jgreylist.c
wget https://notes.sagredo.eu/files/qmail/patches/greylisting/jms/jgreylist-clean

Compile and install

cc -o /var/qmail/bin/jgreylist jgreylist.c
chmod 0750 /var/qmail/bin/jgreylist
cp jgreylist-clean /usr/local/sbin/jgreylist-clean
chmod +x /usr/local/sbin/jgreylist-clean
chown root:root /usr/local/sbin/jgreylist-clean

Define your jgreylist directory (where the data will be saved) and let qmail-smtpd to write into it

mkdir -m 0700 /var/qmail/jgreylist
chown vpopmail:vchkpw /var/qmail/jgreylist

add these variables to your qmail-smtpd run file

export JGREYLIST_DIR="/var/qmail/jgreylist" 
export JGREYLIST_LOG_SMTP=1

finally execute jgrelist before qmail-smtpd, for example

exec /usr/local/bin/softlimit -m "$SOFTLIMIT" \
/usr/local/bin/tcpserver -4 -v -R -l "$LOCAL" \
-x /home/vpopmail/etc/tcp.smtp.cdb -c "$MAXSMTPD" \
-u "$QMAILDUID" -g "$NOFILESGID" 0 25 \
/var/qmail/bin/jgreylist \
/var/qmail/bin/qmail-smtpd 2>&1

Install the "clean" program in your cronjob

# jgreylist
0 2 * * * /usr/local/sbin/jgreylist-clean >> /var/log/cron

Now restart qmail.


Bai Borko ha suggerito un approccio differente per quanto riguarda la pulizia del database jgreylist e ha postato il suo script qui. Sostanzialmente, invece di eliminare i record più vecchi, il suo script lascia i record di IP affidabili negli ultimi 30 giorni, basandosi sul log di qmail-smtpd.

Aggiungi un commento

Ultimi commenti
Articoli recenti

RSS feeds