spam対策への道

FreeBSDでSendmailのMilter APIとCyrus IMAPを使ってspam対策を行う方法です。
方針は以下の通り。


1. Sender IDの導入


2. DKIMの導入


3. SpamAssassinの導入


4. Sendmailの設定

sendmail.mcに以下を追加します。

INPUT_MAIL_FILTER(`sid-filter', `S=local:/var/run/sid-filter, F=T, T=R:2m')
INPUT_MAIL_FILTER(`dkim-filter', `S=local:/var/run/milteropendkim/socket, F=T, T=R:2m')
INPUT_MAIL_FILTER(`spamass-filter', `S=local:/var/run/spamass-milter.sock, F=T, T=R:2m')

フラグの意味

F=
Rフィルタが利用できない場合はコネクションを拒否する
Tフィルタが利用できない場合はコネクションを一時エラーにする
なしフィルタが利用できない場合はフィルタなしの動作を行う
T=
Cフィルタへの接続のタイムアウト(デフォルト5分)
SMTAからフィルタへの送信タイムアウト(デフォルト10秒)
Rフィルタから応答読み出しタイムアウト(デフォルト10秒)
Eフィルタへメッセージの最後まで送信してから、最終確認を待っている間のタイムアウト(デフォルト5分)

sendmailに設定を反映させます。

# cd /etc/mail
# make sendmail.cf
# /etc/rc.d/sendmail restart

5. Sieveでのフィルタリング

ソーススクリプト(.sieve.src)を書きます。

require "fileinto";

if header :contains "X-Spam-Flag" "YES" {
        fileinto "INBOX.spam";
}
elsif header :contains "Received-SPF" "softfail" {
        fileinto "INBOX.spam";
}
elsif header :contains "Authentication-Results" "spf=softfail" {
        fileinto "INBOX.spam";
}
elsif header :contains "Authentication-Results" "spf=fail" {
        fileinto "INBOX.spam";
}
elsif header :contains "Authentication-Results" "sender-id=softfail" {
        fileinto "INBOX.spam";
}
elsif header :contains "Authentication-Results" "sender-id=fail" {
        fileinto "INBOX.spam";
}
elsif header :contains "Authentication-Results" "dkim=softfail" {
        fileinto "INBOX.spam";
}
elsif header :contains "Authentication-Results" "dkim=hardfail" {
        fileinto "INBOX.spam";
}
elsif header :contains "Authentication-Results" "domainkeys=softfail" {
        fileinto "INBOX.spam";
}
elsif header :contains "Authentication-Results" "domainkeys=hardfail" {
        fileinto "INBOX.spam";
}

ソーススクリプトをバイトコンパイルします。

% /usr/local/cyrus/bin/sievec $HOME/.sieve.src $HOME/.sieve