2026年7月10日
2026年7月10日
SpamAssassinの設定方法|Postfixとの連携・local.cfの調整・ベイジアン学習まで
SpamAssassinは、受信メールをヘッダー・本文・DNSブロックリスト・ベイジアン学習などのルールで採点し、合計点がしきい値を超えたものをスパムと判定するフィルタです。判定結果はヘッダーとして付くだけなので、実際の振り分けや拒否は、Postfixとの連携方法とメールボックス側の設定で決まります。この記事では、Debian/Ubuntu系のサーバーで、インストールからPostfixとの3通りの連携方法、local.cf の主な設定、ルール更新、学習、動作確認までを説明します。
SpamAssassinは4.0系が現行です(2026年10月現在)。パッケージ名やサービス名はディストリビューションのバージョンで違うため、該当する箇所では確認方法も書いています。
連携方法を先に決める
SpamAssassinをPostfixにつなぐ方法は、大きく分けて次の3つです。どれを選ぶかで、インストールするパッケージも設定する場所も変わります。
- spamd+spamc(content_filter):Postfixが受け取ったメールを、パイプ経由で
spamcに渡し、常駐するspamdが採点してから配送に戻します。構成が単純で、まず動かしてみるのに向いています。受信後に採点するため、スパムを受信時点で拒否することはできず、ヘッダーを付けて配送する運用になります。 - milter(spamass-milter):SMTPの会話中に採点するため、高得点のメールを受信時点で拒否できます。送信元に拒否が伝わるので、受け取ってから捨てるよりも行儀のよい処理になります。
- amavis(amavisd-new):ウイルス対策のClamAVなどと一緒にまとめて検査する仕組みです。amavisはSpamAssassinをライブラリとして直接呼び出すため、
spamdは使いません。
ウイルス検査も同時に行いたいならamavis、受信時の拒否を重視するならmilter、それ以外ならspamd+spamcが目安です。
インストールとspamdの起動
ここではspamd+spamcの構成で進めます。
sudo apt update
sudo apt install spamassassin spamc
# Debian 12 / Ubuntu 24.04 以降は spamd が別パッケージ
sudo apt install spamd
# サービス名を確認(spamd.service または spamassassin.service)
systemctl list-unit-files | grep -i spam
Debian 12やUbuntu 24.04以降ではデーモンが spamd パッケージに分かれ、サービス名も spamd になっています。それより古いリリースでは spamassassin パッケージにデーモンが含まれ、サービス名は spamassassin です。上のコマンドで表示された名前を使って起動します。
sudo systemctl enable --now spamd
sudo systemctl status spamd
spamd は既定で 127.0.0.1 のポート783で待ち受けます。外部に公開する必要はないので、ファイアウォールで783番を開けないでください。Debian系では、spamdは debian-spamd というユーザーで処理を行います。
local.cfの基本設定
サイト全体の設定は /etc/spamassassin/local.cf に書きます。編集前に元のファイルをコピーしておくと、問題が出たときに戻せます。
sudo cp /etc/spamassassin/local.cf /etc/spamassassin/local.cf.bak
# /etc/spamassassin/local.cf
# スパムと判定する合計点(既定値は5.0)
required_score 5.0
# 0 = 元のメールはそのまま、ヘッダーだけ追加する
report_safe 0
# スパム判定時に件名の先頭に付ける文字列
rewrite_header Subject [SPAM]
# ベイジアン学習を使い、自動学習も有効にする
use_bayes 1
bayes_auto_learn 1
# 文字コードを判別してから本文を解析する(日本語メール向け)
normalize_charset 1
# 前段に自社の中継サーバーがある場合はそのアドレスを指定
# trusted_networks 192.0.2.0/24
report_safe を 1 にすると、スパムは元のメールを添付として包んだ新しいメールに置き換わります。ヘッダーを見て振り分ける運用なら、誤判定時に元のメールを取り出しやすい 0 が扱いやすい設定です。required_score は下げるほど検出も誤判定も増えるので、最初は5.0のまま X-Spam-Status ヘッダーの点数を見て調整します。
trusted_networks は、どの中継サーバーまでを信頼するかの設定です。前段にメールゲートウェイがある構成で設定しないと、ブロックリストの照合が自社サーバーのIPに対して行われ、判定がずれます。1台で直接受信しているなら、多くの場合は未設定で構いません。
許可・拒否リストと独自ルール
特定の送信元を常に通したい、あるいは常にスパム扱いにしたい場合は次のように書きます。4.0系では名前が welcomelist_from / blocklist_from に変わりました。古い whitelist_from / blacklist_from も互換のため使えますが、新しく書くなら新しい名前を使います。
welcomelist_from *@partner.example.com
blocklist_from *@spam-sender.example.net
# 独自ルール:件名に特定の語句を含むメールに3点加算
header LOCAL_SUBJ_OFFER Subject =~ /limited time offer/i
describe LOCAL_SUBJ_OFFER Subject contains a typical spam phrase
score LOCAL_SUBJ_OFFER 3.0
welcomelist_from は送信元アドレスの表示だけを見るため、なりすましに弱い点に注意が必要です。SPFやDKIMの検証結果と組み合わせる welcomelist_from_spf や welcomelist_from_dkim を使えるなら、そちらのほうが安全です。
設定を変えたら、文法を確認してからspamdに読み込ませます。--lint は問題がなければ何も表示しません。
sudo spamassassin --lint
sudo systemctl reload spamd
Postfixと連携する(content_filter)
/etc/postfix/master.cf を編集します。こちらも編集前にバックアップを取ってください。既存の smtp inet の行に content_filter を追加し、ファイルの末尾にフィルタ用のサービスを定義します。
smtp inet n - y - - smtpd
-o content_filter=spamassassin
spamassassin unix - n n - - pipe
user=debian-spamd argv=/usr/bin/spamc -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
ポート25で受けたメールは spamassassin サービスに渡され、spamc が採点結果のヘッダーを付けてから sendmail で配送に戻します。戻ったメールはSMTPではなくローカルの投入経路を通るため、もう一度フィルタにかかってループすることはありません。smtp inet の行の5列目(chroot)は既定値のまま変えないでください。なお spamc は既定で500KBを超えるメールを採点せずに通します。
sudo postfix check
sudo systemctl reload postfix
milterやamavisを使う場合の要点
spamass-milter では、Debian系なら spamass-milter パッケージを入れ、Postfixの main.cf に smtpd_milters でソケットを指定します。Debianのパッケージは既定でPostfixのキューディレクトリ配下にソケットを作るので、指定は次のようになります。
smtpd_milters = unix:/spamass/spamass.sock
milter_default_action = accept
milter_default_action = accept は、milterが止まっているときにメールを受け取り続けるための設定です。これがないと、spamdの障害がそのままメールの受信停止につながります。受信拒否のしきい値は /etc/default/spamass-milter の起動オプション(-r)で指定します。Postfixユーザーがソケットにアクセスできるようにグループへの追加が必要になる場合があるので、パッケージの README も確認してください。
amavis では、/etc/amavis/conf.d/15-content_filter_mode にある @bypass_spam_checks_maps の行のコメントを外すとスパム検査が有効になります。このとき、ヘッダーを付ける点数やスパムと判定する点数はamavis側の $sa_tag_level_deflt、$sa_tag2_level_deflt、$sa_kill_level_deflt が使われ、local.cf の required_score は判定に効きません。「local.cfを変えたのに挙動が変わらない」というときはこの点を確認してください。
ルールの更新(sa-update)
SpamAssassinのルールは定期的に更新されます。手動で更新するには次のようにします。
sudo sa-update && sudo systemctl reload spamd
sa-update は、更新があれば終了コード0、更新がなければ1を返します。上の書き方なら、更新があったときだけspamdを再読み込みします。2以上はエラーなので、ネットワークやGPG検証の問題を確認します。多くのディストリビューションのパッケージには定期実行の仕組みが含まれているので、systemctl list-timers | grep -i spam やcronの設定で、すでに動いているかを先に確認してください。
DNSブロックリストとリゾルバ
SpamAssassinの判定精度は、送信元IPや本文中のURLをDNSブロックリストに照会するルールに大きく依存しています。ところが、Google Public DNSのような大規模な公開リゾルバ経由の照会は、ブロックリスト側で拒否されることが多く、その場合 URIBL_BLOCKED のようなルールが付いて照会結果が得られません。
サーバーにUnboundなどのキャッシュDNSを入れ、SpamAssassinからはそれを使うようにすると解消します。システム全体のリゾルバを変えたくない場合は、local.cf に dns_server 127.0.0.1 と書いて、SpamAssassinだけにローカルのリゾルバを使わせることもできます。
ベイジアン学習
ベイジアンフィルタは、スパムと正常なメールをそれぞれ200通以上学習するまで判定に使われません。自動学習だけでは偏りが出やすいので、利用者がJunkフォルダへ移したメールを定期的に学習させると精度が上がります。
学習結果のデータベースは、採点を行うユーザーのホームディレクトリ配下の .spamassassin に作られます。spamd+spamcで user=debian-spamd としている構成では、debian-spamd のデータベースに学習させないと採点に反映されません。
# debian-spamd のホームディレクトリを確認
getent passwd debian-spamd
# 学習(パスはホームディレクトリに合わせて変更)
sudo sa-learn --dbpath /var/lib/spamassassin/.spamassassin --spam /home/user1/Maildir/.Junk/cur
sudo sa-learn --dbpath /var/lib/spamassassin/.spamassassin --ham /home/user1/Maildir/cur
sudo chown -R debian-spamd: /var/lib/spamassassin/.spamassassin
# 学習済みの件数を確認(nspam / nham)
sudo -u debian-spamd sa-learn --dump magic
rootで学習するとデータベースのファイルがroot所有になり、spamdが書き込めなくなるため、最後に所有者を戻しています。
振り分けと動作確認
スパム判定されたメールをJunkフォルダへ移すには、Dovecotを使っているならSieveで X-Spam-Flag ヘッダーを見て振り分けます。
require ["fileinto"];
if header :contains "X-Spam-Flag" "YES" {
fileinto "Junk";
}
動作確認には、どのフィルタでも高得点になるように決められたテスト用文字列(GTUBE)を使います。
printf 'Subject: test\n\nXJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X\n' | spamc -R
点数とヒットしたルールが表示されれば、spamdは動いています。続けて外部のアドレスから自分のサーバー宛てにメールを送り、受信したメールのヘッダーに X-Spam-Status が付いているかを確認します。付いていない場合は、/var/log/mail.log でメールが spamassassin サービスを通っているか、spamdのログにエラーがないかを見ます。
まとめ
- 連携方法は、単純なspamd+spamc、受信時に拒否できるmilter、ウイルス検査とまとめるamavisの3通り。amavisでは
local.cfのrequired_scoreは効かない。 - Debian 12 / Ubuntu 24.04以降はspamdが別パッケージ。サービス名は
systemctl list-unit-filesで確認する。 local.cfはrequired_score、report_safe、rewrite_header、use_bayesから始め、変更後はspamassassin --lintで確認する。許可リストは4.0系のwelcomelist_from系を使う。sa-updateでルールを更新し、DNSブロックリスト用にローカルのキャッシュDNSを用意する。- ベイジアン学習は採点するユーザーのデータベースに対して行い、200通以上ずつ学習させる。
- GTUBEと受信メールの
X-Spam-Statusヘッダーで動作を確認する。