スパムメール対策 、おや多いと思ったら設定し漏れ…

最近スパムメールが増えてきたので、設定の見直しをしてみた。いくつかのパターンに分けて対策を試みる。

fromが自分のメールアドレスに偽装されているもの

このパターンは、一目でスパムとわかるので、まとめて削除できるが、事前に何とかならないか設定方法を見直してみる。
 このパターンは、サーバーで拒否してほしい。これは、送信元IPや送信元サーバーのドメインで判断できる。しかし、ここのレンタルサーバサービスでは提供されていない。仕方ないので、メーラで受信後に自動削除してみよう。
 メーラによって設定方法や設定ができるかどうか変わりますが、以下はThunderbirdでの設定方法です。
 ツール→メッセージフィルタ→新規→フィルタ名を入力→条件で”カスタムヘッダ”「Received」 に”次を含む”「.XXXX (unknown」を指定し、 動作に「メッセージ削除」を指定する。
  この設定で、 *.XXXX ドメインと語るサーバー(本当のドメイン名unknownつまりDNSで逆引きできない)から送信されたメールを削除する。

特定IPからの送信を拒否

特定IPからの送信を拒否するより、送信元のメールアドレスが自分で、送信元のIPが自分以外のものを拒否するほうが効果的だろう。このパターンも レンタルサーバサービスでは拒否方法が提供されていない。同様に、メーラーで削除設定してみよう。上と、同様に
 仕方ないので、メーラで受信後に自動削除してみよう。
 ツール→メッセージフィルタ→新規→フィルタ名を入力→条件でカスタムヘッダ「差出人」に「次を含む」・「自分のメールアドレス」とand条件で「Received」 に「次を含む」、「unknown」を指定し、 動作に「メッセージ削除」を指定する。 「Received」 に「次を含む」、「(unknown」を指定し、 動作に「メッセージ削除」を指定する。※2019/12/26更新 普通にサービスされている正式なものにも意外に送信元名が設定されていないサーバーがあるので、IP逆引きできないものに限定することにした。これだけでも半数以上のスパムを処置できそうです。

以上の設定で、かなりの数のスパムメールが減るハズ。
とりあえず、1週間くらいこれで様子を見てみよう

spamの配信ツールはDNSキャッシュがずっと残る?

サーバが切り替わったので、古いサーバ宛のメールはほとんど来なくなりましたが、今日もまだ古いサーバに1件メールが来ていたので確認してみました。

”Security Notice. ……”というタイトルのspamメールでした。
送信ツールから、直接古いメースサーバ宛に送信されていました。普通のメールクライアントからの送信なら、送信用メールサーバーを経由するので、2段階以上の送受信となるはずですが、つぎのように、1段階だけでした。
 この部分をチェックするだけでも、何らかのツールを使って送信していることが分かります。

メールのソース
:省略
X-Mozilla-Keys:                                                                                 
Return-Path: <xxx@mic.or.jp>
Received: from tm.82.192.61.119.dc.telemach.net (tm.82.192.61.119.dc.telemach.net [82.192.61.119])
 by mic.or.jp (Postfix) with ESMTP id 7070911002A03
 for <xxxx@mic.or.jp>; Wed,  9 Oct 2019 10:25:50 +0900 (JST)
From: xxxx@mic.or.jp>
To: <xxxx@mic.or.jp>
Subject: 
:省略

  そして、DNSを切り替えて、1週間程度経過しているにも関わらず、古いサーバ宛に送信されています。 どこかにキャッシュされていたDNS情報を取得して古いサーバ宛に送信されたことが考えられます。しかし、今回のケースだと、1週間以上前にもメール送信した実績があり、その時に取得したDNS情報をキャッシュしていて、昨日メール送信する際にその情報を使ってメール送信したと考えるのが妥当でしょう。 メールマガジンの配信など大量メール送信ツールにはDNS情報のようにキャッシュできるものはキャッシュして性能を稼ぐ実装を採用しているものもあります。そのような技術をspam送信に利用しているのでしょう。

Pythonで日本語メール送信

定期実行タスクの機能を使ってメール送信していましたが、content-typeを次のようにcharsetを指定したいのに、

Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit
Content-Language: en-US

つぎのように指定されています。
Content-Type: text/plain; charset=ANSI_X3.4-1968

このcharset指定のメールでは、日本語の文面が文字化けしてしまいます。受信したメーラーで明示的に文字コードを指定することで文字化けは解消しますが、いちいち指定する手間が大変です。そこで定期実行タスクのメール送信機能は使わずに、Pythonから直接送信するように変更します。

Python2.6で使用するので、 Uchida さんのコードを参考にさせていただきました。

参考のための補足情報:

・デバック方法
smtp = smtplib.SMTP(c[‘host’], c[‘port’])
の次の行に 「 smtp.set_debuglevel(True) 」を追加することで、メールサーバとの通信内容を確認できます。

・ユーザー名、パスワードの指定にはダブルクオーテーションでくくるのはNGです。ダブルクオーテーションもユーザー名、パスワードとして送信されます。

user = <アカウント名>
password = <パスワード>

このPython実装でのメールでは、charsetは次のように設定されます。

Content-Type: text/plain; charset="iso-2022-jp"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

以上の設定により 、メールの日本語文面を文字化けせずに参照することができます。 これをベースに、脆弱性情報の通知メールに送信機能を組み込みます。

脆弱性情報の通知メールの仕掛けの更新

結構、動的に更新されるのか、頻繁に脆弱性ページが更新されています。
このため、先に作成した(5/9)、バージョンアップ情報や脆弱性対処を含むパッチの提供情報の通知メールが2,3日おきに飛んできます。WordPress5.3の作業も始まって、この更新分もあります。デイリーなのか更新頻度がどの程度なのかで、チェック方法を検討しなおします。
とりあえずメール文面を強化して簡単に更新内容をチェックできるようにしました。
今後、Webページの更新内容自体が、動的更新によるものかどうかを自動チェックして、通知するかどうかを切り分けるように強化します。※