manekineko倉金家ホームページ

趣味の部屋/ホームページ余話

迷惑なアクセス

2011年11月1日(火) 2012年11月14日(火) 更新 2014年3月17日 更新
 ホームページのアクセスログを見ていますと、毎日同じようなところから幾度も気になるアクセスがあります。主にmsn.com, amazonaws.com, as13448.com といったところからですが、何か情報収集アクセスのようです。しつこく挙動も不審で迷惑なのでちょこっと対策を講じることにしました。


 以前より時折ホームページのアクセスログを見ていて不審なアクセスが目についていました。
私は自前のアクセスログに通例に従いIPアドレスとユーザエージェントごとにログを記録していますが、これらのアクセスは以下のような特徴があり、特に1と2により貴重な?ログリソースを多く浪費しています。

1.多数のIPアドレスを使って一日幾度もアクセスしてくる。
2.ユーザエージェント(ブラウザ名)が頻繁に変わり、一見通常のブラウザ名だが偽装している疑いもある。
3.Apacheの生ログを確認しても通常のブラウザのアクセスとは異なり人間が見ているようなアクセスには思われない。
4.かといってrobots.txtも読んではいない。
時には1日のログの半分以上がこれらのアクセスで埋まっていたりします。
ひとつのIPで同じユーザエージェントならアクセス回数の表示が増えるだけなので気にはならないのですが...。
 代表的なものとしてmsn.com, amazonaws.com, as13448.comといったところからのアクセスが目につきます。

 どういう種類のアクセスなのだろうかと思いいろいろ検索して調べてみても、単にログをさらしているだけのサイトばかり目について、その実態がつかめません。
何も公開せず秘密裏に何かを行っているようで、ますますあやしい!。

 特におかしいのが search.msn.com からのアクセスで、
・まったく普通のMSIEを名乗っている。bingbotやmsnbotというのがあるのにだ。
・いちおうjavascriptも解するようだし、一時cookieも有効になっている(継続cookieは有効になっていない)。
・ただしナビゲーションページを見た形跡もないのに常にいきなり記事idを要求してきてページのソースだけは取っているが、背景画像やアイコンなどにはアクセスしてくることはない。
 明らかに人間が操作しているブラウザとはちがう。
・もちろんrobots.txtにはアクセスしてこない。
・ついでに言わせてもらえば、こんな個人が遊びでやっている弱小ホームページサーバーに多いと日に数百回もアクセスしてくる。いくら何でも頻繁すぎないか?msnの悪口なんか(ほんの少ししか)言ってないぞ。
 いくらなんでも通常ブラウザの名を名乗ったから、あるいはその挙動が通常ブラウザと同等だからといって、明らかに情報収集のロボットアクセスなのにrobots.txtも見ずに何をやってもいいというもんでもなかろう!
まして天下のMicrosoftがやっていいことなのだろうか!
別に大きな実害があるわけでもないので放っておいてもいいのだが、気がついてしまうと何かしてあげなくてはいけないと思うたちで…

 で、少なくともrobots.txtで制御できないアクセスに関しては対策を講じることとしよう。どういうやりかたがいいかな。
一思十考とまではいかなくても一思三考くらいはせずばなるまい。
(1)ファイヤウォール(iptables)で蹴る。
(2).htaccessで蹴る。
(3)その他アクセスチェックプログラムで蹴る。
とまあ、これくらいはすぐ思いつくのだが、どれも大人気ないし能がないなあ。

 ここでちょっと思い出したが、以前 naver.jp の Yetiクローラが頻繁にアクセスしてきたとき、naver.jpに少し文句を言って問い合わせたら非常に丁重な返答を頂き親切にrobots.txtの設定の仕方など教えてくれた。その後は全く問題はない。
で今回もまずはできればそれをやってみよう。ただas13448.comは問い合わせ先すらわからないし、日本語以外でとなると全く無理。
msnは何とかなるかもしれないと思い、問い合わせしようとしたが、な、なんと、ユーザ登録してユーザログインしないと問い合わせさえ受け付けてくれないようだ。

ならばこちらもログインを要求してもいいだろう。
ただしGUESTという形で人間ならば簡単にログインできるようにしておく。


(4)GUEST LOGINを要求する。
badaccess.phpとでもいうファイルを作って以下を書く。
<?php
function is_bad_access()
{
// 多数のIPでアクセスしてくる通常のブラウザを装う情報収集アクセスは拒否。
// httpd.confのHostnameLookupsをOnにしてないと動作しません。
$host = isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : '';
$agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';

// ちゃんと検索ロボットだと名乗ったのは許す。
if(preg_match('%bot|crawl|search|spider|survey%i', $agent)){ return(FALSE); }
// それ以外以下からのアクセスは該当。
if(preg_match('%msnbot[-0-9]+\.search\.msn\.com%', $host)){ return(TRUE); }
if(preg_match('%\.amazonaws\.com%', $host)){ return(TRUE); }
if(preg_match('%static[-0-9]+\.as13448\.com%', $host)){ return(TRUE); }

return(FALSE);
}

function www_guest_login() // 実はBad Access 拒否用。
{
$GUEST_ID = 'guest';
$GUEST_PW = 'guest';

$login_id = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : '';
$login_pw = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : '';
if($login_id == $GUEST_ID && $login_pw == $GUEST_PW)
{
return(TRUE); // Login OK
}

// ログイン要求。ただしユーザ名とパスワードを明示しておく。
header('WWW-Authenticate: Basic realm="Guest login is USER='.$GUEST_ID.', PASSWORD='.$GUEST_PW.'"');
header('HTTP/1.0 401 Unauthorized');
header('Content-type: text/html; charset=UTF-8');
echo('Guest login is USER="'.$GUEST_ID.'", PASSWORD="'.$GUEST_PW.'"');
exit;
}

// BAD ACESS対処
if(is_bad_access())
{
if(!www_guest_login()) // ログインを要求してみる。guest:guestでログイン可能。
{
exit;
}
}

?>
そして各ページの頭でこれをincludeすればいい。
ページはphpプログラムで生成しており、すべてアクセスのチェックとログのプログラムをincludeしているので、実際にはそこに設定すればいいだけ。
しばらく様子を見てたらいい感じ。やっぱりGuest Loginなどしてこない。弾くの正解。

 ...とここまで書いていたら、ふともっといいのを思いついてしまった。

それは、
(5)有無を言わさずこのページに飛ばす!

早速やってみよう。最後のところを、
......

// BAD ACESS対処
if(is_bad_access())
{
// 一時的なredirectにとどめるなら応答コードを302にしておく。
header('Location: http://kuragane.jp/troublesome.html', true, 301);
exit;
}

などとすればいい。

注意すべきは、このページそのものに飛ばすとここにもリダイレクトが仕掛けられているので堂々めぐりになるから、いったんソースを落としてアクセスチェックを取り除いたページとっても迷惑なアクセスと題したのを作って置いておき、そこに飛ばす。

 でも、ページが日本語だから泥棒猫に説教するようなもんで効果あるかな? 猫語...じゃなかった英語わからんし。
ま、いいか。

要は、言いたいこと:
 1.不要にいろんなIP, Agent名でアクセスするな。
 2.検索アクセスならagentでちゃんと名乗れ。通常ブラウザをかたるな。
 3.robots.txtを読んでちゃんと守れ。
 4.容易に確認なり問い合わせなりできるようにしておけ。
これだけ。

効果確認:GOOD!! (2011.11.4 追記)
 その後時折様子を見ていましたが、これらの迷惑アクセスはだんだん減って数日もするとほとんどアクセスログからは消えてしまい、たまにぽつぽつ来る程度になりました。
 ...で、念のためApacheの生ログを確認してみますと、これらの迷惑アクセスはいきなりtroublesome.htmlのリダイレクトページに行くようになり、必死に幾度もそれを見ています。
来るなと言って拒否してもどうせまた来るんだからこのやりかた正解!
ついにおじさんの知恵がロボットに勝ったのでした。
その後さらにプログラムは改良し、アクセスによって"Goodbye", "Redirect", "Login" などが個々に設定できるようになっています。めでたし、めでたし。

 しばらくこれでいってみよう。

(2012.10.16 追記)
 その後これらの迷惑アクセスはずいぶん減って今はmsn.comからぽつぽつ来る程度になっています。

 これらが減ってその後目につきだしたのがトレンドマイクロからのアクセスで、.sjdc、.iad1などというホスト名、あるいはホスト名情報なしでやってきます。大儀名分は利用者にあやしいサイトを警告するための調査ということらしいですが、これもはっきり言ってうっとうしい。

 そもそも.sjdcだの.iad1だのというドメインは存在しない虚偽のドメイン名だし、いくら身元を隠すためとはいえ、ちゃんとした会社のやることではないように思う。悪く言えば「なりすまし」ということだ。
 他のセキュリティーソフトでこんなことをやっているのはなさそうだし、本当に必要なことなのかとはなはだ疑問。それとも調査に名を借りて何か別にほしい情報でも集めているのだろうか。

 それに、本来ブラウザ内で処理されるべき内部パラメータを持ってアクセスしてくるので、トレンドマイクロのセキュリティーソフトの類は使っている人の情報をかなりトレンドマイクロに送っているのではないかと思われます。動作としてはほとんどスパイウェアに近いな。
私だったらいくら安くても(たとえ無料でも)こんな会社のソフトは絶対に使わない。
 拒絶すると利用者の側にあやしいサイトだと警告が出るという話もあり、こまったもんだ。
そのうち何か考えなくてはなるまい。

(2013.4.3 追記)
 これらトレンドマイクロなどからの迷惑なアクセスも拒否することにしました。
→トレンドマイクロなどの迷惑アクセスを蹴る!
特に何の問題もなく、アクセスログがたいへんきれいになって清々しています。

(2014.2.27 追記)
 迷惑なアクセスを上記のページに飛ばすようにしてからはそれもだんだん減ってしばらく落ち着いていましたのでログをとるのを再開していました。でもここのところまた別のアクセスが増えてきました。
360SpiderというAgent名で、hn.kd.ny.adsl(IPアドレス 182.118.20.xxx~182.118.25.xxxあたり、ホスト名はIPによらずみな同じ)やChina Telecom(IPアドレス 101.226.166.xxx~101.226.169.xxxあたり、ホスト名は設定されていない)などから実に多数のIPを使ってのアクセスがあります。一日に数十個ものIPアドレスからアクセスしてくるのはざらで、うっとうしいことこの上ありません。
←ちなみにこのサーバー上の別のサイトふいちゃんの中国日記への360Spiderのこの一週間のアクセスログです。
 内容が中国ものだけに中国の検索ロボットの来訪が多いのはわかりますが、検索ロボットを除けば一日せいぜい数十人程度の人が見にくるサイトでこんなアクセスをされてはたまりません。現在はIPアドレスをまとめるようにしましたのでこれで済んでいますが、IPアドレスごとにログをとっていたときは悲惨な状況で、普通のアクセスが360Spiderのアクセスに埋まってしまっていました。
 結局いつになってもこのようなアクセスはなくならないようで、やっぱり黙って拒否するより何か言ってやらねばと思い、迷惑アクセス専用のページ迷惑アクセスお断りを作ってそれを表示してやることにしました。がんばって英語もかきました。意味が通じるかどうか自信はないけど。
それにしてもきりがないなあ。放っておいてもいいんだけどそれでは世の中よくならないから、少しでも何かしなくてはいけないと思ったのでした。

(2014.3.17 またまた追記)
 上記迷惑アクセスお断りのページは最初私のとてもつたない英文だったのですが、ありがたいことにある方がちゃんとした英文に直して送ってくださいました。これ幸いとさっそく使わせていただきました。
悠さま、ありがとうございました。