Spamメール対策

目次

スパムメール対策

世の中には悪い奴がいるもので、いらないメールを次から次へと送り付けてくる人がいます。日に数十通程度ならメールソフトがジャンクメールに振り分けてくれますのでさほど邪魔にはなりませんが、次から次へと送りつけられてくると、その中に本物のメールが埋もれて分からなくなる事態が生じます。こうなるとメールソフトでは対応できず、メールサーバーでの対応が必要になります。

メールサーバーの基本設定

弊社のメールサーバはpostfixを使っていますのでこの設定をしっかりと行うだけでもかなりの量のスパムメールを減少させることができます。

main.cfでの設定

まず、以下のふたつのパラメーターを設定します。

disable_vrfy_command=yes 

verifyコマンドを使えなくします。送信者に余計な情報を与えません。

smtpd_helo_required=yes 

HELO手順を要求します。お行儀の悪いメールソフトを排除し、またこの段階で不審な接続相手を排除できるようにします。

送信先の選別

下記のパラメーターを設定し、不審な接続先を排除します。

smtpd_client_restrictions = permit_mynetworks,reject_invalid_hostname,permit
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject
smtpd_helo_restrictions =permit_mynetworks,reject_invalid_hostname,reject_non_fqdn_hostname,permit
smtpd_sender_restrictions =reject_non_fqdn_sender,reject_non_fqdn_hostname,reject_invalid_hostname,reject_unknown_sender_domain,permit

右辺のパラメーターはメールサーバーによって設定を変える必要があります。場合によっては必要なメールも拒否してしまうので注意してください。この設定でほとんどの不正な(DNSで逆引き出来無い)送信者は排除できるはずです。詳細はpostfixのマニュアルを読んでください。

実在のアドレスを騙るスパムメール

上記の設定は不正なアドレスを使っているスパムメールには有効です。ところがスパムメールの中には実在するアドレスを使って来るものがあります。これに対しては上記の対策は有効ではありません。そこで送られてくるスパムメールの内容をチェックして、あるパターンと一致すればスパムと判断する仕掛けが必要になります。

メールのヘッダーでチェックする方法

main.cfで下記のように設定を行います。多分コメントアウトするだけでよいと思います。

header_checks = regexp:/etc/postfix/header_checks

そしてheader_checksファイルの中に排除したいメールの特徴を記入します。

/^Subject:.*(TElOR)/i REJECT spam                 TElORというパターンのあるサブジェクトを持つメールを排除します
/^From:.*<.*@lifesuppo.jp>$/i REJECT spam         送信先に@lifesuppo.jpというパターンのあるメールを排除します
/name=.*\.exe/ REJECT                             添付ファイルにexeという拡張子を持つメールを排除します

メールの本体でチェックする方法

main.cfで下記のように設定を行います。多分コメントアウトするだけでよいと思います。 body_checks = regexp:/etc/postfix/body_checks

そしてbody_checksファイルの中に排除したいメールの特徴を記入します。 /^(|[^>].*)viagra/ REJECT viagraというパターンのある本文を持つメールを排除します

日本語スパムメールの対処法 日本語のスパムメールの場合、文字がエンコードされているためチェックファイルにはエンコードされたパターンを記入してやる必要があります。 たとえば"事業拡大"というフレーズでスパムチェックするためにはこのフレーズをエンコードする必要があります。エンコードしたパターンを得るには

$echo "事業拡大"|nkf --base64
GyRCO3Y2SDNIQmcbKEIK

$echo "事業拡大"|nkf -MB
5LqL5qWt5ouh5aSnCg==

header_checksへは以下のように記入します。

/^Subject:.*(GyRCO3Y2SDNIQ|5LqL5qWt5ouh5a)/ REJECT spam      

エンコードは二通りのケースがあるようです。日本語のエンコードに詳しくないので理由はわかりません。だれか分かったら補足してください。


バックスキャッタ対策

バックスキャッタとは

他人のメールアドレスを騙ったスパムメールを大量に送りつけられ、スパムを受け取ったと判断したメールサーバーは配信不能メイルを騙られた人に返送します。その結果騙られた本人のメールサーバーに大量のエラー通知メールが届く現象です。1日数千通と送られてくるため小さなサーバーだとパンクしてしまいます。”Undelivered Mail Returned to Sender”という表題のついたメイルが大量にメールボックスにたまります。 まずは騙られたメールアドレスのパスワードを変更しましょう。侵入されて悪用されている恐れがあります。 やっかいなのはこのメールを送ってきたサーバーはスパムとは何の関係もありません。これをエラーとして返そうものならまた大量のエラーメッセージを発生させてしまいます。 エラーメール自体は正当なサーバーから送られてきた正当なメールです。これをエラーでハネることはできますが、そうすると本当にエラーが発生した時には、エラーメールが届かなくなってしまいます。

そこで着目したのが添付されてくる”Undelivered Mail Returned to Sender”という表題に添付されてくるエラーメールです。 あらっぽい方法ですがメールを添付してくるメールを全て拒否する方法もありますが、これはあまりオススメしません。 postfixでは添付されてくるメールのヘッダーをチェックできますのでそれを使うことにしました。 騙られた本人のメールが入手できますのでそれと比較して明らかに相違があるところを見つけます。

例えば、送信人の名前が違っているときがあります。

From:"Sakamoto" <sakamoto@cyber-labo.co.jp>       スパムの記述
From: sakamoto <sakamoto@cyber-labo.co.jp>        正しいの記述

違いが見つかれば後の処理は簡単です。 まずmain.cfで添付メールのヘッダーチェックを行うようにします。下記の行を追加します。

nested_header_checks = regexp:/etc/postfix/nested_header_checks

nested_header_checksというファイルを作成し、以下のように記述します。

/^From:.*(Sakamoto)/ DISCARD                 

エラーメールを返送しないためにREJECTにしない。 これで”Undelivered Mail Returned to Sender”は届かなくなります。

ただし、スパムの送信源が複数の箇所ある場合には、複数の対策が必要になります。

Spamボット対策

ある日突然メールサーバーに大量のメール転送要求が送られてきます。しかもここちらのメールサーバーのアドレスを偽装して、スパムメールを大量に発送します。やはり、このために大量の配送不達通知”Undelivered Mail Returned to Sender”などのタイトルメールが大量に届くようになります。極端な場合メールサーバーはダウンしてしまいます。そうでなくとも大量のトラフィックが発生するためにネットワークの性能が著しく低下してしまいます。


Spamボットとは

これは Spamボット(spambot)というもので、ウイルスに犯されたパソコン?がマスターの命令によって大量の転送要求をこちらに送り付けてくるものだそうです。そのためIPアドレスは多種多様でブラックリストはほとんど機能しません。また転送要求であるためbody_checkやheader_checkは機能しません。しかも相手先へはこちらのサーバー名を騙りますから、大量の不達通知の原因となります。
放っておくと自身のサーバーがブラックリストに載せられてしまいますので早急に対策が必要です。


main.cfでのrejectコマンドは効果が出ない

上で述べたようにmain.cfでrejectコマンドを設定してもSpamボットはメールのエラーチェックをしていないようで、転送拒否しても構わず送り付けて来られます。しかもその分メールサーバやネットワークの負担が重く、重大な障害になります。


遅延設定も効果は限定的

メールを受け付ける時、遅延時間を挿入する方法があります。メールを受け付ける時に数十秒待たせる方法です。しかしSpamの送者は1回の接続で大量の送信コマンドを入れているらしく効果は限定的でした。


postscreenによるSpam対策

postscreenというのはpostfixに新しく挿入されたSpamボット対策の機能です。postscreenはsmtpの前にコネクションを受け取り、その正当性を検査する機能です。postscreenで正当性がチェックされたら一旦接続を切断し、リトライを促します。Spamボットは殆どリトライしてこないそうです。リトライを受けて初めてsmtpに接続されます。
postscreenの機能は強力で半数以上のSpamは門前払いにされます。しかもsmtpのようにネームサーバーへの問い合わせを行いませんのでトラフィックが大幅に増えることはありません。


postscreenの設定

postscreenを有効にするにはまずmaster.cfを変更する必要があります。変更内容はこちらの”Turning on postscreen(8) without blocking mail メールをブロックせず postscreen(8) を有効にする”の項目を読んでください。7項目目のDNSBLの設定は必要ありません。
このままでもpostscreenは有効になりますが、メールをブロックしません。ブロックを有効にするにはmain.cfの編集が必要です。以下がその例です。

smtpd_soft_error_limit =2           #遅延時間の挿入
smtpd_error_sleep_time = 30s        #遅延時間の挿入
smtpd_hard_error_limit = 10         #遅延時間の挿入
postscreen_access_list = permit_mynetworks,        #自分のネットワークはチェックしない
        cidr:/etc/postfix/postscrenn_access.cidr   #ブラックリスト

postscreen_greet_action = enforce         #グリーティングで引っかかったらアウトにする
postscreen_pipelining_enable = yes        #コマンドのパイプラインチェックを有効にする
postscreen_non_smtp_command_enable = yes  #非SMPTコマンドのチェックを有効にする
postscreen_bare_newline_enable = yes      #ニューラインのチェックを有効にする
postscreen_blacklist_action = enforce     #ブラックリストで引っかかったらアウトにする
postscreen_pipelining_action = enforce    #パイプラインチェックで引っかかったらアウトにする
postscreen_non_smtp_command_action  = enforce      #非SMPTコマンドのチェックで引っかかったらアウトにする
postscreen_bare_newline_action = enforce       #非ニューラインのチェックで引っかかったらアウトにする

詳しくはこちらの文章をよく読んでください。

Postfixに設定する

ファイルを編集したら必ずpostmapを実行し、データベースを構築してください。

#postmap header_checks   /*checkファイルを編集した時のみ必要*/
#postfix reload

リロードすれば有効になります。Postfixを再起動する場合には。(多分不必要)

#systemctl restart postfix


サーバーに溜まったSpamのお掃除

いろんな設定が終わっても、それで終わりではありません。メールサーバーの中にはまだSpamが未処理メールの形で溜まっています。Spamに対してリトライを返すサーバーもあるので、いつまでも消えず、永遠にSpamを発信し続けてしまいます。


Postfixのメールキューを確認方法

# postqueue -p

メールサーバーに残っている未発信のメールを確認します

Postfixのメールキューを削除する方法

# postqueue -d ALL

これでメールサーバーはキレイになります。