Web クローラ収集メイルアドレスを追ってみた

Where spams come from? by SHIBATA Akira
作成 2008/11/12

はじめに

spam がいっぱいくるようになって久しいが、以前よりよく言われる「クローラで収集している」というが本当なのだろうか? そんな疑問が頭をもたげた。

そこで、そういったクローラで収集されたアドレスにクロールした日時にわかるようにしようと考えたのが今回の仕組みだ。 …実は以前から、自分が勤務している会社のサーバなどで動かしていたが、こういう方法を解説しているサイトを見かけないので、参考になろうかとノウハウを書いてみた。


プラン

基本的にはクローラ向けと考えるので、そいつらにだけリンクがわかって、人間さまにはわかる必要はないと思う。 が、そんなリンクの作り方はしらないのでドット「 . 」でもリンクとしてアンカーをつけよう。

また、アクセスしてきたときの時刻と IP アドレスを元に拡張アドレスを自動生成し、生成されたアドレスを mailto のアンカー表示するようにする。 生成するアドレスはPostfixqmailでおなじみの拡張アドレスだ。 なお、変更できると思うが、メイルアドレスの基本部分と拡張部分のデリミタ(区切り記号)は、 Postfix の場合はプラス「 + 」で、 qmail の場合はハイフン「 - 」であるので混乱しないように注意しよう。

  1. 隠しペイジまたは人には発見しにくいペイジを用意する
  2. アドレスをアクセス時刻とアクセス元を元に自動生成する
  3. 一応警告を書いておく

実現方法

mailto: に時刻等をつけるには動的ペイジを使う。

方法は SSICGI で作成する。 なお、 SSI だけでも実現できそうだが、筆者の環境ではうまくいかなかったので併用という方式をとった。 SSI だけできるようになったので実行(といっても SSI でシェルスクリプトを起動しているだけだが)するようにした。

今回モデルケースとして書いた筆者がメイルを受け取る環境は Gmail であるので、 Postfix と同じタイプのデリミタのプラス「 + 」が使われる。 もし qmail をお使いの方は基本部分と拡張部分のデリミタ(区切り記号)にハイフン「 - 」を使おう。

メイルアドレスのフォーマットはこんな感じだ。 help+spamtrap-19991030184617-192.168.49.31@example.jp の help+ の部分で help@example.jp 宛てのメイルとして飛んでくるようになる。 このプラス記号「 + 」が拡張アドレスとのデリミタだ。 後ろの spamtrap は振り分けをするときに便利なようにキーワードとして挿入。 その次の 14 桁は 1999 年 10 月 30 日 18 時 46 分 17 秒にアクセスがあって自動生成されたことがわかる。 その後ろの 192.168.49.31 はアクセス元の IP アドレスだ。 @ 以降について本当は gmail.com だが、このペイジをクロールされてそこにメイルを大量にぶち込まれても困るので example.jp とした。

余談になるが、 example.jp は例示用のドメイン名で正式に予約されている。 どういうことかというと、例示に適当なドメイン名を書くとそれが使われている可能性があって、迷惑をかける可能性がある。 そこで、 co.jp や com などで example を登録して、例示用としているわけだ。 だから検索してみるとあちこちで使われていることがわかるだろう。


実装:雛型

ペイジの雛型は下のような感じだ。

対クローラのミソは mailto のアンカーでくくっておきながら「送ってくるなよ」と書くわけだ。

動的にアドレスを生成しているところは <!--#exec cmd="./cgi-bin/trapevidence.sh" --> のところでシェルスクリプトだ。(後述)

<HTML>
<HEAD>
  <TITLE> SSI : evidences for spammers </TITLE>
  <META NAME="author" LANG="en" CONTENT="SHIBATA Akira">
  <META NAME="copyright" CONTENT="(C) 1990-2008 SHIBATA Akira">
  <META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
  <LINK REL="stylesheet" TYPE="text/css" HREF="./css/general.css">
</HEAD>
<BODY>

<H1> For spammers </H1>

<A HREF="mailto:help+spamtrap-<!--#exec cmd="./cgi-bin/trapevidence.sh" -->@example.jp">
Do not send any mail.  If somebody does, it must be a spam.</A><BR>

<HR>
Last modified : <!--#flastmod file="trap.shtml"--> 
</BODY>
</HTML>

追加の文言

さらにいろいろ文言を下のように書いたりしているが、各自の好みでつけるといいだろう。 英語がなんかミョーちきりんなのは、勘弁してくれ、というかどういう風にするといいか教えてオクレ。

このペイジ中にある電子メイルアドレスは、電子メイルアドレス収集プログラム対策のために自動生成しております。したがってこのペイジのアドレス宛てに電子メイルを送った場合、 spam とみなし追跡を行うことがあります。この追跡について、当方から確認のための調査作業を行うときに攻撃と判定するモノもあるかもしれませんが、悪意あるものではございませんのでご了承のほどよろしくお願いいたします。ただし、当方から追跡を開始することはなく、いただいたメイルの情報を元に行いますのでこのペイジ中に存在するメイルアドレスに電子メイルをお送りいただいた時点で調査にご協力することに同意いただいたものといたします。また、このアドレス宛てにお送りくださった電子メイルはすべて公開することもありますのでこちらについてもご了承お願いいたします。
The E-mail address in this page is automaticaly made for E-mail address crawler. So if you send to E-mail in this page, we recognize as a spam to it, and maybe pursue you. This pursuit makes you feel "DoS or something like it", but we do not have any malice, please give us your cooperation. And we do not start pursueing first, when we get an E-mail to the address, we start pursueing by information on the E-mail. When you send to the address, we recognize that you agreed the pursuit. The E-mail might be opened to the public.

trapevidence.sh について

trapevidence.sh は日付・時刻とアクセス元 IP アドレスを表示するだけだ。 ハッキリいってチョロいぞ。 解説は下の通りだ。

#!/bin/sh
echo -n $(/bin/date +%Y%m%d%H%M%S)-$(/usr/bin/env | /usr/bin/grep REMOTE_ADDR= | /usr/bin/cut -f 2 -d = )

date のオプション +%Y%m%d%H%M%S は %Y が西暦年、 %m が月というようにたとえば 20081102225414 というような表示になるわけだ。 このオプションは man date とすると読むことができる。

次はハイフン「 - 」でつなぐ。 そして、ブラウザがアクセスしている環境を表示するのが env だ。 その中から grep で REMOTE_ADDR の行を探して、 cut でイコール「 = 」の右側を切り出すわけだ。

この echo の文をそのまま実行すると、期待している「 help+spamtrap-19991030184617-192.168.49.31@example.jp 」になるべき「 19991030184617-192.168.49.31 」が表示されるはずだ。 まぁ環境によっては date や env 、 grep 、 cut のパス(ありか)が違うかもしれないので、その辺は適宜調整してくれ。 なお、筆者の手元の実験環境の Debian GNU/Linux Etch では grep は /bin/grep にしかなかったのだが、本番の実行環境は /usr/bin/grep だった。 そこで、シンボリックリンクを張って /usr/bin/grep で使えるようにした。 やり方は root の特権をつかってやるので、「 sudo /bin/ln -s /bin/grep /usr/bin/grep 」というようにして /bin/grep に /usr/bin/grep からシンボリックリンクを張った。

今回書いたシェルスクリプトは一行なので、 SSI のコマンドの中に埋め込みたかったが、本番環境では動かせなかったのでシェルスクリプトで文字列を自動生成するようにした。


制作環境と本番環境

今回は本番環境と制作環境の違いでいろいろ苦労した。 その辺について書いてみると下のような違いがあった。

項目本番環境(公開サーバ)制作環境(手元サーバ)困ったこと
OSFreeBSD 6.1-RELEASE-p23Debian GNU/Linux Etch特にナシ
SHELL/bin/csh/bin/bashSSI での一行スクリプトの書き方がわからなかった
suEXECサブディレクトリ可サブディレクトリ不可多くの人が悩んでいるようだがなぜか出来ない
grep の path/usr/bin/grep/bin/grepスクリプト中のコマンドが動かなかった
SSI 拡張子shtml のみ一応何でも OKすべてのペイジで SSI を使う野望は崩れた

suEXEC の問題は解決できなかったので、スクリプトをサブディレクトリと、呼び出すファイルと同じディレクトリと二箇所に置いて解決した。 grep の問題と同じようにシンボリックリンクを張ればよかったかな?まぁ動いているので触らないことにしよう。

grep の path は本番で動くのを確認するのが制作環境だからしてシンボリックリンクで済ました。


結びに

あとは時々気が向いたら到着した spam の To: のアドレスで spamtrap の文字列のあるメイルを探してみよう。 下のようなことがわかるんじゃないかなーと思うが、実は面倒で細かいこと見てない。 ま、なんか面白い使い道を思いついたら是非教えてオクレ。

…と、ここまで書いて気づいたが、今は Gmail を使っているので、 spam が手元まで届かないよ。 だから、ヘッダとかも見られないし、どこから来たのかも確認できない。 ダメじゃん>オレ _| ̄|○


おまけ:解析

三分クッキングではないが、ここで以前のデータを取り出してみる。 最初に「以前実験していた」と書いたが、そのときから収集したデータをちょっと解析してみよう。

クロール日はいつごろ?

到着した spam についてクロールした日はいつなのかと見てみた。 下の表の通り、毎日クロールしに来ているわけではない。 865 日公開してたわけだが、クロールに来たのは 39 日しかなかったわけだ。 想像より少ないような気がするが、コレを読んだみなさんはどう感じるかな?

クロール日到着通数
20040309 10
20040317 1
20040421 18
20040424 12
20040425 8
20040523 17
20040528 15
20040603 17
20040609 1
20040617 11
20040627 9,093
20040629 1
20040930 8
20041018 1
20041024 1
20041106 5
20041121 1
20041122 8,951
20050302 1
20050420 1
20050512 14,379
20050529 1
20050806 875
20050924 1
20051026 13,643
20051229 8,916
20060312 3,165
20060401 1
20060508 10,998
20060525 10,512
20060529 15,882
20060602 14,304
20060609 11,399
20060620 24,200
20060701 8,934
20060710 20,268
20060720 11,046
20060722 11,786
20060726 1

クロール時刻はいつ頃?

何時にクロールしに来たメイルが spam として多いのかな?と見てみた。 ばらつきがすごく大きいが理由がぜんぜんわからない。 何か見えたら当方まで教えてくれ。

クロール時到着通数
0 8,951
1 22,299
2 18
3 21,388
4 0
5 24
6 17
7 9,094
8 3,059
9 21,159
10 3,166
11 8,942
12 2,814
13 5,969
14 0
15 11,009
16 0
17 5
18 8,590
19 34,990
20 1
21 13
22 25,929
23 11,046

spam 到着時刻

spam は何時到着するのだろう?と思って調べたら、これまた見事にほぼ同じくらい。 つまりは、押しなべてみればいつでも spam は届くわけで少ない時間帯はないということだ。 妥当性はともかく、spamcop によれば、一応変動しているっぽいが…筆者のところは変動があまりないので特殊なケースかもしれない。

到着時到着通数
0 8,210
1 8,234
2 8,444
3 8,039
4 8,149
5 8,307
6 8,145
7 8,171
8 8,485
9 8,539
10 8,093
11 8,368
12 7,897
13 8,092
14 8,236
15 8,201
16 8,039
17 8,328
18 8,105
19 8,697
20 8,799
21 8,394
22 8,185
23 8,327

人気度

日付別 spam 到着数を調べてみた。 人気がでてくるといっぱい spam が来るようになるわけで、今回のペイジを閉鎖してから人気急上昇って感じ。 グラフの赤いラインが閉鎖日のころだ。 しっかりアドレスは使いまわされていることが良くわかる。

日付別 spam 到着数

使いまわし頻度

人気度の項目で使いまわされていることがわかったので、いつごろのクロールしたものが使いまわされているのだろう? また使いまわしのばらつきはどうだろう?と見てみた。 するとクローラ取得アドレスへの上位 20 傑でほぼ全部になる。 これら上位 20 傑を捨てればクローラ系 spam はほとんどこないことになる。 こりゃ、意外な発見だわい。

順位クロール日時分秒到着通数全体に占める割合上位累計
1 20060620031344 21,280 11% 11%
2 20050512195257 14,378 7% 18%
3 20060602095216 14,302 7% 25%
4 20051026221054 13,642 7% 32%
5 20060722011726 11,785 6% 38%
6 20060710193658 11,678 6% 44%
7 20060609223341 11,398 6% 50%
8 20060720235816 11,044 6% 55%
9 20060508151316 10,995 6% 61%
10 20060525011250 10,512 5% 66%
11 20040627073849 9,090 5% 71%
12 20041122004814 8,950 5% 75%
13 20060701193224 8,933 5% 80%
14 20051229113548 8,913 4% 84%
15 20060710182345 8,588 4% 88%
16 20060529092517 6,855 3% 92%
17 20060529134718 5,968 3% 95%
18 20060312100714 3,165 2% 96%
19 20060529083058 3,059 2% 98%
20 20060620122203 2,814 1% 99%
21 20050806221516 875 0% 100%
22 20060620031344 92 0% 100%
23 20040421025146 18 0% 100%
24 20040603112332 17 0% 100%
25 20040523065702 17 0% 100%
26 20040528055509 15 0% 100%
27 20040424223009 12 0% 100%
28 20040617213850 11 0% 100%
29 20040309155544 10 0% 100%
30 20040930053936 8 0% 100%

結果と考察

クローラの来訪はそれほど頻繁でないことがわかる。 しかし、取得していったアドレスはしっかりつかいまわしていることが良くわかる。 やっぱり、 spam をもらいたくないなら web にメイルアドレスをそのまま載せるのはやめたほうがよいだろう。


Memorandum about Linux and Network | ほかのジャンルを見てみる | サイトマップ

免責

beacon

当方(SHIBATA Akira)は, 本サイトをご利用の際に起きるかもしれない不利益に対し, 一切責任を負いません.