systemadmin.es > Correo > Usar una base de datos MySQL como modo de almacenaje del clasificador bayesiano de SpamAssassin

Usar una base de datos MySQL como modo de almacenaje del clasificador bayesiano de SpamAssassin

Una de las ventajas de usar el modulo de almacenaje de MySQL para el clasificador bayesiano de spamassassin es que simplificamos el backup de dicha base de datos, ya que se hace conjuntamente con el resto de bases de datos del MySQL.

Además, en servidores muy cargados nos podemos encontrar con problema de concurrencia al acceder al fichero que almacena el clasificador. Por ejemplo, en el /var/log/maillog podríamos encontrar lo siguiente:

spamd[12486]: bayes: cannot open bayes databases /home/spamd/.spamassassin/bayes_* R/W: lock failed: File exists

Para poder instalar el modulo de MySQL deberemos tener instalados los siguientes módulos de perl:

  • DBI
  • DBD::mysql

En el caso que no estén instalados deberemos hacerlo mediante el comando cpan y la siguiente instrucción:

install DBI
install DBD::mysql

A continuación deberemos crear la base de datos donde almacenar las tablas:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 401831
Server version: 5.1.34 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database bayesstore;
Query OK, 1 row affected (0.00 sec)

A continuación podemos cargar la definición de las tablas usando el fichero sql/bayes_mysql.sql presente en el código fuente de spamassassin. Para nuestro caso cambiaremos el Storage Engine de MyISAM a InnoDB por tratarse de un entorno de alta concurrencia:

cat sql/bayes_mysql.sql | sed 's/MyISAM/InnoDB/g' | mysql -u root -p bayesstore

La definición de las tablas quedaría como la siguiente:

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

CREATE TABLE bayes_global_vars (
  variable varchar(30) NOT NULL default '',
  value varchar(200) NOT NULL default '',
  PRIMARY KEY  (variable)
) TYPE=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)
) TYPE=InnoDB;

CREATE TABLE bayes_token (
  id int(11) NOT NULL default '0',
  token char(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 (token),
  INDEX bayes_token_idx2 (id, atime)
) TYPE=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)
) TYPE=InnoDB;

A continuación deberemos crear un usuario y contraseña para el acceso a dicha base de datos por parte de spamassassin:

GRANT usage ON bayesstore.* TO bayes@localhost identified by 'b9y3sp9ssw0rd';
GRANT SELECT, UPDATE, DELETE, INSERT ON bayesstore.bayes_token TO bayes;
GRANT SELECT, UPDATE, DELETE, INSERT ON bayesstore.bayes_vars TO bayes;
GRANT SELECT, DELETE, INSERT ON bayesstore.bayes_seen TO bayes;
GRANT SELECT, DELETE, INSERT ON bayesstore.bayes_expire TO bayes;
GRANT SELECT ON bayesstore.bayes_global_vars TO bayes;

A continuación hacemos un backup del clasificador bayesiano de spamassassin:

sa-learn --backup > /home/backup/spamassassin/backup.sa
sa-learn --clear

Finalmente deberemos modificar la configuración de SpamAssassin editando el fichero “local.cf“, por ejemplo en /etc/mail/spamassassin/zz_local_cf/local.cf.

En el caso genérico de usar un MySQL con alguna versión actual (superior a MySQL 4.1) deberemos añadir la siguiente linea:

bayes_store_module Mail::SpamAssassin::BayesStore::MySQL

En el caso extraño que se debiera usar una versión anterior por algún motivo deberíamos usar en su lugar el siguiente modulo genérico:

bayes_store_module Mail::SpamAssassin::BayesStore::SQL

A continuación deberemos definir las credenciales de acceso a la base de datos:

bayes_sql_dsn                   DBI:mysql:bayesstore:localhost
bayes_sql_username              bayes
bayes_sql_password              bayerpassword

Mediante bayes_sql_dsn estamos indicando que se trata de un MySQL, en la base de datos llamada “bayesstore” que se encuentra en localhost.

Con la configuración definida podemos proceder a cargar desde el backup que hemos hecho anteriormente mediante sa-learn:

sa-learn --restore /home/backup/spamassassin/backup.sa

Finalmente reiniciamos el spamd, si lo tenemos con daemontools lo podemos hacer con el siguiente comando:

svc -t /service/spamd/

One comment to “Usar una base de datos MySQL como modo de almacenaje del clasificador bayesiano de SpamAssassin”

  1. Ante todo, felicidades por el blog ! Estoy aprendiendo mucho contigo !

    He visto en este post que comentas algo de copias de seguridad de MySQL. Para mis servidores hice con un script que hace una lista de las db’s con show databases y me separaba cada db en un .sql diferente que luego comprimo con gz.

    Por curiosidad, que usas tu para hacer las copias de seguridad de MySQL ?

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>