SOARISTO工房 Logo

【セキュリティ対策】特定の国からのアクセスを遮断する

2012/09/17

 <frame>による画面構成を修正し、アクセスログの集計パターンが変わったところ、捨て置きならない事態が判明しました。

 上記は、アクセスログの一部を集計したものですが、昨日の総アクセス10,228回のうち、中国からのアクセスが6,683回と、ほぼ7割近くを占めていることが分かりました。
(今朝も9:00の時点で、すでに2,500を超えています)

 これを、映画「マトリックス」のワンシーンに喩えると・・・、

matrix01.jpg
(画像は、ワーナー・ブラザーズ・エンターテインメントさんから拝借)

 巨大な多足動物(節足動物)のようなワームが、付け入る先を探して、あちこちからウジャウジャ押し寄せてきているようなイメージ。0xF9FC

 これまでは、「Movable Type」がスパム認定したコメント(またはトラックバック)のIPアドレスのみアクセス規制していましたが(記事1, 記事2, 記事3)、これを機に、より厳格な対処をすることにしました。

 IPアドレスから国名コードを割り出し、中国からのアクセスであった場合には、即座にアクセスを遮断します。

 ついでに、中国(CN)の他に、北朝鮮(KP)、韓国(KR)、香港(HK)、台湾(TW)、ロシア(RU)も規制対象としました。

 規制する対象は、アクセスのあったIPアドレスのみならず、そのIPアドレスが含まれるサブネット全体を、丸ごと規制します。

#なお、IPアドレスの抽出は、proxy経由のものにも対応しているため、どこかを踏み台にしてアクセスしてきても、大丈夫なようになっています。0xF9D1

 上記は、PHPスクリプト(の一部)です。

 関数GetCountryCode()にて、IPアドレスから国名コードを得ています。

 以前の記事では、IPアドレスから国名コードを得る関数として、内部でwhoisコマンドを実行し、その出力から国名コードを得るものを使っていましたが、実行速度を測ってみると、約800msも掛かっていることが分かりました。

 「Movable Type」が認定したスパムテーブルを元に、1日に1回、規制リストを更新する分には、この程度の速度でも構わないのですが、今回のように、即座に規制を掛けるためには、関数自体を高速化する必要があります。

 ネット上をいろいろ探したところ、GeoIPというPHPライブラリの中に、geoip_country_code_by_addr()という関数があったため、このライブラリを組み込んで使うことにしました。

 whoisのように、常に最新のデータベースに聞きにいく訳ではなく、規定の(ローカルな)データベースをルックアップするだけなのですが、実行速度が約200μs前後(実測参考値)と高速で、これならアクセスが頻発しても十分に使えそうです。

 GetCountryCode()にて国名コードを得て、これが中国・香港・台湾、北朝鮮・韓国、ロシアであった場合には、スパムテーブルと.htaccessとを、即座に更新します。

 ワームが入ろうとした瞬間、シェルターの防護壁が、一瞬にして(しかも次々と)閉じられていくようなイメージ。0xF9C5

0xF8D8(ガシャン、ガシャン、ガシャ~ン!!)

Trackback(0)

Trackback URL: http://www.soaristo.jpn.org/mt/mt-tb.cgi/852

Post Comment