計画は繊細に行動は大胆に!

Categories

Translate

Page view

2007/02/26

MovableTypeのSPAM対策


無駄にmt-tb.cgiなんかにアクセスしてくるホストが結構ある。
1週間あまりで100件を超えるホストは以下の通り、

$ip_as{'61.238.244.86'} = 100
$ip_as{'200.21.85.205'} = 103
$ip_as{'66.132.158.88'} = 103
$ip_as{'203.247.145.10'} = 104
$ip_as{'213.30.141.186'} = 110
$ip_as{'202.83.206.37'} = 115
$ip_as{'62.150.130.26'} = 116
$ip_as{'209.212.20.250'} = 119
$ip_as{'67.15.199.16'} = 122
$ip_as{'87.117.234.160'} = 124
$ip_as{'85.114.241.23'} = 128
$ip_as{'203.158.221.227'} = 130
$ip_as{'194.176.125.7'} = 131
$ip_as{'80.50.82.90'} = 132
$ip_as{'131.114.190.90'} = 132
$ip_as{'66.204.165.81'} = 134
$ip_as{'203.247.156.16'} = 136
$ip_as{'24.253.53.37'} = 141
$ip_as{'210.17.149.157'} = 143
$ip_as{'88.214.193.26'} = 144
$ip_as{'200.31.42.3'} = 147
$ip_as{'61.246.216.86'} = 147
$ip_as{'200.29.137.217'} = 151
$ip_as{'195.77.186.113'} = 158
$ip_as{'62.101.75.14'} = 162
$ip_as{'217.174.21.19'} = 167
$ip_as{'206.82.130.210'} = 171
$ip_as{'193.69.180.120'} = 176
$ip_as{'211.76.175.227'} = 177
$ip_as{'212.227.80.22'} = 182
$ip_as{'210.87.251.107'} = 183
$ip_as{'64.71.177.84'} = 184
$ip_as{'210.87.251.41'} = 201
$ip_as{'129.41.250.20'} = 204
$ip_as{'61.120.200.163'} = 207
$ip_as{'203.201.252.148'} = 208
$ip_as{'72.32.59.213'} = 230
$ip_as{'203.144.144.164'} = 239
$ip_as{'12.45.169.249'} = 240
$ip_as{'211.233.70.163'} = 240
$ip_as{'203.144.144.163'} = 247
$ip_as{'66.192.59.18'} = 288
$ip_as{'200.88.223.98'} = 345
$ip_as{'66.165.172.163'} = 356
$ip_as{'80.237.140.233'} = 398
$ip_as{'200.88.46.58'} = 465
$ip_as{'220.226.63.254'} = 585
$ip_as{'121.1.6.130'} = 683

一番多いホストで683アクセス orz。
これだけCGIを無駄に回されていると思うと、なんかむなしい。
とりあえず、アクセスログからmt-tbに100件以上アクセスすると.htaccessではじくように自動化してみる。
ただし、自宅サーバなどでCRONを回せる人限定かもしれないけども。

#!/usr/bin/perl

#apacheのアクセスログ指定
$access_log="/var/log/httpd/access_log"

#.htaccessを設置したい場所
$htaccess= "/var/www/mt/.htaccess"

#mt-tbにアクセスしてくる閾値
$limit=100;

open(FILE,$access_log) or die "$!"

my @all_log = ();

while(<FILE>){
@log = split(/\s/, $_);
if(/.+mt-tb.+ | .+mt-comment.+/){
#push ( @all_log , $log[0] );
$ip_as{$log[0]} = 0 unless defined $ip_as{$log[0]};
$ip_as{$log[0]}++;
}
}
close (FILE);

open(HTACCESS, "> $htaccess") or die "$!"

print HTACCESS "order allow,deny\n"
print HTACCESS "allow from all\n"

foreach $key ( sort {$ip_as{$a} <=> $ip_as{$b}} keys %ip_as) {
if( $ip_as{$key} > $limit ){
print HTACCESS "deny from $key\n"
}
}

これ動かすと自動的に以下のようなファイルを生成。

order allow,deny
allow from all
deny from 200.21.85.205
deny from 66.132.158.88
deny from 203.247.145.10
deny from 213.30.141.186
deny from 202.83.206.37
deny from 62.150.130.26
deny from 209.212.20.250
deny from 67.15.199.16
deny from 87.117.234.160
deny from 85.114.241.23
deny from 203.158.221.227
deny from 194.176.125.7
deny from 80.50.82.90
deny from 131.114.190.90
deny from 66.204.165.81
deny from 203.247.156.16
deny from 24.253.53.37
deny from 210.17.149.157
deny from 88.214.193.26
deny from 200.31.42.3
deny from 61.246.216.86
deny from 200.29.137.217
deny from 195.77.186.113
deny from 62.101.75.14
deny from 217.174.21.19
deny from 206.82.130.210
deny from 193.69.180.120
deny from 211.76.175.227
deny from 212.227.80.22
deny from 210.87.251.107
deny from 64.71.177.84
deny from 210.87.251.41
deny from 129.41.250.20
deny from 61.120.200.163
deny from 203.201.252.148
deny from 72.32.59.213
deny from 203.144.144.164
deny from 12.45.169.249
deny from 211.233.70.163
deny from 203.144.144.163
deny from 66.192.59.18
deny from 200.88.223.98
deny from 66.165.172.163
deny from 80.237.140.233
deny from 200.88.46.58
deny from 220.226.63.254
deny from 121.1.6.130

これで、記載されているIPアドレスからのアクセスを規制できる :D。
ただし、本当にTB100件打ってるのであれば問題だけども :P

あと、CRONに登録すると、以前のリストを上書きされます。
おさまったら、ブラックリスト解除ということで別にいいかと思いますが、累積にする方法もあるかと思います。

で、動かない人はhttpd.confを

<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>

とかして、試してみると上手くいくのかもしれない。
少し効能を見てみる。



0 comments:

コメントを投稿