ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2013:08:13:spamassassin_bayes_avec_mysql

SpamAssassin Bayes avec MySQL

Factoriser l'efficacité des frontaux de mails pour lutter contre le SPAM, en mutualisant les bases Bayes.

On va le faire grâce a MySQL .

~~READMORE~~

Bayes

MySQL

Préparer un serveur MySQL…

Dixit la doc: préférer le moteur “MyISAM”.

Les schemas de la base de données sont dans:

  • /usr/share/doc/spamassassin/sql/userpref_mysql.sql
  • /usr/share/doc/spamassassin/sql/bayes_mysql.sql

En tant que “root”, on va créer les “databases” et puis les “users” :

$ mysql -u root -p 

Créer la database “sa_bayes” :

mysql> create database sa_bayes;

On revient sous le shell, et on créé les tables associés a la base:

$ mysql -u root -p sa_bayes < userpref_mysql.sql
$ mysql -u root -p sa_bayes < bayes_mysql.sql
:!: En fait, ça bloque sur “TYPE=MyISAM

Pour rectifier, j'ai fait plutôt:

$ sed -e 's/TYPE=MyISAM/ENGINE=MyISAM/' userpref_mysql.sql | mysql -u root -p sa_bayes
$ sed -e 's/TYPE=MyISAM/ENGINE=MyISAM/' bayes_mysql.sql | mysql -u root -p sa_bayes
:!: si possible, préférer: ENGINE=InnoDB
:!: bayes_token.token doit être de type “binary(5)” et pas “char(5)

On retourne dans MySQL pour créer les “users” :

$ mysql -u root -p 

Comme j'ai 2 frontaux, je créé un compte pour chaque:

mysql> CREATE USER 'sa_user'@'mx0.local.eez.fr' IDENTIFIED BY 'SECRET_1';
mysql> CREATE USER 'sa_user'@'mx1.local.eez.fr' IDENTIFIED BY 'SECRET_2';

Maintenant, definir les droits (limités) de ces utilisateurs.
“mx0” d'abord :

mysql> GRANT SELECT, UPDATE, DELETE, INSERT ON sa_bayes.bayes_token TO 'sa_user'@'mx0.local.eez.fr';
mysql> GRANT SELECT, UPDATE, DELETE, INSERT ON sa_bayes.bayes_vars TO 'sa_user'@'mx0.local.eez.fr';
mysql> GRANT SELECT, UPDATE, DELETE, INSERT ON sa_bayes.bayes_seen TO 'sa_user'@'mx0.local.eez.fr';
mysql> GRANT SELECT, DELETE, INSERT ON sa_bayes.bayes_expire TO 'sa_user'@'mx0.local.eez.fr';
mysql> GRANT SELECT ON sa_bayes.bayes_global_vars TO 'sa_user'@'mx0.local.eez.fr';

Faire de même pour “mx1” …

FIXME A quoi sert la table userpref ?

Migration

On ne pourra pas migrer toutes les bases des frontaux: il faudra en choisir une parmi les frontaux.

Ceci fait, on devient l'utilisateur qui gère le spam. Chez moi, c'est “debian-spamd” :

# su -s /bin/bash debian-spamd
$
$ cd ~
$ mkdir tmp
$ cd tmp
$ sa-learn --sync
$ sa-learn --backup > backup.txt

Et pour info:

$ sa-learn --dump magic > magic-info.txt

Maintenant, on peut modifier le fichier local.cf : :!: voir section suivante !

Aprés cela, on importe le “backup” dans MySQL comme ça:

$ sa-learn --restore backup.txt

Un petit coup de sa-learn –dump magic , et on retrouvera des informations proche de qu'on a dans le fichier “magic-info.txt”.

Configuration

Pré-requis:

# aptitude install libdbi-perl libdbd-mysql-perl

Sinon: “bayes: unable to connect to database: DBI module not available

Dans /etc/spamassassin/local.cf :

bayes_store_module            Mail::SpamAssassin::BayesStore::MySQL

#bayes_sql_dsn                DBI:driver:database:hostname[:port]
bayes_sql_dsn                 DBI:mysql:database=sa_bayes;host=<DBHOST>;

bayes_sql_username            <DBUSER>
bayes_sql_password            <DBPASS>

bayes_sql_override_username   debian-spamd

:!: Si existe, commenter ses lignes comme ça:

# bayes_path xxxxxxxxx
# bayes_file_mode xxxx

Tester

Déjà, si vous avez procédé à une restauration du backup avec “sa-learn restore …” (revoir plus haut) , c'est que ça marche .

Ensuite, on peut vérifier que la base est toujours UP en tapant:

$ sa-learn --dump magic

Et enfin, si par malheur la base est indisponible, et bien spamassassin le signale dans les entête de mails par un pathétique autolearn=unavailable et poursuit la livraison du mail: OUF

SSL

Comme vous avez suivit mon tuto (humhum) pour installer MySQL avec SSL .

Retour dans MySQL

$ mysql -u root -p

Récuperer le hash du “password”, car je suis certain que vous l'avez oublié ! Noooon je déconne.

mysql> show grants for sa_user@mx0.local.eez.fr;
.... IDENTIFIED BY PASSWORD '<HASHED_PASSWORD>'

Alors, soit on rajoute que le “SSL”, ce qui est minable:

mysql> GRANT USAGE ON *.* TO 'sa_user'@'mx0.local.eez.fr' IDENTIFIED BY PASSWORD '<HASHED_PASSWORD>' \
       REQUIRE SSL;

Soit, on fait la totale, avec “Sujet” et “Complément” (ou l'inverse?) :

mysql> GRANT USAGE ON *.* TO 'sa_user'@'mx0.local.eez.fr' IDENTIFIED BY PASSWORD '<HASHED_PASSWORD>' \
       REQUIRE SUBJECT '/C=FR/ST=Some-State/L=Paris/O=xxx/OU=xxx/CN=xxx/emailAddress=xxx' \
       AND ISSUER '/C=FR/ST=Some-State/L=Paris/O=xxx/OU=xxx/CN=xxx/emailAddress=xxx';

Dans tout les cas, il faut apporter des modifications à l'option “bayes_sql_dsn” dans /etc/spamassassin/local.cf . Pour exemple:

bayes_sql_dsn DBI:mysql:database=sa_bayes;host=mail.local.eez.fr;mysql_ssl=1;mysql_ssl_ca_file=/var/lib/spamassassin/mysql_certs/mysql-ca-cert.pem;mysql_ssl_client_cert=/var/lib/spamassassin/mysql_certs/mysql-client_mx0-cert.pem;mysql_ssl_client_key=/var/lib/spamassassin/mysql_certs/mysql-client_mx0-key.pem;  

C'est illisible… :-X

Sources

blog/2013/08/13/spamassassin_bayes_avec_mysql.txt · Dernière modification : 2021/12/28 21:02 de thierry