Ryo.Fの日記: Spamass-milter: -xオプション
SpamassassinをsendmailのMILTERで動作させる、Spamass-milterを導入したのだが、FC4で普通に導入すると、spamdがユーザsa-miltの権限で動いて、~sa-milt/.samassassinディレクトリにあるuser_prefsやbayes_*を読みに行く。この場合当然、ユーザ毎の設定は書けないし、sa-learnによるBaysianフィルターの学習も、sa-milt権限でないとできない(グループ権限をうまく設定すればできるのかもしれないが、私はうまく設定できなかった)。
これを回避するためには、spamass-milterに
-x -u sa-milt
の様なオプションをつければよい、と書いてあるページもあるのだが、私の環境では動かなかった(ちなみに上の例では、宛先からユーザを展開できない場合は、ユーザsa-miltの設定で検疫される)。原因は大きく分けて次の二つ。
- spamdに`-u sa-milt'をつけていたので、setuidできていなかった。
- spamass-milterはsa-milt権限で動いているが、この権限では、`sendmail -bv'を実行することができない。
このうち、前者は単にオプションを削除すれば解決する。問題は後者だ。
後者は、大きく分けて、三つの原因で実行が阻害されている。
- `sendmail -bv'を実行できるのは、sendmailで言うTrustedUserかrootでなければならないが、sa-miltは、どちらでもない。
- /var/spool/mqueueにchdirできなければならないが、sa-miltはできない。
- /etc/aliases.dbやその他別名・仮想ユーザ関係のファイルにアクセスできなければならないが、sa-miltはできない。たとえば、FC4では、
-rw-r----- 1 root smmsp 12288 May 9 14:59 /etc/aliases.db
になっている。
これらについて、それぞれ対処すればよい。
まず最初については、/etc/mail/trusted-usersにsa-miltを加えればよい。これで、sendmailのテストモード(`sendmail -bt')で`$=t'を実行してみれば確認できる。
次は、sa-miltをグループmailに加えた上で(/etc/groupを編集)、
chmod g+rx /var/spool/mqueue
を実行する。
最後のものは、
chmod a+r /etc/aliases.db /etc/mail/*.db
を実行する。
このように設定すると、spamdのログに、
May 9 15:25:40 ホスト名 spamd[25471]: info: setuid to ユーザ名 succeeded
の様なログがでるはずだ。他にエラーを示すようなログが無いことを確認する。
ユーザごとの設定は当然、~/.spamassassin/以下に書くことになるが、spamdをrootで動かす場合、ユーザのルールを読み込ませることを可能にすると、思わぬセキュリティホールになる可能性があるので、十分に検討した上で決定してほしい。
なお、smapass-milterのオプションに、
-i 127.0.0.1/32 -b quarantine
という設定を追加すると、受信拒否されたメールを、ローカルのユーザ(もしくは別名)quarantine(検疫所)に送ることができる(`-b'オプション)。ただし、`-b'オプションでローカルのユーザに転送する場合、`-i 127.0.0.1/32'をつけておかないと、転送されるときに検疫され受信拒否、それがまた転送・検疫・受信拒否…のようなループになってしまうので、注意すること。
追記:
「Baysianフィルターの学習も、sa-milt権限でないとできない」と書いたが、これはsudoを利用して問題を回避することも当然できる。
Cmnd_Alias SPAMASS_CMDS = /usr/bin/sa-learn
USERS ALL=(sa-milt) NOPASSWD: SPAMASS_CMDS
の様な設定をしておいて、
sudo -u sa-milt sa-learn --dbpath ~sa-milt/.spamassassin --spam Mail/junk/*
のように学習させれば動く。
ただし、通常、メールファイルは、sa-miltを含む他のユーザからは読めないように設定しているはずだから、もうひと手間要るはずだ。
Spamass-milter: -xオプション More ログイン