Rspamdのスパム対策 中小企業向けに運用可能か

Rspamdのスパム対策を実装した。Rspamdは、ロシアのエンジニア Vsevolod Stakhov 氏によって開発が開始されました。当時、スパムフィルタといえば SpamAssassinでした。しかし、SpamAssassinはPerlで書かれており、メール1通ごとに重いプロセスを立ち上げるアーキテクチャだったため、スパムの流通量が爆発的に増えるにつれてというパフォーマンスの限界に直面していました。

そこで、「C言語をベースにした超高速なコアエンジン」 と 「Luaスクリプトによる柔軟なルール拡張」、そして 「イベント駆動(非同期処理)」 を組み合わせて、SpamAssassinの弱点を完全に克服する次世代のフィルターとしてゼロから設計されたのが Rspamd です。

Postfix + OpenDKIM + Rspamd

1. 事前準備:Redisのインストールと設定

Rspamdのキャッシュや学習データ、一時的な状態を高速に処理するためにRedisを導入します。

# Redisのインストール
dnf install -y redis

# Rspamd向けにメモリ制限と揮発ポリシーを設定
sh -c 'echo "maxmemory 500mb" >> /etc/redis.conf'
sh -c 'echo "maxmemory-policy volatile-ttl" >> /etc/redis.conf'

# 自動起動の有効化と起動
systemctl enable --now redis
systemctl status redis

2. Rspamdのインストール

AlmaLinux/CentOS環境に合わせて、依存パッケージの解決と公式リポジトリの登録を行います。

# 必要なプラグインのインストールとCRBリポジトリの有効化
dnf install -y dnf-plugins-core
dnf config-manager --enable crb

# OSのバージョンを判定し、Rspamd公式リポジトリを追加
source /etc/os-release
export EL_VERSION=$(echo -n $PLATFORM_ID | sed "s/.*el//")
curl https://rspamd.com/rpm-stable/centos-${EL_VERSION}/rspamd.repo > /etc/yum.repos.d/rspamd.repo

# Rspamd本体のインストール
dnf install -y rspamd

3. Rspamdの初期セットアップ(Wizard)

専用のウィザードコマンドを使用して、基本的な連携設定を行います。

rspamadm configwizard
  • Controller password: WebUI用のパスワードを設定(後から設定する場合は n
  • Redis servers: 127.0.0.1(Read/Write共にデフォルトのままEnter)
  • Postfix integration: main.cf を自動検知。エイリアス等の統合を Y で進める。
  ____                                     _
 |  _ \  ___  _ __    __ _  _ __ ___    __| |
 | |_) |/ __|| '_ \  / _` || '_ ` _ \  / _` |
 |  _ < \__ \| |_) || (_| || | | | | || (_| |
 |_| \_\|___/| .__/  \__,_||_| |_| |_| \__,_|
             |_|

Welcome to the configuration tool
We use /etc/rspamd/rspamd.conf configuration file, writing results to /etc/rspamd
Modules enabled: force_actions, chartable, metadata_exporter, multimap, dkim, spf, hfilter, dmarc, phishing, bayes_expiry, maillist, mime_types, settings, dkim_signing, rbl, once_received, whitelist, milter_headers, arc, aliases, regexp, forged_recipients, asn, mid, url_suspect, trie, fuzzy_check
Modules disabled (explicitly): spamtrap, contextal, aws_s3, rspamd_update, external_relay, p0f, bimi, http_headers, known_senders, elastic, dcc, mx_check, gpt
Modules disabled (unconfigured): dynamic_conf, clustering, metric_exporter, ip_score, spamassassin, clickhouse, reputation, maps_stats, emails, antivirus, fuzzy_collect, external_services
Modules disabled (no Redis): greylist, replies, ratelimit, neural, history_redis, url_redirector
Modules disabled (experimental):
Modules disabled (failed):
Do you wish to continue?[Y/n]:
Setup WebUI and controller worker:
Controller password is not set, do you want to set one?[Y/n]: n
Redis servers are not set:
The following modules will be enabled if you add Redis servers:
        * greylist
        * replies
        * ratelimit
        * neural
        * history_redis
        * url_redirector
Do you wish to set Redis servers?[Y/n]:
Input read only servers separated by `,` [default: localhost]: 127.0.0.1
Input write only servers separated by `,` [default: 127.0.0.1]: 127.0.0.1
Do you have any username set for your Redis (ACL SETUSER and Redis 6.0+)[y/N]:
Do you have any password set for your Redis?[y/N]:
Do you have any specific database for your Redis?[y/N]:
Setup Postfix integration:

Found Postfix configuration: /etc/postfix/main.cf
Found local domains from mydestination:
  - linuxexpert.ne.jp
  - localhost.$mydomain
  - sofia.$mydomain

Do you want to enable the aliases module for Postfix integration?[Y/n]:
Use system aliases from /etc/aliases?[Y/n]:
Use local domains from mydestination?[Y/n]:

Checking milter configuration...
Milter configuration detected in /etc/postfix/master.cf

Do you want to configure rate limiting for outbound mail?[y/N]:
Do you want to configure ARC signing?[y/N]:

Postfix setup complete!
Do you want to setup dkim signing feature?[y/N]:
File: /etc/rspamd/local.d/aliases.conf, changes list:
enabled => true
system_aliases => /etc/aliases
local_domains => {[1] = linuxexpert.ne.jp, [2] = localhost.$mydomain, [3] = sofia.$mydomain}

File: /etc/rspamd/local.d/redis.conf, changes list:
write_servers => 127.0.0.1
read_servers => 127.0.0.1

Apply changes?[Y/n]:
Create file /etc/rspamd/local.d/aliases.conf
Create file /etc/rspamd/local.d/redis.conf
2 changes applied, the wizard is finished now
*** Please reload the Rspamd configuration ***

4. Postfixとの連携設定(Milterの配管)

Postfixが受信したメールを、OpenDKIMとRspamdの両方に正しい順序で渡すように設定します。おそらくmain.cfの最終行に追加する。

vi /etc/postfix/main.cf

既存の smtpd_milters 設定(競合)を整理し、以下のように設定します。

# RspamdとOpenDKIMを連鎖させる(順番が重要)
smtpd_milters = inet:localhost:11332, local:/run/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

# Milterの基本動作設定
milter_default_action = accept
milter_protocol = 6

# 送信メールと受信メールをRspamdに正しく区別させるための必須設定
milter_macro_daemon_name = ORIGINATING

DKIMの設定と重なるところがあります。注意して編集し、設定後、Postfixを再読み込みします。

systemctl reload postfix

5. Rspamdの判定アクションとヘッダ付与設定

スパムスコアに応じた挙動(Rejectや件名書き換え)と、詳細な採点結果をメールヘッダに残す設定を行います。この機能により、「メールヘッダ」や「メールの原文」を確認することでアクションの確認が可能になります。

5-1. アクションの定義(actions.conf)

vi /etc/rspamd/local.d/actions.conf

# 件名書き換えの設定(文頭に付与する文言)
subject = "[SPAM] %s";

# スコアごとのアクション定義
reject = 15.0;            # 15点以上は即時通信拒否(Reject)して受け取らない
rewrite_subject = 6.0;    # 6点以上15点未満は件名に [SPAM] をつけて通す
add_header = 4.0;         # 4点以上はヘッダーに判定を追加する
greylist = null;          # グレイリストは無効化(遅延を防ぐため)

スコア値は適宜変更してください。当然、設定によって動きが変わります。

5-2. 採点結果の常時出力(milter_headers.conf)

すべてのメールに対して X-Spamd-Result などの詳細スコアを記録させます。

vi /etc/rspamd/local.d/milter_headers.conf

# スパムかどうかにかかわらず、すべてのメールに採点結果ヘッダを付ける
extended_symbols_headers = true;

# 追加するヘッダの種類を指定
use = ["x-spamd-result", "x-spam-status", "x-spam-level"];

5-3. 設定のテストと反映

# DKIMのおまじない
echo "enabled = false;" > /etc/rspamd/local.d/dkim_signing.conf

# mailmanのおまじない
vi /etc/rspamd/local.d/settings.conf
# ローカル(127.0.0.1)からのメールに対する特別ルール
whitelist_local {
    priority = 10;
    ip = "127.0.0.1";
    apply {
        actions {
            reject = 999.0;
            rewrite_subject = 999.0;
            add_header = 999.0;
        }
    }
}


# 文法エラーがないか確認(syntax OK が出れば成功)
rspamadm configtest

# Rspamdの自動起動有効化と再起動
systemctl enable --now rspamd
systemctl restart rspamd

6. WebUI(管理画面)の有効化とリバースプロキシ設定

Rspamdの管理画面をApache経由でセキュアに公開します。

6-1. パスワードの設定

rspamadm pw
# 任意のパスワードを入力し、出力された暗号化文字列をコピーする

vi /etc/rspamd/local.d/worker-controller.inc

# コピーした文字列を貼り付ける
enable_password = "$2$m7ebmh...[暗号化されたパスワード]...79kiau4gy";

6-2. Apache(httpd)のリバースプロキシ設定

vi /etc/httpd/conf.d/rspamd_proxy.conf
<Location /rspamd>
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule ^/rspamd/(.*)           ws://127.0.0.1:11334/$1 [P,L]

    ProxyPass http://127.0.0.1:11334/
    ProxyPassReverse http://127.0.0.1:11334/

    # アクセス制限(必要に応じてIP制限を設定)
    Require all granted
</Location>

systemctl restart httpd

ブラウザから https://[サーバーのドメイン]/rspamd/ にアクセスし、設定したパスワードでログインできることを確認します。

7. 運用とテストに関するTips

💡 動作テストを行う際の注意点

スパム判定のテストを行う際、世界共通のスパムテスト文字列である GTUBE (XJS*C4JDBQADN1.NSBN322NXP4563456789W34567WM4567WX504T6TSG43UX410ER410EX543T5TH*) を使用しますが、以下の点に注意してください。

  • ローカル(127.0.0.1)からの送信は安全判定される mail コマンド等でサーバー自身から送信した場合、Rspamdの誤検知防止機能が働き、スパムスコアがマイナス(安全)になります。
  • 純粋なRejectテストを実施する方法 エイリアス転送や内部プログラム(スクリプトへのパイプ等)を経由しない純粋なメールアドレス宛に、スマホの4G回線など外部ネットワークからGTUBEを含めたメールを送信することで、正しい「1000点超えのReject判定」を確認できます。これが、テストの難しいところです。

🔍 ログと判定結果の確認

  • WebUI (Historyタブ): リアルタイムの判定スコア、適用されたシンボル、アクション(Reject等)を視覚的に確認できます。
  • メールヘッダ: X-Spamd-Result: を見ることで、そのメールがどのルール(DKIM一致、DMARC、特定のブラックリスト等)で何点加減点されたかが完全にトレース可能です。

✨ Rspamdの長所(SpamAssassinとの決定的な違い)

  • 圧倒的な処理速度と省リソース 非同期のイベント駆動モデルを採用しているため、大量のメールを同時にスキャンしてもCPUやメモリの消費が極めて少なく、SpamAssassinの数倍〜10倍以上のスピードで処理を完了させます。
  • モダンな技術の「オールインワン」 DKIM、DMARC、SPFの検証はもちろん、ARC署名、Redisを利用したグレイリストや学習データの共有、果てはニューラルネットワーク(AIベースの判定)まで、現代のメールセキュリティに必要な機能が単体でほぼ全て組み込まれています。
  • Web UIの標準搭載 歴史ログやスコアの調整、サーバーの稼働状況をブラウザから視覚的に確認できる機能がデフォルトで内蔵されています。

⚠️ 短所(現場のエンジニアを悩ませる点)

  • 設定の階層構造が複雑(学習コストが高い) 設定ファイルが /etc/rspamd/ の中で local.doverride.d といったオーバーライド(上書き)方式に分かれています。さらに、以前は metrics.conf に書いていたものが actions.conf に移行するなど、独特のお作法を理解するまで少し苦労します。
  • 公式ドキュメントと実態の乖離(罠) 開発スピードが非常に速いため、公式ドキュメントやネット上の技術ブログの内容が古くなっていることが多々あります。しかし、Quarantine(隔離)タブが現在のWeb UIから消えている件など、実際に動かしてログを見ないと正解にたどり着けない場面があります。
  • 高度な独自ルールにはLuaの知識が必要 正規表現レベルであれば設定ファイルで完結しますが、「特定の条件のときだけ動く複雑なフィルタ」を作ろうとすると、Lua言語でスクリプトを書く必要があります。

🚀 処理能力と実用的な規模(スケーラビリティ)

Rspamdの処理能力は非常に高く、「小規模なVPS1台」から「巨大キャリアクラス」までシームレスに適用できます。

  • 単一サーバー(数千〜数万通 / 日) ミドルスペックのサーバー1台でも、秒間数十〜数百通のメールを余裕で捌きます。よって、今回構築したようなWebサーバーと同居する環境であっても、負荷を感じさせることなくバックグラウンドで軽快に動作します。
  • 大規模クラスタリング(数百万通〜 / 日) Redisにより、複数のRspamdサーバを並べ、背後のRedisでキャッシュや学習データを一元共有することが可能です。よって、大規模インフラでも容易にスケールアウト(横展開)できる設計になっています。

🌍 現在の立ち位置(絶対的なデファクトスタンダード)

現在、Linuxのメールサーバー構築において、Rspamdは 「SpamAssassinの後継」という枠を完全に超え、事実上のデファクトスタンダード(標準構成) となっています。

世界的に有名なオープンソースのメールサーバーパッケージ(Mailcow、ISPConfig、Proxmox Mail Gatewayなど)も、スパムエンジンのコアをSpamAssassinからRspamdへ次々と移行、あるいは標準採用しました。

少し前までは「導入のハードルが高いプロ向けツール」という立ち位置でしたが、現在のメールインフラにおいては「モダンで安全なサーバーを組むなら、Postfix + Dovecot + Rspamd の組み合わせがベストプラクティス」と世界中のエンジニアに認知されています。