ふたたび、SPAMメールを何とかやっつけようという話です。
最近の、いや最近と言ってももう数年、いやもう10年くらいにはなるから「最近」とは言えないな。こういうブログに書いておくと、さらに10年くらい経ってから目にする人もいるかも知れないから、最近ではなく昔の話になってしまうか。
何かと言うと、SPAMメールの発信元の情報のこと。随分前、プロバイダ側での対策が進んでいない頃はどこかのメールサーバーを経由してSPAMが届いてきていたんだ。ところが多くのプロバイダ側でメールサーバーの不正利用を排除する対策が進んできたため、発信方法が変わってきた。
どうなっているかと言うと、普通にネット接続しているPCにメール発信用のソフトを乗せ、相手先のメールサーバーに直接メールを送り込むというものだ。経由するメールサーバーが無いわけで、その分、SPAM本体にとっては生き残る可能性が高まるということになる。SPAM送信者としては、PCをネットに接続するだけなので、使い勝手もかなり良いはずだし、メールのヘッダーやら関連情報もいじれるから便利だろうことは想像に難くない。ツールを提供している奴がいそうだから、そいつには「ふざけんな」と言いたいところだが、俺の持っている知識でも作れるようなもんだから、誰かしらそういうことをする奴がいてもまあ仕方ないか。
そこで対策だが、考え方としては下記の通りになる。
1.自分のメールサーバーにメールを送り込んできたサーバーに着目する
2.このサーバーが動的にIPアドレスを振られているようなら怪しいものとする
では、メールのヘッダーにおいて経路情報がどう書かれているかと言うと、次のとおり。ここで言う「サーバー名」はサーバーに個別に与えられたドメイン名のことになる。
Received: from 送信元サーバー名 (送信元逆引きサーバー名 [IPアドレス]) by 受信サーバー名; 日時情報
メールのヘッダーの中でRecieved: fromで始まり受信サーバーがwww000.sakura.ne.jpとなっている行、つまりこれが使っているレンタルサーバーが受信した際の記録になるわけだ。ここにおいて、カッコ内にある逆引きドメイン名が判断材料としてはおおよそ正しいだろうということになる。
そして「.mailfilter」への実装をするにあたっては、動的IPアドレスの場合のパターンは、スパムメールを99%阻止するサーバ設定に大いに学ばせてもらった。下記コード中の「www000.sakura.ne.jp」の部分は、使っているレンタルサーバーの名称に書き換えてくれれば良い。なお、前回の記事、というか、さくらのレンタルサーバ非公式FAQに目を通してから試してください。特にテスト方法は見ておかないと、mailfilterはは書き間違えるとメールが一切届きませんから。
下記の例は実際に我がサーバーに設定しているものの一部を抜粋している。このコード中におけるFQDNという表記は送信元逆引きサーバー名と読み換えて理解してほしい。もちろん、これらは完全ではないので、必要なメールがspamに分類されたり、逆に排除したいメールが届いたりもするだろうけれど、そのことを理解した上で動作を検証して欲しい。何かあっても私は一切の責任を負いませんし、負えませんから。
# まず、ホワイトリストに入っている場合はチェック対象としないよう、全体を括る # ここにある「&& (1)」はさくらFAQに書いてあった通り、サーバに条件を上書きされないためのおまじない if ( ! ( /^From:\s*(.*)/ && lookup( $MATCH1, ".whitelist" ) ) && (1) ) { # FQDNが含まれていないケース if ( /^Received:.from.*\(\[.*\]\).*by www000.sakura.ne.jp \(.*/:h ) { to "maildir/.spam/" } # サーバーが偽証じゃないかと言ってくれているケース # 正しいメールでも「may be forged」が付加される場合があるので注意が必要 if ( /^Received:.from.*\(may be forged\)\).*by www000.sakura.ne.jp \(.*/:h ) { to "maildir/.spam/" } # サーバー名の最上位(右端)がlocaldomainであるケース # グローバルなネット上の名称を持っていないと推測 if ( /^Received:.*from.*\.localdomain .*by www000.sakura.ne.jp /:h ) { to "maildir/.spam/" } # FQDNに数字列4つが数字以外の文字で区切られながら含まれているケース if ( /^Received:.*from.*\([0-9]+[\W][0-9]+[\W][0-9]+[\W][0-9]+[\W].+\).*by www000.sakura.ne.jp /:h ) { to "maildir/.spam/" } # FQDNの最下位(左端)に数字が2回現れるケース if ( /^Received:.*from.*\([^.]*[0-9][^0-9.]+[0-9].*\..*\).*by www000.sakura.ne.jp /:h ) { to "maildir/.spam/" } # FQDNの最下位(左端)に連続する数字5文字があるケース if ( /^Received:.*from.*\([^.]*[0-9]{5}.*\).*by www000.sakura.ne.jp /:h ) { to "maildir/.spam/" } # FQDNの最下位または下位から2番目の名前が数字で始まるケース if ( /^Received:.*from.*\(([^.]+\.)?[0-9][^.]*\.[^.]+\..+\.[a-z].*\).*by www000.sakura.ne.jp /:h ) { to "maildir/.spam/" } # FQDNの下位2階層の名前がともに数字で終わるケース if ( /^Received:.*from.*\([^.]*[0-9]\.[^.]*[0-9]\.[^.]+\..+\..*\).*by www000.sakura.ne.jp /:h ) { to "maildir/.spam/" } # FQDNの最下位の名前がdhcp、dialup、ppp、またはxdslで始まり、かつ数字を含むケース if ( /^Received:.*from.*\((dhcp|dialup|ppp|[achrsvx]?dsl)[^.]*[0-9].*\).*by www000.sakura.ne.jp /:h ) { to "maildir/.spam/" } # 冒頭(上記)におけるホワイトリスト判断の閉じかっこ }
こういった設定をしておき、定期的に「.spam」下のメールを確認、もし必要なメールが間違って引っ掛かっていたらホワイトリストに追加、というようなことを行うことになる。
[amazonjs asin=”B001JP6UJK” locale=”JP” title=”ホーメル スパム 20%レスソルト 340g”]
ピンバック: mailfilter | taquinos