Rspamdでフリーメールから来るなりすましメールをブロック(暫定版)
最近、自社のメールサーバーになりすましメールが届くようになりました。
しかも送信元が Gmail や Hotmail などのフリーメールを使っているため、SPF・DKIM・DMARC といった認証系のチェックにはまったく引っかかりません。
結果として、Rspamd も問題なしと判定してしまい、スパムとして検知できない状況でした。
そこで今回は、Rspamd に独自ルールを追加することで、フリーメールを使ったなりすましをブロックできたので、その方法を共有します。
あくまで暫定対応のため、今後改良点があれば追記する予定です。
どんなメールが来たのか

送信元の表示名には自社の会社名が含まれており、一見すると社内メールや取引先からの連絡に見えます。
しかし実際の送信元アドレスは 〇〇@hotmail.com など、自社とは一切関係のないフリーメールアドレスでした。
さらに厄介なことに、本文の日本語にほとんど違和感がなく、かなり精巧に作られていました。
正直、よくできていて驚きました。

このメールに対して Rspamd は「問題なし」と判定し、そのまま受信トレイに届いてしまいました。
とはいえ、
- 内容自体は明確な詐欺と断定できない
- フリーメールからの送信で、SPF / DKIM / DMARC も正しく通っている
という条件では、Rspamd がスルーしてしまうのも仕方ない部分があります。
対策方法
使用している環境について
私の環境では、mailserver2/mailserver の Docker イメージを使用しています。
mailserver:
image: mailserver2/mailserver
container_name: mailserver
restart: unless-stopped
domainname:
hostname: mail
ports:
- "25:25" # SMTP - Required
- "110:110" # POP3 STARTTLS - Optional - For webmails/desktop clients
- "143:143" # IMAP STARTTLS - Optional - For webmails/desktop clients
- "465:465" # SMTPS SSL/TLS - Optional - Enabled for compatibility reason, otherwise disabled
- "587:587" # Submission STARTTLS - Optional - For webmails/desktop clients
- "993:993" # IMAPS SSL/TLS - Optional - For webmails/desktop clients
- "995:995" # POP3S SSL/TLS - Optional - For webmails/desktop clients
- "4190:4190" # SIEVE STARTTLS - Optional - Recommended for mail filtering
- "11334:11334" # HTTP - Optional - Rspamd WebUI
env_file:
- .env.mail
volumes:
- ./mailserver/mail:/var/mail
- /etc/letsencrypt:/etc/letsencrypt:roカスタムルールを加える
まず、以下のファイルを作成します。
./mailserver/rspamd/rspamd.local.lua
ルールの内容
- フリーメールドメイン(Gmail / Hotmail など)から送られてきている
- かつ、送り主の表示名に自社名や代表者名が含まれている
この条件を満たした場合に、スパムとして高スコアを付与します。
-- フリーメールなりすまし検知ルール(送り主の表示名をチェック)
local function check_fake_company(task)
local from = task:get_from('mime')
if not from or not from[1] then
return false
end
local from_domain = from[1]['domain']:lower()
local from_name = from[1]['name'] or '' -- 送り主の表示名を取得
-- フリーメールドメインリスト
local freemail_domains = {
'gmail.com', 'hotmail.com', 'outlook.com', 'yahoo.com',
'yahoo.co.jp', 'icloud.com', 'live.com', 'msn.com'
}
-- フリーメールからの送信か確認
local is_freemail = false
for _, domain in ipairs(freemail_domains) do
if from_domain == domain then
is_freemail = true
break
end
end
-- フリーメール以外は無視
if not is_freemail then
return false
end
-- 送り主の表示名にキーワードがあるかチェック
local keywords = {
'会社名',
'会社名別称',
'代表名',
'代表名苗字',
'代表名名前',
}
for _, kw in ipairs(keywords) do
if from_name:find(kw, 1, true) then
return true, 1.0, 'from_name:' .. kw
end
end
return false
end
rspamd_config:register_symbol({
name = 'FAKE_COMPANY_NAME',
type = 'callback',
callback = check_fake_company,
score = 15.0,
group = 'policies',
description = 'Fake company name from freemail'
})
Rspamd に Lua ファイルを読み込ませる
次に、以下のファイルを作成します。
./mailserver/rspamd/rspamd.conf.local
lua = "/etc/rspamd/rspamd.local.lua";Docker コンテナにマウントする
作成したファイルを永続化するため、docker-compose.yml に volume を追加します。
volumes:
- ./mailserver/mail:/var/mail
- /etc/letsencrypt:/etc/letsencrypt:ro
- ./mailserver/rspamd/rspamd.local.lua:/etc/rspamd/rspamd.local.lua:ro #追加
- ./mailserver/rspamd/rspamd.conf.local:/etc/rspamd/rspamd.conf.local:ro #追加再起動して反映
docker compose stop mailserver
docker compose up -d mailserver設定が反映されているか確認
docker exec mailserver rspamadm configdump | grep -A 3 "FAKE_COMPANY_NAME"duplicate symbol: FAKE_COMPANY_NAME, skip registering
と表示されていれば、設定は正しく読み込まれています。
実際にrejectされるか


テストしたところ、FAKE_COMPANY_NAME が正しく発火し、メールは reject されました。
当面はこの設定で様子を見ていこうと思います。
コメント