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 ヘッダーで動作を確認する。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲