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
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 installSpamAssassin用のデータベースを作成する。
# /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
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側の設定をおこなっていく。
/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.cfSpamAssassinの設定を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)
