スパムメールで困った!!(postfix編)

あれ、電話だ!

たいへんです、、、助けてください!

どうしたんですか?

スパムメールが大量に届くようになって。。。
アドレスが流出したのかなあ?

そうとも限りませんよ。
スパマーはランダムにメールアドレスを探したりもしてますから。
常にスパム対策を講じておく必要があります。

うちは、規模が小さいからWEBサーバーと兼用でメールサーバーを構築してもらってます。
たしかポストミックス?

postfix(ポストフィックス)ですね。
Linux系のサーバーで最もポピュラーなMTA(メール転送エージェント/Mail Transfer Agentまたは Message Transfer Agent)の一つです。

で、ズバリ、スパム減らせますか?

方法はいくつかあります。
大きく分けてメールサーバーの次の3つのパートで対策を打ちます。

Postfixを使用したメールサーバーでのスパムメール対策

  1. メール転送エージェント(MTA)―Postfixでブロック
  2. メール配送エージェント(MDA)―POP3/IMAPサーバ(ここではDovecotと追加プログラム)でブロック
  3. 電子メールクライアント(MUA)―例えばOutlook、Thunderbird、Gmail、Apple Mailなどでブロック

きたピーさんの会社のサーバーは、MTAがPostfix、MDAがDovecot、社員のみなさんのメールソフト(MUA)はOutlookを中心にデザイナーさんがApple Mail、スマホがGmailクライアントということで、それに沿って簡単に説明しますね。

1. メール転送エージェント(MTA)―Postfixでブロック

まずは正しい設定になっているかチェックします。ただ、今回は基本的なPostfixのセキュアな設定の詳細は最低限できているものとしてここでは省略し、スパム対策に関する部分だけ紹介します。
※ 情報の秘匿や正しい認証設定、送信元やリレーの制限など、不正アクセスや不正中継などを防ぐ設定は必ず行ってください。

DNSBLなどのブラックリストを使用してPostfixでスパムを送信元のIPアドレスを抑制します。

smtpd_client_restrictions = permit_mynetworks, # 内部からのアクセスは許可
                            reject_rbl_client bl.spamcop.net,
                            permit

DNSBLには他にも(zen.)spamhaus.orgや(bsb.)spamlookup.netなど100前後のリストがありますが、以前と違いスパマー自身のサーバーからの発信より、国内を含めた世界中の大量のマルウエアに感染したPCのbotや認証情報が盗まれたサーバーから発信されるため、受信すべきメールを偽陽性(false positives)判定してしまう可能性が増えるので、Postfix上ではセキュリティー面を重視し、直接の対策は最低限にしておくべきです。

うちは取引先だけじゃなくて、一般のお客様の問い合わせも多いので、ISP経由のメールも多いから困ります!

DNSBLの使用は最小限にしておきましょう。MTA側では一つも利用しなくてもいいと思います。
また、自前のIPアドレスのブラックリストを登録することもできます。
拒否したいIPアドレスと処理を1行ずつ記載した下記のようなリストを作成し、main.cfに1行追加します。

1.2.3.4 REJECT
xxx.xxxx.xxx.xxx REJECT
:
smtpd_client_restrictions = permit_mynetworks, # 内部からのアクセスは許可
                            reject_rbl_client bl.spamcop.net,
                            # ↓を追加//etc/postfix/は利用しているサーバー上のpostfixの場所に置換、ファイル名は自由
                            check_client_access hash:/etc/postfix/reject_client,
                            permit

リストを更新するたびに、RHEL系やubuntuサーバーなら
postmap /etc/postfix/client_access
systemctl reload postfix.service
を実行し、DB化とその反映をします。

難しそう。。。

postfixでの対策はそこまで追求しなくてもいいと思います。御社のメールサーバーが不正に利用されないよう、セキュリティ面で正しい設定がされているか今度見てみましょう。
ただ、御社のように顧客や取引先が国内に限定されている場合は、効率よく海外からのスパムを弾くことができるかもしれません。ご依頼いただければセキュリティ部分と合わせて設定します。

お願いします。

この他にも、MTAの前にゲートウェイ(メールファイヤーウォール)という形で組み込む製品もあります。
高額な国内製品以外に、海外ではオープンソースや有料版の無料のコミュニティー版もありますが、国内メールへの有効性や日本語情報の不足などハードルは高いです。
規模を考えると、次のMDAでの対策をメインに考えたほうがいいと思います。

2. メール配送エージェント(MDA)―Dovecotでブロック

Dovcotの設定自体ではなく、サーバー上で使用するアンチスパムプログラムを使用します。

Linux系のサーバーでは実績のあるものから、比較的新しいものまでいくつかのプログラムがあります

  1. SpamAssassin
    2001年にリリースされたスパムフィルタリングのプログラムで、サーバーだけでなく、メールクライアントに組み込んで使用することもできる。正規表現を使った「テスト」と呼ばれる規則で個々のメールにスコア付けを行い、スパムメールを判断する。「amavisd-new」といったMTAとアンチスパムプログラムを結ぶインターフェイスやDovcotにファイリング/仕分け機能を追加するSieveという言語を使用できるようにするpigeonholeなどと組み合わせることによって、自動化ができる。「ベイジアンフィルタ」という学習機能もあり、フレキシブルな規則が設定できるが、Perlで書かれているため実行速度や負荷にやや難がある。
  2. Rspamd
    2008年にリリースされたスパムフィルタリングのプログラム。正規表現、統計分析など様々なルールによってメッセージを評価し、スパムメールを判断する。spam評価機能はそれぞれモジュールとして提供されていて、柔軟に処理を設定できる。デフォルトで統計情報を表示するためのウェブインタフェースが使用できる。機能を生かすにはWEBサーバー(ApacheまたはNginx)とRedis(NoSqlデータベースのひとつ)が必須。

このほかMailScanner(SpamAssassinなどと組み合わせて使用。過去に脆弱性の問題があったりして国内では利用者は多くない。)、Bogofilter(Cで書かれたベイジアンフィルタを持ったメールフィルター)などのツールもありますが、安定性や日本語の情報などを考えると上記のどちらかが有力な選択肢でしょう。

今回はきたピーさんやスタッフのみなさんがWEBで確認しやすいRspamdを採用してみましょう。
きたピーさんの会社のメールサーバーはCentOS7でWEBサーバーと共用ということなので、その前提で解説します。

Postfix、Dovecotの設定、TLSの使用設定等は済んでいるものとします。
また、ApacheまたはNginx等のWEBサーバ、およびなんらかのfirewallを適切な設定の元運用していることも前提とします

事前準備として、キャッシングストレージとして使用するRedisをインストールします。
※ remiレポジトリを使用しているなら、remiを有効にしてインストールするとepelより新しいバージョンが入手できます。

$ sudo yum -y install epel-release
$ sudo yum install -y redis

Daemonとして起動設定します。

$ sudo systemctl start redis.service
$ sudo systemctl status redis.service
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/redis.service.d
           └─limit.conf
:
:
$ sudo systemctl enable redis.service

Redisの設定を変更します

maxmemory 500m # メモリー上限を制限します。サーバーのスペックに合ったメモリーを設定してください。
maxmemory-policy volatile-ttl #メモリーが飽和した時、有効期限が設定されたキーの中でより短い有効期間(TTL)のキーを削除する

次のようにループバックインターフェイスを制限するよう設定、または確認してください。

bind 127.0.0.1 ::1

また、RspamdのWEBインターフェイスは11334ポートを使用する(デフォルト/変更可能)ため、firewallで11334ポートの使用を許可します。ポートを開けたくない場合は、WEBサーバー側でプロキシ設定やリダイレクト処理を記載します。

$ sudo firewall-cmd --permanent --add-port=11334/tcp
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-ports # 確認

Rspamdのパッケージをインストールします

$ sudo curl https://rspamd.com/rpm-stable/centos-7/rspamd.repo > /etc/yum.repos.d/rspamd.repo # For Centos-7
#curl https://rspamd.com/rpm-stable/centos-8/rspamd.repo > /etc/yum.repos.d/rspamd.repo # Uncomment for Centos-8
$ sudo rpm --import https://rspamd.com/rpm-stable/gpg.key
$ sudo yum update
$ sudo yum install rspamd

【参考】Debian/Ubuntuの場合

sudo apt-get install -y lsb-release wget # optional
CODENAME=`lsb_release -c -s`
sudo mkdir -p /etc/apt/keyrings
wget -O- https://rspamd.com/apt-stable/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/rspamd.gpg > /dev/null
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rspamd.gpg] http://rspamd.com/apt-stable/ $CODENAME main" | sudo tee /etc/apt/sources.list.d/rspamd.list
echo "deb-src [arch=amd64 signed-by=/etc/apt/keyrings/rspamd.gpg] http://rspamd.com/apt-stable/ $CODENAME main"  | sudo tee -a /etc/apt/sources.list.d/rspamd.list
apt-get update
apt-get --no-install-recommends install rspamd
Debian/UbuntuはHyperscanとLuaJITがenabledであること

以下のサブコマンドを使って、ウィザード形式で基本設定をします。

$ sudo rspamadm configwizard

configwizardの対話形式にそって設定を進めていきます。
“Controller password is not set, do you want to set one?”ははn(NO) 、
“Do you wish to set Redis servers?[Y/n]”: はY(YES)、
“Input read only servers separated by `,` [default: localhost]: “は”127.0.0.1:6379″、
“Input write only servers separated by `,` [default: localhost]: “は”127.0.0.1:6379”
と設定してください。
その他は基本的にYES(orENTER)で構いません。

rspamadm pwというサブコマンドで管理者用とスタッフ用パスワードを生成します。

 # オプション ベイズ・トレーニングなどのデータ変更操作で必要
$ sudo rspamadm pw
Enter passphrase: 管理者用パスワード

 # 必要 configwizardで設定も可
$ sudo rspamadm pw
Enter passphrase: スタッフ用パスワード

“worker-controller.inc”という設定ファイルに生成したパスワードを登録します。

$ sudo vim /etc/rspamd/local.d/worker-controller.inc
password = スタッフ用パスワード;
enable_password = 管理者用パスワード; # オプション ベイズ・トレーニングなどのデータ変更操作で必要

Redis関連の追加設定を行います。ベイズ統計とキャッシュのバックエンドとしてRedisを指定します。

# 設定または確認します。
servers = "127.0.0.1";
backend = "redis";

しきい値の設定などはこちらで行います

# 例

 reject = 150; # 記載されたスコア以上でReject(拒否)する
 add_header = 6; # 記載されたスコア以上でスパムであるヘッダ要素を追加する
 greylist = 4; # 記載されたスコア以上でグレー判定をする

スコアは以下の設定ファイルでシンボルごとに定義します。
シンボルとは個別のルールのようなものです。またある関連のあるシンボルが集まったものをグループといいます。

  • fuzzy_group.conf  # ファジーハッシュ値のスコアリングに関する設定
  • headers_group.conf # 様々なヘッダ要素のチェックに関する設定
  • hfilter_group.conf # ホストフィルターのチェックに関する設定
  • mime_types_group.conf # mimeタイプに関連するルールに関する設定
  • mua_group.conf # MUAに関するルールに関する設定
  • neural_group.conf # ニューラルネットワークのスコア生成に関する設定
  • phishing_group.conf # フィッシングサイト(URL)に関する設定
  • policies_group.conf # DKIM, SPF, DMARC, ARCなどのポリシーに関する設定
  • rbl_group.conf # RBL(公開ブラックリスト)が作成したルールに関する設定
  • statistics_group.conf # ベイズ統計に関する設定に関する設定
  • subject_group.conf # 件名のチェックに関する設定
  • surbl_group.conf # ブラックリストURLに関する設定

ユーザーによるカスタムのシンボルとグループ定義も作成できます。

個別の設定は、サイトの規模や内容、ビジネスや業種の特性、被害の状況などによってノウハウが異なるので、今回は省略します。また、運営する中で逐次定義をカスタマイズしておくことをお勧めします。その際最低限、基本的な正規表現などをマスターしておくと便利です。

# 例
group "mygroup" {
  symbols =  {
    "TBBUSTERLIST1" {
      score = 20.0;
    }
  }
}

Rspamdを起動、daemonとして有効化します。

$ sudo systemctl start rspamd
$ sudo systemctl enable rspamd

コマンドラインからの使用は”rspamc”というクライアントプログラムを使用します。

【例1】サーバーのディスクに保存済みのメッセージをスキャン

$ sudo rspamc < file.eml
$ sudo rspamc file.eml

【例2】ベイズ学習のトレーニング

$ sudo rspamc learn_spam < file.eml
$ sudo rspamc learn_ham file.eml

サーバー側で迷惑メール等のフォルダの振り分けをするにはspamassassinと同じようにdovecot(MDA)でSieve scriptを書く必要があります。

【例】

require ["fileinto"];
if header :is "X-Spam" "Yes" {
        fileinto "Junk";
}

ブラウザからWEBインターフェイスで使用するには、https://サーバーのドメイン(FQDN):11334/でアクセスします。(WEBサーバー側でproxy、リダイレクトで443等のポートで表示するようにした場合は”https://”以下を設定したパスに差し替えてください。証明書エラー等になった場合は、WEBサーバーで”/usr/share/rspamd/www/””ディレクティブに証明書を設定してください。)

上記管理画面画像

Rspamd 公式ページより https://rspamd.com/doc/quickstart.html

先ほど設定したスタッフ用または管理者用のパスワードでログインします。
この画面で様々なシ数値やログに対するアクション、スコアの設定、統計の表示、および学習のための基本的な機能を使用することができます。

なんか難しそうですね。。。でもブラウザでグラフとか確認できるのはいいですね。

そうですね。どのツールを使っても、どこかで専門的知識は必要です。ブラウザで操作できたり、学習機能が付いていても、適切な設定と適度なカスタマイズができないとスパムを防いだり、逆に大事なメールを確実に受け取ることはできません。

ウイルスメール対策とも連携できるんですか?

ええ、むしろ必須です。
きたピーさんの方でご依頼いただければ細かな設定や運用のサポートはやりますよ。

ぜひお願いします!

3. 電子メールクライアント(MUA)―Outlookでブロック

最後はきたピーさんやスタッフの皆さんが日々使っているメールソフトでのブロックです。
最後の砦ですね。

これは、覚えなくては。

マイクロソフトのOutlookがメインということなので、Outlookで最低限やっておくべきことをやってみましょう。

1. まず、スパムメールの自動振り分け設定を最初に設定しましょう。

上部メニューで「ホーム」を選択、表示されたリボンの「削除」タブにある「迷惑メール」ボタンをクリックしてプルダウンメニューを表示、一番下の「迷惑メールのオプション」をクリックします。

下図のような「迷惑メールのオプション」ウインドウが表示されます。
一番左の「オプション」タブを選択してください。

Ⅰ. 「迷惑メニューの処理レベル」を選択します
下に行くほど判定が厳しくなります。通常は2番目の「」を使用しておくと無難です。「」だと受信ボックスに残るスパムメールは少なくなりますが、正規のメールが誤って迷惑メールに振り分けられることも多くなります。サービス内容やメール送信者のの範囲などに応じて設定してください。

Ⅱ. 迷惑メールの処理方法を選択します。
「迷惑メールを迷惑メール フォルダーに振り分けないで削除する」のチェックボックスは「自動処理なし」または「セーフリストのみ」を選択した時以外は、選択しないほうがよいでしょう。擬陽性(誤ってスパム判定された正規メール)の可能性があるので、迷惑メールフォルダで確認してから削除しましょう。

Ⅲ. 「低」「高」を選択した場合、「電子メール アドレスに不審なドメイン名が含まれる場合に警告を表示する(推奨)」にチェックを入れてください。※「自動処理なし」「セーフリストのみ」の場合は選択できません。

設定したら「適用」または「OK」を押して確定させてください。※変更しない場合は「キャンセル」

2. 自動で振り分けられないスパムメールや、明らかに受信拒否をしたいメールを手動でスパムメールの差出人を受信拒否リストに登録し、迷惑メールフォルダーに振り分けましょう。

Outlookで受信フォルダを表示し、左カラムのリストでスパムメールを選択します。その際、メール本文は決してクリックしないようにしてください。フィッシングメールの場合、画像や白文字などのリンクが設置されている場合があります。

次に上部リボンの「削除」にある「迷惑メール」ボタンをクリックしてプルダウンメニューを表示、「受信拒否リスト」をクリックします。選択したスパムメールのドメインごと拒否したい場合は、「差出人のドメイン」を選択します。

以下のようなポップアップウインドウが表示され、「OK]をクリックすると該当の送信アドレスが「受信拒否リスト」に、メールが迷惑メールフォルダに移動します。

迷惑メールフォルダに移動しました。

でも最近、差出人のアドレスが大手ネットサービスや金融機関なのに怪しいメールがたくさん来ます。
特にこの一年くらい、ロゴやリンク先表示も正しいように見えるのですが、スタッフがクリックしてしまい大騒ぎになったこともありました。

そうなんです。「差出人」はおろか、Return-PathやBody(本文)部分の画像や一部のリンク先が正しく設定されているなど、巧妙なフィッシングメールが増えています。DKIMなどの信用情報も設定されていたり、感染した国内のPCやサーバーや、国内のレンタルサーバーから送信、リレーされているなど普通の人にはなかなか見分けがつかないものも増えています。

ひえ~。
どうしたらいいんでしょう・・・

やはり、この前に説明したサーバー側で適切な処理をすること。そして、PCのメールソフトの差出人(Senderヘッダー)を使用した迷惑メール振り分け機能を信用しすぎないことです。

自分やスタッフなど社員はではどうしたら?

まず、「差出人」やリンクのURL表示は簡単に詐称できるということを頭に入れて、リンクを安易にクリックしないことです。特にトラブルや危急の対応をあおったものはフィッシングの可能性もあると考えることが大事です。

リンクはカーソルをリンク上に持っていくと実際のリンク先のURLが表示されるはずです。クリックしないように気をつけて確かめるといいでしょう。よくあるのが、「https://troublebusters-net.com」や「https://troblebusters.net」のように、本物のように見せかけているアドレスもよく使われますので、注意深く見てください。

取引先でそうしていると聞いたことがあります。
ただ、それでも偽サイトに誘導されたという話も聞きました。

今、日本語のドメインや多言語のURLが許容されています(実際にはPunycodeに変換されています)。以前、そこを逆手にとって、キリル文字などアルファベットに似ている文字のある言語で偽サイトに誘導するホモグラフ攻撃というやり方や、ショートURLでリンク先を隠すといった手口も多く見られました。

apple(すべてアルファベット)аррle(先頭の1文字がキリル文字)

見分けがつかない・・・

この方法は、サーバーでのアンチスパムプログラムを回避するためにも使用されます。
キーワードが検出されるのを回避するため、一部の文字をキリル文字などに入れ替え、プログラムがキーワードと認識しないようにする一方、ユーザーには誤認識させるようにします。

万全ではありませんが、ビジネス等で問題なければOutlookでもこれらの言語を制限してしまうことができます。また、トップドメインの制限も併せて行えます。

先ほどと同じ手順で、「迷惑メールのオプション」ウインドウを表示させます。
今回は一番右の「インターナショナル」タブを選択してください。

Ⅰ. トップドメインを制限するには①の「ブロックするトップドメインリスト」をクリックします。ここでは特定の国や地域を表すトップドメインのブロックができます。
※ トップドメイン=ドメインの一番最後にある「.com」「.jp」「.org」のような組織の形態、国などを表す部分。
「ブロックするトップドメインリスト」ウインドウが開くので、ブロックするトップドメイン(国/地域)を選び、「OK」で確定させてください。自社のビジネスに影響ない国はブロックしても大丈夫でしょう。

Ⅱ. 使用しない国際文字を制限するには「ブロックするエンコードリスト」をクリックします。

「ブロックするエンコードリスト」ウインドウが開くので、ブロックする言語を選び、「OK」で確定させてください。自社のビジネスに影響ない言語はブロックしても大丈夫でしょう。

最後に「迷惑メールのオプション」ウインドウで「適用」または「OK」を押して確定させてください。※変更しない場合は「キャンセル」

うちのビジネスは国内と取引先もせいぜい英語圏だけなので、結構ブロックしちゃいました。
逆にお客さんのメールが迷惑メールフォルダに振り分けられちゃったら、どうしましょう。

手動で戻せます。

3. 誤って迷惑メールとして処理されたメールを戻すには、以下の手順で行います。

Outlookで迷惑メールフォルダを表示し、左カラムのリストで戻したいメールを選択します。

次に上部リボンの「削除」にある「迷惑メール」ボタンをクリックしてプルダウンメニューを表示、今回は「迷惑メールではないメール」をクリックします。選択したメールのグループごと戻したい場合は、「このグループまたはメーリングリストを拒否しない」を選択します。

ポップアップが表示され、「OK」をクリックするとメールが受信トレイに移動します。この時、ポップアップの「(メールの差出人アドレス)からのメールを常に信頼する」をチェックすると該当の送信アドレスが「信頼できる差出人リスト」に追加されます。

また、メールとは別に「受信拒否リスト」「信頼できる差出人リスト」は手動で編集(追加、修正、削除)ができます。先ほどと同じ手順で、「迷惑メールのオプション」ウインドウを表示させ、編集したいリストのタブを選択してください。※ 図は「受信拒否リスト」を編集。

右上の「追加」ボタンでアドレスを手動で入力して追加できるほか、「編集」でアドレスを手動で修正、また誤って追加されたアドレスを「削除」ボタンでリストから除外することができます。

AppleメールやGmailなどの調整はあとでまた該当端末でスタッフの方に説明しますね。

お願いします。

このほか、クライアントPCではアンチウイルスソフトを使っていると思いますが、アンチウイルスソフトに付属のアンチスパムツールも使用して対策してみてください。
ただ、メールソフトによっては対応していなかったり、マイクロソフトストアからダウンロードされたものは対象外だったり、絶対の信頼がおけるものではないと考えてください。

ゲートウェイ方式のものもありますが、国内のものはかなりのコストがかかります。海外のものでオープンソースのものもありますが、国内の利用実績が少なく、日本語化も進んでいないためハードルが高いかもしれません。

対策を打ったうえで、自分でも気をつけるということですね。

そうですね。絶対はないですから。