Debian etchでDSPAMを試す

Postfixと連動させるSPAMフィルタとしてここ2週間ほどDSPAMを試しているのだけど、情報が少ないこともあって悪戦苦闘している。まだちゃんと動いていないのだけど、とりあえずこれまでのあれこれを忘れない為にメモ。

DSPAMのパッケージを見てみると、以下のものが用意されている。

# apt-cache search dspam
dspam - is a scalable, fast and statistical anti-spam filter
dspam-doc - Documentation for dspam
dspam-webfrontend - DSPAM is a scalable and statistical anti-spam filter
libdspam7 - DSPAM is a scalable and statistical anti-spam filter
libdspam7-dev - DSPAM is a scalable and statistical anti-spam filter
libdspam7-drv-db4 - DSPAM is a scalable and statistical anti-spam filter
libdspam7-drv-mysql - DSPAM is a scalable and statistical anti-spam filter
libdspam7-drv-pgsql - DSPAM is a scalable and statistical anti-spam filter
libdspam7-drv-sqlite3 - DSPAM is a scalable and statistical anti-spam filter
#

今回は、ストレージにMySQLを使用するので以下をインストール。WEBベースのインターフェースは全て設定できてからインストールしても大丈夫なはず。

# apt-get install dspam dspam-doc dspam-webfrontend libdspam7-drv-mysql

なお、libdspam7-drv-mysqlのインストール途中、MySQLの設定を色々聞かれるので任意の値を指定する。途中でキャンセルして後で設定ファイルを直接いじるのでもOK。

インストール後、DSPAMの各設定ファイルは以下のディレクトリに配置される。

/etc/dspam

admins  
default.prefs  
dspam-apache.conf  
dspam-apache2.conf  
dspam.conf  
dspam.d  
rgb.txt  
webfrontend.conf

多分Debian独自の構成と思われるのは、default.prefsとdspam.dかな。default.prefsにはDSPAMの主要な設定項目だけが抜き出されている。なので、メインのdspam.confをあれこれいじっていて何で動かないんだー、てな事が何度あったことやら。
dspam.dの下には、MySQL用の設定項目だけ抜き出されたmysql.confが配置される。

で、今回(今現在)の設定した内容は以下のとおり。有効になっている項目と変更・コメントアウトしたものだけ抜粋。

/etc/dspam/dspam.conf

Home /var/spool/dspam
StorageDriver /usr/lib/dspam/libhash_drv.so
#StorageDriver /usr/lib/dspam/libmysql_drv.so
#TrustedDeliveryAgent "/usr/bin/procmail"
DeliveryHost        127.0.0.1
DeliveryPort        10026
DeliveryIdent       localhost
DeliveryProto       SMTP
OnFail error
Trust root
Trust dspam
Trust mail
Trust mailnull
Trust smmsp
Trust daemon
Debug *
DebugOpt process classify spam fp inoculation corpus
TrainingMode teft
TestConditionalTraining on
Feature chained
Feature whitelist
Algorithm graham burton
PValue graham
SupressWebStats on
Preference "spamAction=tag"
Preference "signatureLocation=message"  # 'message' or 'headers'
Preference "showFactors=on"
Preference "spamSubject=[SPAM]"
AllowOverride trainingMode
AllowOverride spamAction spamSubject
AllowOverride statisticalSedation
AllowOverride enableBNR
AllowOverride enableWhitelist
AllowOverride signatureLocation
AllowOverride showFactors
AllowOverride optIn optOut
AllowOverride whitelistThreshold
HashRecMax              98317
HashAutoExtend          on
HashMaxExtents          0
HashExtentSize          49157
HashMaxSeek             100
HashConnectionCache     10
Notifications   off
PurgeSignatures 14          # Stale signatures
PurgeNeutral    90          # Tokens with neutralish probabilities
PurgeUnused     90          # Unused tokens
PurgeHapaxes    30          # Tokens with less than 5 hits (hapaxes)
PurgeHits1S     15          # Tokens with only 1 spam hit
PurgeHits1I     15          # Tokens with only 1 innocent hit
LocalMX 127.0.0.1
SystemLog on
UserLog   on
Opt in
ServerPort              10025
ServerPID              /var/run/dspam/dspam.pid
ServerMode standard
ServerParameters        "--deliver=innocent"
ServerIdent             "localhost.localdomain"
#ServerDomainSocketPath  "/tmp/dspam.sock"
ProcessorBias on

本当はMySQLを使用するはずだったのだけど、どうにもうまくいかず実際にはHashを使用するように変更。Hashの方で正常動作が確認できたら再チャレンジの予定。
MySQLは、libdspam7-drv-mysqlのインストール時に設定したパスワードに特殊文字を1文字使用していたのだけど、作成された/etc/dspam/dspam.d/mysql.confの中ではその特殊文字が1文字抜けた形で保存された形で保存されていたので、そこら辺に原因があるのかなあと思っているんだけど(違うかな)。

一応、MySQLの設定は以下のとおり。

MySQLServer       192.168.0.100
MySQLUser         dspam
MySQLPass         hogehoge
MySQLDb           dspam
#MySQLCompress          false

「MySQLServer」には、デフォルトだとローカルで動いているものとして「/var/run/mysqld/mysqld.sock」というようにソケットが指定されているけど、今回はリモートでMySQLが動いているのでIPアドレスを指定する。「MySQLCompress」は多分パケット圧縮してやりとりするよ、てな事だと思うけどちゃんと調べてないのでとりあえずコメントアウトのまま。
なお、MySQLの設定に関するドキュメントは以下にあります。

/usr/share/doc/libdspam7-drv-mysql/

で、dspam.confに戻って、以下はPostfixから受け取ったメールをフィルタリングして戻すときの設定。Postfix側では、こいつ用のトランスポートを追加しておけばOK。DSPAMはPostfixに戻すときはSMTPがしゃべれるみたい。

DeliveryHost        127.0.0.1
DeliveryPort        10026
DeliveryIdent       localhost
DeliveryProto       SMTP

次はログの設定。そもそもDSPAMがよくわかってないので、デバッグメッセージに出せるものはすべて出すようにしてしまう。ちゃんと設定出来て正式に運用するときにまた絞ってあげればいい、というポリシーでひとまず。

Debug *
DebugOpt process classify spam fp inoculation corpus
SystemLog on
UserLog   on

次が、メイン(だったと気づくことになる)DSPAMをデーモンとして動かす設定。

ServerPort              10025
ServerPID              /var/run/dspam/dspam.pid
ServerMode standard
ServerParameters        "--deliver=innocent"
ServerIdent             "localhost.localdomain"
#ServerDomainSocketPath  "/tmp/dspam.sock"

今回はPostfixからDSPAMにメールが渡ってくるときに、DSPAMをデーモンとして動作させておいてPostfixでコンテンツフィルタを設定してフィルタリングさせるように設定した。このときコンテンツフィルタを経由してPostfixのキューからDSPAMにメールが渡されるときに使用するプロトコルがLMTPで、使用するポートが10025となる。

参考にさせていただいたこことかを見るとUNIXドメインソケットで渡していたりするのだけど、この方法だとうまくいかなかったのと、こちらオライリーのPostfix本でのコンテンツフィルタリングの章を参考にした結果うまく動いてくれたので、結局このような方法になった。

それで今回もっともハマったのは、このUNIXドメインソケットを使った方法だと「ServerDomainSocketPath」の指定が必要になるのだけど、そうでないのならこの「ServerDomainSocketPath」はコメントアウトしておかなければならないということ。コメントアウトしていないと、デーモンとしてDSPAMが起動できてもIPでつながらない状態になる。telnetで10025につなごうとしてもはじかれてしまって、なんでやねん!と何日一人ツッコミしていたか・・・


てなことで、DSPAMの設定としては以上でとりあえずはOK。

長くなったので、その2に続きます。