CentOS

2007/4/09 12:15 PM 更新

SpamAssassin+MySQL

SpamAssassinは設定やスパムメールを学習したときの情報をデータベースで保持することができる。
小規模サイトではあまり意味が無いかもしれないけど、連携可能なデータベースにMySQLの記載があったので導入してみる。
http://svn.apache.org/repos/asf/spamassassin/tags/spamassassin_current_release_3.1.x/sql/README
http://wiki.apache.org/spamassassin/UsingSQL

MySQLと連携するためにはPerlからMySQLを扱えるようにする必要がある。
DBD::MySQLをインストールする。
# ln -s /usr/local/mysql/bin/mysql/mysql_config /usr/local/bin/mysql_config
$ wget http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.001.tar.gz
$ perl Makefile.pl
$ make
# make install
SpamAssassin用のデータベースを作成する。
# /usr/local/mysql/bin/mysqladmin -uroot -p create spamdb
Enter password:********

# /usr/local/mysql/bin/mysql -uroot -p
mysql> GRANT ALL ON spamdb.* TO spamd@localhost IDENTIFIED BY '********;
Query OK, 0 rows affected (0.03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

テーブルを作成する。
SpamAssassinのソースファイルの中にテンプレートがあるのでこれを使えばいいのだが、一つは修正して使う。
 ・userpref_mysql_custom.sql
 ・awl_mysql.sql
 ・bayes_mysql.sql

  $SRC/sql/userpref_mysql_custom.sql
CREATE TABLE `userpref` (
`id` int(8) unsigned NOT NULL auto_increment,
`username` varchar(128) NOT NULL default '',
`preference` varchar(64) NOT NULL default '',
`value` varchar(128) default NULL,
`descript` varchar(128) default NULL,
`added` datetime NOT NULL default '2003-01-01 00:00:00',
`added_by` varchar(128) NOT NULL default '',
`modified` timestamp(14) NOT NULL,
UNIQUE KEY `id` (`id`),
KEY `type` (`preference`),
KEY `added_by` (`added_by`),
KEY `preference` (`preference`),
KEY `username` (`username`)
) TYPE=MyISAM COMMENT='Spamassassin Preferences';
テンプレートをMySQLに読み込ませてテーブルを作成する。
# /usr/local/mysql/bin/mysql -uroot -p spamdb < userpref_mysql_custom.sql
Enter password:********

$ /usr/local/mysql/bin/mysql -uroot -p spamdb < awl_mysql.sql
Enter password:********

$ /usr/local/mysql/bin/mysql -uroot -p spamdb < bayes_mysql.sql
Enter password:********
データベースを確認する。
# /usr/local/mysql/bin/mysql -uroot -p spamdb
Enter password:********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 80
Server version: 5.0.33 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show tables;
+-------------------+
| Tables_in_spamdb  |
+-------------------+
| awl               |
| bayes_expire      |
| bayes_global_vars |
| bayes_seen        |
| bayes_token       |
| bayes_vars        |
| userpref          |
+-------------------+
7 rows in set (0.01 sec)

これでデータベース側の設定は完了。
次にSpamAssassin側の設定をおこなっていく。

SpamAssassinのデータベース連携用の設定ファイルを作成する。
  /etc/mail/spamassassin/sql.cf
# Spamassassin to use MySQL for User Preference
user_scores_dsn                  DBI:mysql:spamdb:localhost:3306
user_scores_sql_username         spamd
user_scores_sql_password         ********
user_scores_sql_custom_query     SELECT preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR username = '$GLOBAL' OR username = CONCAT('%',_DOMAIN_) ORDER BY username ASC

# Spamassissin to use MySQL for AWL data
auto_whitelist_factory          Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn                    DBI:mysql:spamdb:localhost:3306
user_awl_sql_username           spamd
user_awl_sql_password           ********

# Spamassissin to use MySQL for bayes data
bayes_store_module              Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn                   DBI:mysql:spamdb:localhost:3306
bayes_sql_username              spamd
bayes_sql_password              ********
bayes_sql_override_username     spamd
パーミッションを変更する。
# chown spamd:spamd sql.cf
SpamAssassinの設定をMySQLに移行する。 ちなみにMySQLの場合だと設定変更にSpamAssassinの再起動は必要ではなく、MySQLの設定がリアルタイムで反映されるようになる。
mysql> INSERT INTO userpref (username,preference,value) VALUES ('$GLOBAL','rewrite_header Subject','[SPAM]');
mysql> INSERT INTO userpref (username,preference,value) VALUES ('$GLOBAL','report_safe','0');
mysql> INSERT INTO userpref (username,preference,value) VALUES ('$GLOBAL','required_score','10.0');
mysql> INSERT INTO userpref (username,preference,value) VALUES ('$GLOBAL','use_bayes','1');
mysql> INSERT INTO userpref (username,preference,value) VALUES ('$GLOBAL','bayes_auto_learn','1');

mysql> select username,preference,value from userpref;
+----------+-------------------------+---------------------+
| username | preference              | value               |
+----------+-------------------------+---------------------+
| $GLOBAL  | rewrite_header Subject  | [SPAM]              |
| $GLOBAL  | report_safe             | 0                   |
| $GLOBAL  | required_score          | 10.0                |
| $GLOBAL  | use_bayes               | 1                   |
| $GLOBAL  | bayes_auto_learn        | 1                   |
+----------+-------------------------+---------------------+
7 rows in set (0.01 sec)
これで準備はOK。 SpamAssassinをデバッグモードで動かし動作確認をする。 ログを抜粋してみた。
# tail /var/log/mail.log
(省略)
Feb  6 20:28:59 bruna spamd[12826]: config: read file /etc/mail/spamassassin/sql.cf
Feb  6 20:29:04 bruna spamd[12826]: bayes: database connection established
Feb  6 20:29:04 bruna spamd[12826]: bayes: found bayes db version 3
Feb  6 20:29:04 bruna spamd[12826]: bayes: Using userid: 1
Feb  6 20:29:04 bruna spamd[12826]: bayes: not available for scanning, only 1 spam(s) in bayes DB < 200

(省略)

Feb  6 20:29:07 bruna spamd[12826]: auto-whitelist: sql-based connected to DBI:mysql:spamdb:localhost:3306
Feb  6 20:29:07 bruna spamd[12826]: auto-whitelist: sql-based using username: root
Feb  6 20:29:07 bruna spamd[12826]: auto-whitelist: sql-based get_addr_entry: no entry found for ignore@compiling.spamassassin.taint.org|ip=none
Feb  6 20:29:07 bruna spamd[12826]: auto-whitelist: sql-based ignore@compiling.spamassassin.taint.org|ip=none scores 0/0
Feb  6 20:29:07 bruna spamd[12826]: auto-whitelist: AWL active, pre-score: 2.216, autolearn score: 2.216, mean: undef, IP: undef
Feb  6 20:29:07 bruna spamd[12826]: auto-whitelist: sql-based finish: disconnected from DBI:mysql:spamdb:localhost:3306
Feb  6 20:29:07 bruna spamd[12826]: auto-whitelist: post auto-whitelist score: 2.216
メールの送受信でデータベース内に情報が蓄積されていく。
mysql> select * from awl;
+-----------------------+----------------------------+---------+-------+----------+
| username              | email                      | ip      | count | totscore |
+-----------------------+----------------------------+---------+-------+----------+
| root                  | pinkgirl85236@yahoo.com.cn | 211.212 |     1 |   17.057 |
| testuser@kajukaju.net | testuser@gmail.com         | 64.233  |     1 |    -1.44 |
+-----------------------+----------------------------+---------+-------+----------+

mysql> select * from bayes_seen;
+----+-------------------------------------------------------+------+
| id | msgid                                                 | flag |
+----+-------------------------------------------------------+------+
|  1 | 17c56e877d2fb11da210512f9879e9c4b9171f35@sa_generated | s    |
|  2 | 316dda809347c69678e368e4c6174d32569593d9@sa_generated | h    |
+----+-------------------------------------------------------+------+
2 rows in set (0.00 sec)

mysql> select * from bayes_vars;
+----+-----------------------+------------+-----------+-------------+-------------+------------------+--------------------+------------------+------------------+
| id | username              | spam_count | ham_count | token_count | last_expire | last_atime_delta | last_expire_reduce | oldest_token_age | newest_token_age |
+----+-----------------------+------------+-----------+-------------+-------------+------------------+--------------------+------------------+------------------+
|  1 | root                  |          1 |         0 |          48 |           0 |                0 |                  0 |       1170761146 |       1170761146 |
|  2 | testuser@kajukaju.net |          0 |         1 |          58 |           0 |                0 |                  0 |       1170761512 |       1170761512 |
+----+-----------------------+------------+-----------+-------------+-------------+------------------+--------------------+------------------+------------------+
2 rows in set (0.00 sec)
ベイジアンフィルタの情報はユーザ(メールアドレス)ごとに蓄積されている。
手動でメールを学習させるときにはユーザを指定する必要があるので注意する。
# sa-learn --progress --spam --username=testuser@kajukaju.net /home/testuser/
100% [===============================================]   0.61 msgs/sec 00m24s DONE
Learned tokens from 15 message(s) (15 message(s) examined)