Preparare il database SQL in SpamAssassin

10 settembre 2025 by Roberto Puzzanghera 0 commenti

Scegliere il modulo perl DataBase Interface (DBI) corretto

A seconda che si usi MySQL o MariaDB, e se si usa MySQL le cose dipendono anche dalla versione in uso, è necessario installare il modulo perl DBI DBD::mysql o DBD::MariaDB. Altri connettori per SQLite o Oracle non vengono qui trattati.

Ecco un prospettodella situazione, che è diventata abbastanza complicata:

DB server Versione del server DB Connettore Versione del connettore
MariaDB tutte DBD::MariaDB ultima versione
MySQL 8.x o più recente DBD::mysql 5.x
MySQL precedente alla v. 8 DBD::mysql 4.054 o ultima della serie 4.x

Installare il modulo perl come segue (-T evita i test, le maiuscole sono importanti nei nomi dei moduli):

Utenti MariaDB:

cpan -T install DBD::MariaDB

Utenti MySQL con v. 8.x o successiva:

cpan -T install DBD::mysql

Gli utenti MySQL con versione precedente alla v. 8.x devono invocare la versione specifica in questo modo, altrimenti verrà installata l'ultima versione della serie 5.x:

cpan -T install DVEEDEN/DBD-mysql-4.054.tar.gz

Creazione del database

Aprire il prompt di mysql come root e creare il database e l'utente:

> mysql -u root -p

CREATE DATABASE spamassassin;
CREATE USER 'spamassassin'@'localhost' IDENTIFIED BY '***';
GRANT USAGE ON * . * TO 'spamassassin'@'localhost' IDENTIFIED BY '***' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
USE spamassassin;

Layout delle tabelle

Prepariamo ora in anticipo il layout per le tabelle dei vari plugins che andremo a installare più tardi:

USE spamassassin;

-- userprefs
CREATE TABLE userpref (
  username varchar(100) NOT NULL default '',
  preference varchar(50) NOT NULL default '',
  value varchar(255) NOT NULL default '',
  prefid int(11) NOT NULL auto_increment,
  ts timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY  (prefid),
  KEY username (username)
) ENGINE=InnoDB; 
GRANT ALL PRIVILEGES ON spamassassin . * TO 'spamassassin'@'localhost';
-- The column holding the timestamp can be useful in the future to purge very old records

-- TxRep
CREATE TABLE txrep (
  username varchar(100) NOT NULL default '',
  email varchar(255) NOT NULL default '',
  ip varchar(40) NOT NULL default '',
  msgcount int(11) NOT NULL default '0',
  totscore float NOT NULL default '0',
  signedby varchar(255) NOT NULL default '',
  last_hit timestamp NOT NULL default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (username,email,signedby,ip),
  KEY last_hit (last_hit)
) ENGINE=InnoDB;

-- Bayes
CREATE TABLE bayes_expire (
  id int(11) NOT NULL default '0',
  runtime int(11) NOT NULL default '0',
  KEY bayes_expire_idx1 (id)
) ENGINE=InnoDB;

CREATE TABLE bayes_global_vars (
  variable varchar(30) NOT NULL default '',
  value varchar(200) NOT NULL default '',
  PRIMARY KEY  (variable)
) ENGINE=InnoDB;

INSERT INTO bayes_global_vars VALUES ('VERSION','3');

CREATE TABLE bayes_seen (
  id int(11) NOT NULL default '0',
  msgid varchar(200) binary NOT NULL default '',
  flag char(1) NOT NULL default '',
  PRIMARY KEY  (id,msgid)
) ENGINE=InnoDB;

CREATE TABLE bayes_token (
  id int(11) NOT NULL default '0',
  token binary(5) NOT NULL default '',
  spam_count int(11) NOT NULL default '0',
  ham_count int(11) NOT NULL default '0',
  atime int(11) NOT NULL default '0',
  PRIMARY KEY  (id, token),
  INDEX bayes_token_idx1 (id, atime)
) ENGINE=InnoDB;

CREATE TABLE bayes_vars (
  id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(200) NOT NULL default '',
  spam_count int(11) NOT NULL default '0',
  ham_count int(11) NOT NULL default '0',
  token_count int(11) NOT NULL default '0',
  last_expire int(11) NOT NULL default '0',
  last_atime_delta int(11) NOT NULL default '0',
  last_expire_reduce int(11) NOT NULL default '0',
  oldest_token_age int(11) NOT NULL default '2147483647',
  newest_token_age int(11) NOT NULL default '0',
  PRIMARY KEY  (id),
  UNIQUE bayes_vars_idx1 (username)
) ENGINE=InnoDB;

-- DecodeShortURLs
CREATE TABLE `short_url_cache` (
  `short_url` VARCHAR(255) NOT NULL,
  `decoded_url` VARCHAR(512) NOT NULL,
  `hits` INT NOT NULL DEFAULT 1,
  `created` INT(11) NOT NULL,
  `modified` INT(11) NOT NULL,
  PRIMARY KEY (`short_url`)
) ENGINE = InnoDB;
-- Maintaining index for cleaning is likely more expensive than occasional full table scan
ALTER TABLE `short_url_cache` ADD INDEX `short_url_created` (`created`);

-- Redirectors
CREATE TABLE `redir_url_cache` (
  `redir_url` VARCHAR(255) NOT NULL,
  `target_url` VARCHAR(512) NOT NULL,
  `hits` INT NOT NULL DEFAULT 1,
  `created` INT(11) NOT NULL,
  `modified` INT(11) NOT NULL,
  PRIMARY KEY (`redir_url`)
) ENGINE = InnoDB;
-- Maintaining index for cleaning is likely more expensive than occasional full table scan
ALTER TABLE `redir_url_cache` ADD INDEX `redir_url_created` (`created`);

Configurazione dei plugin DecodeShortURLsDecodeShortURLs

DecodeShortURLs / UrlShortener espande automaticamente gli URL brevi (tinyurl, bit.ly, ecc.) in URL canonici  e normalizza gli URL per l'attribuzionedel punteggio. Inoltre ha una cache cache nel database per evitare richieste ripetute.

Redirectors segue i reindirizzamenti HTTP (301, 302, meta-refresh, ecc.) per ottenere la destinazione finale di un URL. Inoltre salva il risultato finale in una cache sul database.

Le impostazioni dei vari plugin saranno presentate nelle pagine seguenti. Per ora configuriamo solo DecodeShortURLsRedirectors,dato che le loro impostazioni sono veramente semplici e minimali.

Prima di tutto abilitiamoli decommentando quanto segue nel file v402.pre

loadplugin Mail::SpamAssassin::Plugin::Redirectors

e nel file v400.pre:

loadplugin Mail::SpamAssassin::Plugin::DecodeShortURLs

Ora aggiungiamo le loro impostazioni al file 90-sql.conf, che useremo anche in seguito per salvare tutte le impostazioni riguardanti il database SQL:

# spamassassin MySQL user pwd
MYSQL_PWD=xxxxxxx
# mysql host
MYSQL_HOST=localhost
# perl DBI driver
PERL_DBI="DBD::MariaDB"

cat >> /etc/mail/spamassassin/90-sql.cf << __EOF__
# DecodeShortURLs plugin 
# https://spamassassin.apache.org/full/4.0.x/doc/Mail_SpamAssassin_Plugin_DecodeShortURLs.html 
# https://github.com/apache/spamassassin/blob/trunk/sql/decodeshorturl_mysql.sql 
url_shortener_cache_type        dbi 
url_shortener_cache_dsn         ${PERL_DBI}:database=spamassassin;host=localhost;
url_shortener_cache_username    spamassassin 
url_shortener_cache_password    ${MYSQL_PWD} 

# Redirectors plugin 
# https://spamassassin.apache.org/full/4.0.x/doc/Mail_SpamAssassin_Plugin_Redirectors.html 
# https://github.com/apache/spamassassin/blob/trunk/sql/redirectors_mysql.sql 
url_redirector_cache_type       dbi 
url_redirector_cache_dsn        ${PERL_DBI}:database=spamassassin;host=localhost;
url_redirector_cache_username   spamassassin 
url_redirector_cache_password   ${MYSQL_PWD}

__EOF

Nel comando di sopra, impostare la propria password MariaDB/MySQL per l'utente spamassassin, e il connettore (driver) che si sta utilizzando nella variabile PERL_DBI (DBD::MariaDB o DBD::mysql).

MYSQL_HOST è solitamente localhost se il database vive nella stessa macchina in cui gira SpamAssassin.

Pulire periodicamente la cache

Creare un file /usr/local/bin/purge_sa_cache.sh al fine di pulire periodicamente la cache dei record più vecchi di un anno:

#!/bin/bash

DB_USER="spamassassin"
DB_PASS="password"
DB_NAME="spamassassin"
DB_HOST="localhost"
DB_PORT="3306"
MYSQL_BIN=/usr/bin/mysql
# purge Redirectors $MYSQL_BIN -u"$DB_USER" -p"$DB_PASS" -h "$DB_HOST" -P "$DB_PORT" "$DB_NAME" << __EOF__ DELETE FROM redir_url_cache WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 YEAR));
# purge DecodeShortURLs DELETE FROM short_url_cache WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 YEAR)); __EOF__

Impostare i privilegi

chmod +x /usr/local/bin/purge_sa_cache.sh
chmod go-wrx /usr/local/bin/purge_sa_cache.sh

Aggiungere al crontab:

cat >> /etc/cron.d/qmail << __EOF__

# purge SpamAssassin's cache
0 3 * * 0 root /usr/local/bin/purge_sa_cache.sh >> /var/log/cron 2>&1
__EOF__

Aggiungi un commento

qmail notes

Pay me a coffee:

PayPal - The safer, easier way to pay online.

LXC scripts
Other contents
Guide per gli utenti
Ultimi commenti
Articoli recenti

RSS feeds