昨年末ごろから、社長の実名で部下に詐欺メールが届く事例が全国的に発生しているようで、私の管理しているサーバーにも届きました。
おそらく会社のウェブサイトからドメインと代表者名を取得して、無差別に送信しているのでしょうが、差出人に実名が入っているとギョッとするユーザーも多いと思います。
今回の詐欺メールは、差出人アドレスがフリーメール(Outlook や Hotmail)なのが特徴で、自社ドメインのメールアドレスで運用している会社ならすぐに異変に気付くことができます。逆にフリーメールのおかげで DMARC を PASS するため、スパムフィルターに引っ掛からずに素通りしてきます。
今回は、以前構築した Rspamd を使って、社長のなりすましメール(BEC:Business Email Compromise)をブロックする方法を共有します。

環境
- OS: AlmaLinux release 9.7 (Moss Jungle Cat)
- スパムフィルター: Rspamd daemon version 3.14.3
Rspamd の設定
今回のなりすましメールの特徴に合わせて「表示名に社長の名前が入っていた場合」かつ「メールアドレスが自社のドメインではない場合」のブロックルールを設定していきます。
表示名のリストを作成
まずは、表示名で騙られる社長の名前のリストを作成します。
/etc/rspamd/local.d/ceo_name.map を作成して、正規表現を使って記入します。
/山田\s?太郎/
/Taro\s?Yamada/iWeb GUI から操作できるように、所有者を変更しておきます。
chown _rspamd: /etc/rspamd/local.d/ceo_name.map自社ドメインのリストを作成
次に、自社のメールで使用されるドメインをリストアップします。
/etc/rspamd/local.d/my_domain.map を作成してドメインを列挙します。
example.com
example.co.jpこちらも Web GUI から操作できるように、所有者を変更しておきます。
chown _rspamd: /etc/rspamd/local.d/my_domain.mapMultimap で個別ルールを設定
下記で設定する IS_CEO_NAME と IS_CORP_DOMAIN の個別スコアを 0 に設定し、マッチしても直ちに判定は行わず、composites.conf の判断材料とします。
表示名の判定
ルール名は IS_CEO_NAME としました。
送信者の表示名を filter = "email:name"; で抽出し、ceo_name.map のリストと比較します。
MIME エンコードされた文字列は Rspamd によってデコードされ、UTF-8 として正規表現の判定にかけられます。
ドメインの判定
ルール名は IS_CORP_DOMAIN としました。
ドメイン名を filter = "email:domain"; で抽出し、my_domain.map のリストと比較します。
この 2 つの判定ルールを /etc/rspamd/local.d/multimap.conf の最後に追加します。
……(最終行に追加)……
# 社長名を騙る外部ドメインからのなりすまし対策
IS_CEO_NAME {
type = "header";
header = "From";
filter = "email:name";
score = 0.0;
description = "差出人名(なりすまし判定用)";
map = "/etc/rspamd/local.d/ceo_name.map";
regexp = true;
}
IS_CORP_DOMAIN {
type = "header";
header = "From";
filter = "email:domain";
score = 0.0;
description = "自社ドメイン(なりすまし判定用)";
map = "/etc/rspamd/local.d/my_domain.map";
}Composites で組み合わせて判定
/etc/rspamd/local.d/composites.conf に、IS_CEO_NAME と IS_CORP_DOMAIN を組み合わせる条件を記述し、最終スコアを付けます。
また、自社ドメインの場合は DMARC_POLICY_REJECT の判定を合わせることで、ドメインを詐称してくる場合にも対応できます。
CEO_IMPERSONATION {
description = "社長を騙る外部メール、または自社ドメインを偽装した不正メール";
expression = "IS_CEO_NAME & (!IS_CORP_DOMAIN | (IS_CORP_DOMAIN & DMARC_POLICY_REJECT))";
score = 20.0;
}Rspamd をリロード
Rspamd をリロードして、上記の設定を反映します。
rspamadm configtest
(out) syntax OK
systemctl restart rspamd以上で設定は完了です。
結果
設定後に届いた、なりすましメールのヘッダーを見たところ、きちんと動作しているようです。
X-Spamd-Result: default: False [21.10 / 10.00];
CEO_IMPERSONATION(20.00)[];
FREEMAIL_REPLYTO_NEQ_FROM_DOM(3.00)[];
ARC_ALLOW(-1.00)[microsoft.com:s=arcselector10001:i=1];
DMARC_POLICY_ALLOW(-0.50)[outlook.com,none];
R_DKIM_ALLOW(-0.20)[outlook.com:s=selector1];
R_SPF_ALLOW(-0.20)[+ip4:52.103.0.0/17];
MIME_BASE64_TEXT(0.10)[];
MIME_GOOD(-0.10)[multipart/alternative,text/plain];
FREEMAIL_REPLYTO(0.00)[gmail.com];
RCVD_TLS_LAST(0.00)[];
TO_DN_ALL(0.00)[];
FREEMAIL_ENVFROM(0.00)[outlook.com];
TO_MATCH_ENVRCPT_ALL(0.00)[];
FREEMAIL_FROM(0.00)[outlook.com];
RCPT_COUNT_ONE(0.00)[1];
GREYLIST(0.00)[pass,body];
MIME_TRACE(0.00)[0:+,1:+,2:~];
RCVD_IN_DNSWL_NONE(0.00)[52.103.10.20:from];
REPLYTO_DOM_NEQ_TO_DOM(0.00)[];
RCVD_COUNT_TWO(0.00)[2];
ARC_SIGNED(0.00)[example.com:s=dkim:i=2];
FROM_EQ_ENVFROM(0.00)[];
FROM_HAS_DN(0.00)[];
REPLYTO_DOM_NEQ_FROM_DOM(0.00)[];
MID_RHS_MATCH_FROMTLD(0.00)[];
RWL_MAILSPIKE_POSSIBLE(0.00)[52.103.10.20:from];
DWL_DNSWL_NONE(0.00)[outlook.com:dkim];
DKIM_TRACE(0.00)[outlook.com:+];
ASN(0.00)[asn:8075, ipnet:52.96.0.0/12, country:US];
HAS_REPLYTO(0.00)[xxxxxxxxxx@gmail.com]
X-Rspamd-Queue-Id: XXXXXXXXXXX
X-Rspamd-Action: add header
X-Spam-Status: Yes, score=21.10
X-Rspamd-Server: example.com
X-Spam-Level: *********************
X-Spam-Flag: YES
X-Spam: Yesおまけ(Sieve を使って振り分ける方法)
Rspamd での対応が難しい場合、アカウント毎に設定が必要にはなりますが、Sieve を使って簡単に対処することもできます。
Sieve のフィルター設定は、SnappyMail(旧 RainLoop)などから行うことができます。(SnappyMail のセットアップ方法は以前の記事を参照してください。)

SnappyMail にメールユーザーでログインし、「設定」⇒「フィルター」と辿り「Simple」フィルターリストを作成します。
条件の欄に「以下のルールのすべてにマッチ」として入力します。
- 差出人:「社長の名前」で空白の有無を記載した正規表現(Regexp)
- 差出人:「会社のドメイン」を含まない
例としてアクションに「破棄」を設定しましたが、不安な場合は「ごみ箱に移動」などでも良いでしょう。

必要に応じて複数のフィルターを作成して対処してください。


コメント