Sitio para la difusión de conocimiento informático. 

Twitter RSS

Bayes en Spamassassin

Bayes en Spamassassin

El clasificador Bayesiano de Spamassassin trata de identificar el spam al ver lo que se llaman tokens, palabras o secuencias cortas de caracteres que se encuentran comúnmente en el spam o el ham. Si he entregado 100 mensajes a sa-learn que tiene la frase ampliación del pene y digo que se trata de un spam, cuando el mensaje 101 llega con las palabras pene y ampliación, el clasificador Bayesiano estará bastante seguro de que el nuevo mensaje es spam y aumentará la puntuación de ese mensaje. Más información en: http://wiki.apache.org/spamassassin/BayesFaq

En el siguiente ejemplo veremos como configurar Bayes en Spamassassin, usando una base de datos en MySQL lo que nos dará mayor rendimiento en el procesamiento de los correos. Quitando las tareas detalladas en el punto 3.1 del índice detallado a continuación, nos dejará una instalación de Bayes con una base de datos MySQL local. Lo que nos permite el punto 3.1 es poder replicar los nuevos correos aprendidos como SPAM o HAM, a otro servidor de correo y viceversa. Esto nos permite optimizar el procesamiento de correos y tener un respaldo de nuestra base Bayesiana.

Índice:
1.1 Instalación de Bayes
2.1 Configuración para MySQL
3.1 Configuración para Cluster MySQL
4.1 Comandos para administrar Bayes

1.1 Instalación de Bayes

– Primero debemos resolver dependencias de Bayes  y Bayes para MySQL.

Comenzamos instalando los siguientes paquetes para nuestra distribución mediante el gestor de paquetes de nuestro agrado:
DBI-1.38
DBD-mysql-2.9002
perl v5.8.0
mysql server
mysql client
Y mediante CPAN resolvemos las sigueintes dependencias:
Mail::SpamAssassin::Bayes
SpamAssassin::SQL::Bayes

 

2.1 Configuración de Bayes para MySQL

– Agregamos las siguientes lineas en el archivo de configuración principal de Spamassassin (/etc/mail/spamassassin/local.cf):

bayes_store_module Mail::SpamAssassin::BayesStore::MySQL
bayes_sql_dsn DBI:mysql:bayesdatabase:localhost:3306
bayes_sql_username spamd
bayes_sql_password password

auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn DBI:mysql:sa_bayes:localhost:3306
user_awl_sql_username spamd
user_awl_sql_password password

 

– Creamos la base de datos en MySQL para Bayes
mysql –u root -p
password

mysql> create database bayesdatabase;

mysql> create user ‘spamd’@’localhost’ identified by ‘password’;

mysql> grant all privileges on *.* to ‘spamd’@’localhost’ identified by ‘password’ with grant option;

mysql –u user -p
password

mysql>use bayesdatabase;

CREATE TABLE bayes_expire (
id int(11) NOT NULL default ‘0’,
runtime int(11) NOT NULL default ‘0’,
KEY bayes_expire_idx1 (id)
) TYPE=MyISAM;
CREATE TABLE bayes_global_vars (
variable varchar(30) NOT NULL default ”,
value varchar(200) NOT NULL default ”,
PRIMARY KEY (variable)
) TYPE=MyISAM;

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=MyISAM;

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=MyISAM;

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=MyISAM;

CREATE TABLE awl (
username varchar(100) NOT NULL default ”,
email varchar(200) NOT NULL default ”,
ip varchar(10) NOT NULL default ”,
count int(11) default ‘0’,
totscore float default ‘0’,
PRIMARY KEY (username,email,ip)
) TYPE=MyISAM;

USE bayesdatabase;

ALTER TABLE awl TYPE=InnoDB;
ALTER TABLE bayes_expire TYPE=InnoDB;
ALTER TABLE bayes_global_vars TYPE=InnoDB;
ALTER TABLE bayes_seen TYPE=InnoDB;
ALTER TABLE bayes_token TYPE=InnoDB;
ALTER TABLE bayes_vars TYPE=InnoDB;
ANALYZE TABLE awl;
ANALYZE TABLE bayes_expire;
ANALYZE TABLE bayes_global_vars;
ANALYZE TABLE bayes_seen;
ANALYZE TABLE bayes_token;
ANALYZE TABLE bayes_vars;
ALTER TABLE awl ADD lastupdate timestamp(14) NOT NULL;
UPDATE awl SET lastupdate = NOW( ) WHERE lastupdate < 1;

 

3.1 Configuración para Cluster MySQL

A continuación veremos como configurar MySQL para replicar una base de datos a otro servidor MySQL, y viceversa.

– Configuramos MySQL para que replique los datos con el otro servidor de correo:
Nos logueamos en Mysql con usuario “root”:

mysql –u root –p

– Creamos el Usuario:
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repuser’@’localhost’ IDENTIFIED BY ‘reppass’;

– Editamos el archivo de configuración de Mysql “my.cnf”, y agrego y comento las siguientes líneas:

(Servidor Master)
#skip-networking
#bind-address = 127.0.0.1

log-bin=mysql-bin
binlog-do-db=bayesdatabase
server-id=1
sync_binlog=1

master-host=2.2.2.2
master-user=repuser
master-password=reppass
master-connect-retry=60
replicate-do-db=bayesdatabase
slave-skip-errors = 1062
(El siguiente valor permite que los dos “Masters” puedan convivir para replicarce los datos de forma cíclica, es importante que el “offset” no sea igual)
auto_increment_increment = 10
auto_increment_offset=1
innodb_lock_wait_timeout = 5
innodb_flush_log_at_trx_commit = 1

(Servidor Esclavo)
#skip-networking
#bind-address = 127.0.0.1

log-bin=mysql-bin
binlog-do-db=bayesdatabase
server-id=2
innodb_flush_log_at_trx_commit=1
sync_binlog=1

master-host=1.1.1.1
master-user=repuser
master-password=reppass
master-connect-retry=60
replicate-do-db=bayesdatabase
slave-skip-errors = 1062

#(El siguiente valor permite que los dos “Masters” puedan convivir para replicarse los datos de forma cíclica, es importante que el “offset” no sea igual)

auto_increment_increment = 10
auto_increment_offset=2
innodb_lock_wait_timeout = 5
innodb_flush_log_at_trx_commit = 1

– Reinicio Mysql para que los cambios tengan efecto:

/etc/init.d/mysql stop
/etc/init.d/mysql start

– Servidor master:

mysql -u root -p
Enter password:
SLAVE STOP;

CHANGE MASTER TO MASTER_HOST=’2.2.2.2′, MASTER_USER=’usuario’, MASTER_PASSWORD=”;

Slave Start;
Quit

– Servidor slave:

mysql -u root -p
Enter password:
SLAVE STOP;

CHANGE MASTER TO MASTER_HOST=’1.1.1.1′, MASTER_USER=’repuser’, MASTER_PASSWORD=”;

Slave Start;
Quit

 

4.1 Comandos para administrar Bayes

– Para trabajar sobre la base bayesiana es FUNDAMENTAL estar logueados con el usuario configurado para Spamassassin. En este ejemplo en ambos servidores usaremos el usuario “nobody”, debemos pasarnos al usuario “nobody”: sudo su nobody

– Una vez que estamos como usuario “nobody”, podemos comenzar a trabajar sobre la base bayesiana:

Ver los plug-in habilitados en spamassassin y el estado de la base bayesiana:
spamassassin –lint -D

Sincronizar la base bayesiana (memoria a disco):
sa-learn –sync

Forzar a que expiren las entradas viejas de la base:
sa-learn –force-expire -D

Respaldar la base:
sa-learn –backup > servidor_1_bayes.db (respaldo la base bayesiana del servidor_1), o
sa-learn –backup > servidor_2_bayes.db (respaldo la base bayesiana del servidor_1).

Limpiar la base bayesiana antes de restaurar un respaldo:
sa-learn –clear

Restaurar un respaldo previo o el respaldo del otro servidor:
sa-learn –restore servidor_1_bayes.db (restauro la base bayesiana del servidor_1 en el servidor_2), o
sa-learn –restore servidor_2_bayes.db (restauro la base bayesiana del servidor_2 en el servidor_1).

Wiki:
(http://spamassassin.apache.org/full/3.3.x/doc/sa-learn.html).

 
Home Linux OS Spamassassin Bayes en Spamassassin