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 perqmail-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 databasejgreylist
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
Questo è programma per greylist di John Simpson. E' molto buono anche questo e onestamente non saprei se suggerire per primo questo o quello di sopra.
II dati sono salvati su file (vedere la pagina dell'autore per i dettagli). Simpson rilascia il programma sia in versione Perl che C.
Ecco come fare l'installazione e la configurazione del programma C:
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
Compilare e installare
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
Definire la propria directory jgreylist
(dove saranno salvati i dati) e fare in modo che qmail-smtpd
possa scriversi
mkdir -m 0700 /var/qmail/jgreylist
chown vpopmail:vchkpw /var/qmail/jgreylist
Aggiungere queste variabili al run file di qmail-smtpd
export JGREYLIST_DIR="/var/qmail/jgreylist" export JGREYLIST_LOG_SMTP=1
Infine eseguire jgrelist
prima di qmail-smtpd
, per esempio:
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
Installare il programma "clean" nel proprio cronjob
# jgreylist 0 2 * * * /usr/local/sbin/jgreylist-clean >> /var/log/cron
Ora riavviare 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.