spam がいっぱいくるようになって久しいが、以前よりよく言われる「クローラで収集している」というが本当なのだろうか? そんな疑問が頭をもたげた。
そこで、そういったクローラで収集されたアドレスにクロールした日時にわかるようにしようと考えたのが今回の仕組みだ。 …実は以前から、自分が勤務している会社のサーバなどで動かしていたが、こういう方法を解説しているサイトを見かけないので、参考になろうかとノウハウを書いてみた。
基本的にはクローラ向けと考えるので、そいつらにだけリンクがわかって、人間さまにはわかる必要はないと思う。 が、そんなリンクの作り方はしらないのでドット「 . 」でもリンクとしてアンカーをつけよう。
また、アクセスしてきたときの時刻と IP アドレスを元に拡張アドレスを自動生成し、生成されたアドレスを mailto のアンカー表示するようにする。 生成するアドレスはPostfixやqmailでおなじみの拡張アドレスだ。 なお、変更できると思うが、メイルアドレスの基本部分と拡張部分のデリミタ(区切り記号)は、 Postfix の場合はプラス「 + 」で、 qmail の場合はハイフン「 - 」であるので混乱しないように注意しよう。
mailto: に時刻等をつけるには動的ペイジを使う。
方法は SSI と CGI で作成する。
なお、 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 は日付・時刻とアクセス元 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 のコマンドの中に埋め込みたかったが、本番環境では動かせなかったのでシェルスクリプトで文字列を自動生成するようにした。
今回は本番環境と制作環境の違いでいろいろ苦労した。 その辺について書いてみると下のような違いがあった。
項目 | 本番環境(公開サーバ) | 制作環境(手元サーバ) | 困ったこと |
---|---|---|---|
OS | FreeBSD 6.1-RELEASE-p23 | Debian GNU/Linux Etch | 特にナシ |
SHELL | /bin/csh | /bin/bash | SSI での一行スクリプトの書き方がわからなかった |
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 は届くわけで少ない時間帯はないということだ。 妥当性はともかく、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 が来るようになるわけで、今回のペイジを閉鎖してから人気急上昇って感じ。 グラフの赤いラインが閉鎖日のころだ。 しっかりアドレスは使いまわされていることが良くわかる。
人気度の項目で使いまわされていることがわかったので、いつごろのクロールしたものが使いまわされているのだろう? また使いまわしのばらつきはどうだろう?と見てみた。 するとクローラ取得アドレスへの上位 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 にメイルアドレスをそのまま載せるのはやめたほうがよいだろう。
当方(SHIBATA Akira)は, 本サイトをご利用の際に起きるかもしれない不利益に対し, 一切責任を負いません.