目次 |
---|
世の中には悪い奴がいるもので、いらないメールを次から次へと送り付けてくる人がいます。日に数十通程度ならメールソフトがジャンクメールに振り分けてくれますのでさほど邪魔にはなりませんが、次から次へと送りつけられてくると、その中に本物のメールが埋もれて分からなくなる事態が生じます。こうなるとメールソフトでは対応できず、メールサーバーでの対応が必要になります。
弊社のメールサーバはpostfixを使っていますのでこの設定をしっかりと行うだけでもかなりの量のスパムメールを減少させることができます。
まず、以下のふたつのパラメーターを設定します。
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”は届かなくなります。
ただし、スパムの送信源が複数の箇所ある場合には、複数の対策が必要になります。
ある日突然メールサーバーに大量のメール転送要求が送られてきます。しかもここちらのメールサーバーのアドレスを偽装して、スパムメールを大量に発送します。やはり、このために大量の配送不達通知”Undelivered Mail Returned to Sender”などのタイトルメールが大量に届くようになります。極端な場合メールサーバーはダウンしてしまいます。そうでなくとも大量のトラフィックが発生するためにネットワークの性能が著しく低下してしまいます。
これは Spamボット(spambot)というもので、ウイルスに犯されたパソコン?がマスターの命令によって大量の転送要求をこちらに送り付けてくるものだそうです。そのためIPアドレスは多種多様でブラックリストはほとんど機能しません。また転送要求であるためbody_checkやheader_checkは機能しません。しかも相手先へはこちらのサーバー名を騙りますから、大量の不達通知の原因となります。
放っておくと自身のサーバーがブラックリストに載せられてしまいますので早急に対策が必要です。
上で述べたようにmain.cfでrejectコマンドを設定してもSpamボットはメールのエラーチェックをしていないようで、転送拒否しても構わず送り付けて来られます。しかもその分メールサーバやネットワークの負担が重く、重大な障害になります。
メールを受け付ける時、遅延時間を挿入する方法があります。メールを受け付ける時に数十秒待たせる方法です。しかしSpamの送者は1回の接続で大量の送信コマンドを入れているらしく効果は限定的でした。
postscreenというのはpostfixに新しく挿入されたSpamボット対策の機能です。postscreenはsmtpの前にコネクションを受け取り、その正当性を検査する機能です。postscreenで正当性がチェックされたら一旦接続を切断し、リトライを促します。Spamボットは殆どリトライしてこないそうです。リトライを受けて初めてsmtpに接続されます。
postscreenの機能は強力で半数以上のSpamは門前払いにされます。しかもsmtpのようにネームサーバーへの問い合わせを行いませんのでトラフィックが大幅に増えることはありません。
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 #非ニューラインのチェックで引っかかったらアウトにする
詳しくはこちらの文章をよく読んでください。
ファイルを編集したら必ずpostmapを実行し、データベースを構築してください。
#postmap header_checks /*checkファイルを編集した時のみ必要*/ #postfix reload
リロードすれば有効になります。Postfixを再起動する場合には。(多分不必要)
#systemctl restart postfix