なうびるどいんぐ

脳みそ常時-3dB

[Dovecot]antispamで迷惑メールを自動的に学習させる

      HimaJyun

メールサーバの設定に苦戦しています、おかげで記事ネタ残弾が枯渇しそうです。

という訳で、今回はdovecot-antispamを利用して迷惑メールフォルダに入れた/出したメールを自動でsa-learnに食わせる方法を……

スポンサーリンク

dovecot-antispam

dovecot-antispamはantispamと銘打っていますが、スパムフィルタではないです。

迷惑メールフォルダ(JunkとかSpam)へのメールの出し入れに応じてコマンドを起動したりするものです。

そして、その機能を利用してSpamAssassinのsa-learnにメールを食み食みさせておべんきょさせましょ、と言うのがこの記事の趣旨

インストール

Debian系であればaptでインストールできます。

sudo apt-get install dovecot-antispam

設定

専用の設定ファイルみたいなのはなく、plugin(conf.d/90-plugin.conf)に設定するみたいです。

plugin {
  antispam_backend = pipe
  # ゴミ箱フォルダの名前を指定
  antispam_trash = Trash
  # スパムフォルダの名前を指定
  antispam_spam = Junk
  # 実行するプログラムを指定
  antispam_pipe_program = /usr/bin/sa-learn
  # スパムの時(スパムフォルダに入れた時)の引数
  antispam_pipe_program_spam_arg = --spam
  # スパムではない時(スパムフォルダから出した時)の引数
  antispam_pipe_program_notspam_arg = --ham
  # その他の引数
  antispam_pipe_program_args = --dbpath /var/lib/amavis/.spamassassin
}

見れば分かる感じですね。

権限云々が絡んでこない物であれば簡単でしょう。

amavisdのSpamAssassinは?

最近だとSpamAssassinと連携させるのにamavisd-newを使うことが多いかと思います。

amavisdが利用するSpamAssassinの学習結果は「/var/lib/amavis/.spamassassin」にあります(Ubuntuの場合)

そして所有者、グループ共にamavisで、ユーザしか書き込みが出来ないようになっています。

もちろんdovecot-antispamで実行されるユーザはamavisではないので、結果として学習結果を書き込めずにコケます。

sudoers

こういう時は素直にsudoersを使って解決する方が早く、分かりやすいでしょう。(そして、分かりやすい=セキュリティ対策がしやすいという訳で)

具体的に言えば、スクリプトを用意し、sudoersを用いてそのスクリプト内でだけパスワードなしでamavisにsu出来るようにする訳です。

まず、そのスクリプト本体ですが、Gistで公開されているので、これを使うのが簡単+定番です。(もちろん自分で用意しても構いませんが……)

以下のようにしてダウンロードと実行権限を与えれば良いでしょう。

cd /etc/dovecot
sudo curl -LO https://gist.githubusercontent.com/kylemanna/d45a2be450de8ce6b79d/raw/3243994db07a3e30d9e1cdb978b4e691f4ecb6a9/sa-learn-pipe.sh
chown vmail /etc/dovecot/sa-learn-pipe.sh
chmod 744 /etc/dovecot/sa-learn-pipe.sh

sudoersには以下のように設定します。(実際にはsudoersに書くよりsudoers.d/に入れるほうが良いと思われ)

vmail ALL=(amavis) NOPASSWD: /etc/dovecot/sa-learn-pipe.sh

これでdovecot-antispamの実行ユーザー(上の例ではvmail)がamavisのsa-learnを実行できるようになりました。

設定

後はdovecot-antispamがsa-learn-pipe.shを呼び出すように設定するだけです。

plugin {
  antispam_backend = pipe
  antispam_trash = Trash
  antispam_spam = Junk
  antispam_pipe_program = /etc/dovecot/sa-learn-pipe.sh
  antispam_pipe_program_spam_arg = --spam
  antispam_pipe_program_notspam_arg = --ham
}

簡単です。

余談

最初はsudoersの事が頭からスッポリ抜け落ちていたのでパーミッションを弄ったりグループを弄ったりと苦戦していました

sudoersはたまに思い出したように使ってみると便利です。(もちろん、それ相応にセキュリティやら引数の解釈やらには気を使う必要があるのですが)

というより何種類ものソフトウェアを組み合わせないといけない現状のメールサーバの環境が異常な気がするんですけどね……(バイナリ1つで簡単に出来たら楽なのに)

まぁ、とにもかくにもこれでsa-learnの自動化が出来たという事で。

 - サーバー