最近、ブログのアクセス数が妙に多い。
何かヘンということで、ログをみると
*.dynamic.163data.com.cn
というサイトからいっぱい。

トラックバックに妙な内容を登録していくホストで、トラックバックについては、
まともな登録ないので、今年あたりから受付を停止してました。

さて、*.dynamic.163data.com.cn ですが、ググってみますと、有名な
SPAM業者の出所らしいです。
トラックバックに意味不明の書き込みをするだけなので、現状、大きな被害は
ないのですが、スクリプトで走らせてるらしく、受付を停止してもPOSTを
続けてきます。

ただ、カウンタやログがわかりづらくなりますし、放っておくと場合によっては
猛烈なトラフィックになることもあるようです。
ので、対処してみました。

自分用の覚書と参考になる人がいるかもなので、記録残しておきます。

うちの環境はApache2.2系です。
とりあえず、.htaccessにホスト名でアクセス制限入れてみます。
 Order allow,deny
 Allow from all
 Deny from .dynamic.163data.com.cn

その後、ログをみると

60.100.85.110.broad.pt.fj.dynamic.163data.com.cn - - [25/Jan/2014:08:16:27 +0900] "GET /diary2/ HTTP/1.1" 200 88316 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

しっかりコード200(成功)で、レンポンスを普通に返してしまってます・・・

少し調べてみた結果、Apacheではこのホスト名のチェックには
DNS の 2重逆引きを行なっていることがわかりました。

DNS 1回目 IPアドレス -> ホスト名
DNS 2回目 ホスト名 -> IPアドレス

を行い、IPアドレスが元とDNSから引いたもので一致していれば、そのホスト名を
正しいとして採用するということです。

で、実際にアクセスしてくるIP(毎回変わるのですが、一例として110.85.100.60)に nslookup などで確認してみると
110.85.100.60  => 60.100.85.110.broad.pt.fj.dynamic.163data.com.cn
60.100.85.110.broad.pt.fj.dynamic.163data.com.cn => ** server can't find ~

確かに、逆引きは成功するが、正引きには失敗します。
なので、Apacheが逆引きで得られるホスト名は信じられないと判断してるようです。

確かに、Allowディレクティブで特定のホストのみにアクセス許可させる場合には、
この判定はよさそうですが、
逆に、Denyディレクティブでダメなホストのみをはじく場合においては、
せっかく相手がヒントを与えてくれるのに、ブロックできないということに
なります。
ちなみにうちのサーバーは Apache2.2系なので、他のバージョンでは挙動が
違うかも。

さて、DNSの2重逆引きを、単なる1回の逆引きにさせる設定はないのか?
ちょっと調べた限りでは見つからず。
ネットを少し探して見つからない場合はソースコードを読む方が
結果的には早いことが多いです。

Denyディレクティブは、mod_authz_host モジュールで実装されてます。
あとはソースツリーからそれらしいファイルをgrepします。
 httpd-2.2.?/modules/aaa/mod_authz_host.c

find_allowdeny()内に、ホスト名を引く部分がありました。

 remotehost = ap_get_remote_host(r->connection,
    r->per_dir_config,
    REMOTE_DOUBLE_REV,
    &remotehost_is_ip);

REMOTE_DOUBLE_REVが、挙動を決めるパラメータらしい。
この定数はインクルードされてる http_core.h に説明がありました。
結論から言えば、

REMOTE_DOUBLE_REV -> REMOTE_HOST

に変更すれば、OK。
これで、実際にコンパイルして稼動してみたら、ちゃんと
.dynamic.163data.com.cn
でブロックするようになりました。

60.100.85.110.broad.pt.fj.dynamic.163data.com.cn - - [25/Jan/2014:13:11:04 +0900] "GET /diary2/ HTTP/1.1" 403 209 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727 ; .NET CLR 4.0.30319)"


ちなみに、ソースコードを見る限り、設定ファイルで1回のみの逆引き動作を
指定するような方法はなさそうです。

このソース変更には注意が必要です。
少なくとも、Allowディレクティブを名前で指定してるサイトでは
セキュテリィとしては甘くなってしまうので注意です。
よい副作用としては、DNSの正引き1回分を減らすことができるので、
速度的には有利。
そもそも、逆引きを使う設定は、Apacheのチューニングでは真っ先に停止
すべき項目ですけどね。

あと一つ対策。
エラーコードを403で返すと、コンテンツはあるけど、ブロックしてますよと
相手に教えることになるので、このエラーコードは404(Not Found)に
変更しておいた方がいいでしょう。
相手がどういうスクリプトを組んでるのかわからないのですが、もしかしたら
403(Forbidden) なら別IPからチャレンジするなどのアルゴリズムにしてる
かもしれません。
403 -> 404 の方法はググればすぐに見つかるので、省略。

さて、少し考察。
そもそも、dynamic.163data.com.cn は、なぜ、逆引きには応答するが正引きには
応答しないような設定にしてるのか?
逆引きできないホストをアクセス禁止にしてるサイトに対して、逆引きは提供。
Apacheなどの.htaccessの逃れるために、正引きはNG?
いや、単に不要だから設定してないだけ?
実はこのIPの所有者は、163data.com.cnではない?(whoisしたが判断できない)
正直ちょっと考えた程度ではわかんない。

あと、この163data.com.cnと思われるアクセスは、逆引きできないIPからも来ます。
完全に防ぐことが目的ではないので、まぁ、この辺が落としどころかな。
あまりに増えてきたら、一時的に、.cnからのアクセスをIPベースで制限して、
相手があきらめるのを待とうかな~と。

はぁ。
まったく、こんなのお互い、lose-loseでしかないだろうに。
そもそもなんでこんなことを?
セキュリティホールを探してる様な動作には見えないけど?
うちのサイト一つに限ってはlose-loseでも、ワールドワイドでみればこの手の
スクリプトで何らかの利益があるのだろうか。 

コメント

  • コメントはまだありません。

コメント登録

  • コメントを入力してください。
登録フォーム
名前
メール
URL
コメント
閲覧制限
投稿キー
(スパム対策に、投稿キー を半角で入力してください。)