パスワードを忘れた? アカウント作成
529735 journal

Ryo.Fの日記: Spamass-milter: -xオプション

日記 by Ryo.F

Spamassassinsendmailの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を含む他のユーザからは読めないように設定しているはずだから、もうひと手間要るはずだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

※ただしPHPを除く -- あるAdmin

読み込み中...