botによるDOS攻撃、特定ファイルへの連続アクセスをipブロックにて遮断

access.log により moodle/calendar/set.php への不正規アクセスを確認 ユーザーエージェントは “MJ12bot”

ipsetを利用することで、IPアドレスの集合を簡単に管理することができる。
iptables を実行しなくて済むので早速入れた。

# yum install ipset 

セットの作成

接続拒否IPの集合”BLACKLIST”を作成

# ipset create BLACKLIST hash:net

プログラムフロー

moodle/calendar/set.php 先頭へ追記

[highlight_php]
$uaip = $_SERVER[‘REMOTE_ADDR’];//ipを取得
$ua = $_SERVER[‘HTTP_USER_AGENT’];// ユーザエージェントを取得
if( strpos($ua, ‘MJ12bot’) !== false ){
http_response_code( 301 ) ;
header( “Location: ../../abcdef/iptables.php?uaip=$uaip” ) ;
exit;
}
[/highlight_php]

../../abcdef/iptables.php 新規作成 (場所はどこでもいい)

[highlight_php]
<?php
$file=’/var/www/deny_ip’;
$getparam=htmlspecialchars($_GET[‘uaip’]);

file_put_contents($file,$getparam,FILE_APPEND | LOCK_EX);
?>

[/highlight_php]

/var/www/deny_ip には MJ12botがアクセスしてきたipアドレスが書き込まれていく

/root/iptables.sh シェルスクリプト作成

[highlight_php]
#!/bin/bash

# 拒否IPリストに記載されたIPからのアクセスを拒否する
if [ -s /var/www/deny_ip ]; then
for ip in `cat /var/www/deny_ip`
do
ipset add BLACKLIST $ip
done
fi
: > /var/www/deny_ip

[/highlight_php]

cron で5分おきに実行 vi /etc/crontab

[highlight_php]
*/5 * * * * root sh /root/iptables.sh
[/highlight_php]

cron log確認 tail -f /var/log/cron

ipset list BLACKLIST

[highlight_php]
Name: BLACKLIST
Type: hash:net
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 17008
References: 1
Members:
158.69.254.103 ←これが拒否IP
[/highlight_php]