EC2で運用しているWordpressに結構な頻度でスパムコメントの書き込みが発生していて、スパムコメントの対応が煩雑になってきました。また、スパムでサーバの負荷や帯域を使うのももったいない。
アクセス元を確認すると、特定の国からのアクセスがほとんどでした。
今まで、サーバ単体ではiptablesを使ったバッチ処理で国ごとIP制限をかけていましたが、AWSでは、FireWall関係は全てAWSコンソールの「Security Groups」で設定するというのがお作法なんですかね?
参考:
ということで、簡易ではありますが .htaccess を使ってアパッチで制御してみることにしました。
いろいろ国別 IPv4 アドレス割り当てリストなどが公開されていますが、APNICのリストを取得してスクリプトで加工することにします。
WordPress で元々設置される .htaccess にアクセス制限の処理を追記するようにします。
元の.htaccess
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
</IfModule>
これに、
order allow,deny
allow from all
を追加して、/usr/local/etc/htaccess_wordpress (ファイル名は任意)を作成します。
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
</IfModule>
order allow,deny
allow from all
このファイルに、ブロックする国のIPリストを追記するスクリプトを下記のように作成しました。(/usr/local/bin/block_country.sh)
#!/bin/sh -f
#----------------------------------------------------------#
# 指定した国からのアクセスを拒否する
# ※COUNTRYLISTにスペース区切りでアクセスを拒否したいCountry Codeを指定
# ※各国割当てIPアドレス情報はAPNIC(http://www.apnic.net/)より最新版を取得
COUNTRYLIST='XX XX'
LIST_DIR='/usr/local/etc/ip_list'
if [ $# != 2 ]; then echo "block_country.sh <document root> <original .htaccess>" exit
fi
DOCUMENT_ROOT=$1
HTACCESS_ORG=$2
cat $HTACCESS_ORG > $DOCUMENT_ROOT/.htaccess
cd $LIST_DIR
wget -q http://ftp.apnic.net/stats/apnic/delegated-apnic-latest
for country in $COUNTRYLIST
do for ip in `cat $LIST_DIR/delegated-apnic-latest | grep "apnic|$country|ipv4|"` do FILTER_ADDR=`echo $ip |cut -d "|" -f 4`
EMP_CIDR=`echo $ip |cut -d "|" -f 5`
FILTER_CIDR=32
while [ $TEMP_CIDR -ne 1 ];
do
TEMP_CIDR=$((TEMP_CIDR/2)) FILTER_CIDR=$((FILTER_CIDR-1)) done # .htaccess にアクセス拒否IPを設定 echo "deny from $FILTER_ADDR/$FILTER_CIDR" >> $DOCUMENT_ROOT/.htaccess done
done
# apache再起動
/etc/init.d/httpd restart
# IPリストの削除
rm -f $LIST_DIR/delegated-apnic-latest
第1引数にアクセス権限かけたいドキュメントルートを入力させ、第2引数に先程の.htaccess の元を入力させます。
これを /etc/crontab に週1位で実行するように設定します。
00 6 * * 1 root /usr/local/bin/block_country.sh /var/www/wordpress /usr/local/etc/htaccess_wordpress > /dev/null 2>&1