不正アクセスをブロックする対策がうまくいったようなのでここに記載しておこう。
簡単に言うと、不正アクセスを検知したらそのIPアドレスからのアクセスを拒否してしまうのだ。今回はwebからのアタックだけの対策であるが、ポートスキャンや不正ログインチャレンジへも応用できるので、後々取り組んでいこうと思う。
VineLinux2.6を例にとって進めよう。
まずはapacheの設定ファイルを変更して、webに不正なアクセスがあったらブロックするcgiに制御を飛ばすよう設定する。
vi /etc/httpd/conf/httpd.conf
ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/
#
# "/home/httpd/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
途中に上記のような記述があるので、この下のあたりに以下を追記する。
#
#不正アクセスがあった場合、不正アクセスブロックcgへi
#
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
#
#不正アクセスのalias
#/var/log/httpd/access.log等を参考に必要に応じて追記する
#
Alias /c/winnt "/var/wwwblock/block.cgi"
Alias /_vti_bin "/var/wwwblock/block.cgi"
Alias /msadc "/var/wwwblock/block.cgi"
Alias /MSADC "/var/wwwblock/block.cgi"
Alias /_mem_bin "/var/wwwblock/block.cgi"
Alias /d/winnt "/var/wwwblock/block.cgi"
このときcgiが有効になっているかを確認しておく。具体的には
AddHandler cgi-script .cgi
にコメント(#)がついていなければ有効である。
合せてapacheを動かしているユーザも調べておく。Vineの場合はapacheになっているはずだ。
制御のスクリプトなどは、上記apache設定でもわかるように/var/wwwblockで行う。そのための準備としてディレクトリを作成する。
mkdir /var/wwwblock
mkdir /var/wwwblock/ipdir
chown apache /var/wwwblock/ipdir
/var/wwwblock/ipdirはapacheを動かしているユーザの所有にしておく。
制御用のスクリプトなどは、block.cgi、callmake.sh、Makefileの3つをまず作成する。
block.cgi
#!/bin/sh
PATH=${PATH}:/usr/local/bin
# CGIとして動くので Content-type を出力
echo 'Content-type: text/plain'
echo
echo "Your PC ($REMOTE_ADDR) should be infected by some virus."
echo 'We block your connection for one day.'
echo 'Please do virus-scan your PC and visit us on the day after tomorrow.'
cd /var/wwwblock
# sudo に PATH が通っていることを確認
touch /var/wwwblock/ipdir/$REMOTE_ADDR
# callmake.sh はディレクトリ移動後makeを呼ぶだけのスクリプト
sudo /var/wwwblock/callmake.sh >> blocklog 2>&1
#不正アクセスがあった場合、メールで通知する
#echo $REMOTE_ADDR|mail -s "ServerAttack" hoge@hogehoge
作成後、chmod 755 block.cgiとしておく。
callmake.sh
#!/bin/sh
cd /var/wwwblock || exit 1
make
Makefile(iptabelesを使っている場合)
# Makefile for iptables www-attack blocker
# This Makefile should be located in /var/wwwblock
BLKDIR = ipdir
# httpdの実行権限となるユーザ名を HTTPDUSER に定義する
HTTPDUSER = apache
all: ipt.sh call-ipt
ipt.sh: ${BLKDIR}
@find ${BLKDIR} \( -type f -a -mmin +1440 \) -exec rm '{}' ';'
/bin/ls ${BLKDIR} \
| awk '{printf "iptables -I INPUT 1 -s %s -p tcp \
-j REJECT --reject-with tcp-reset\n", $$1}' \
> $@
chown ${HTTPDUSER} $@
call-ipt:
./setiptable.sh
sh ipt.sh
流れとしては
1 webに不正アクセスがあった場合block.cgiでIPアドレスをipdirに登録
2 callmake.shでMakefileをmake
3 アクセスをブロックするipt.shを作成
4 ipt.shを実行しブロック
となる。
この場合、Makefireの最後2行目にあるとおり、システムで予めルールを設定しているものがあった場合、再度その設定を実行させた上で新しいルールを追加しなくてはならない。予め設定されているルールがあった場合は/var/wwwblockにシンボリックリンクを張っておくかコピーしておく。予め設定しているルールは、rp-pppoe等を用いている場合の/etc/lppp/firewall-masqなどがある。もしそのようなものがないのであれば、次のようなファイルを用意すればいいだろう。
setiptable.sh
#!/bin/sh
iptables -F
これは単純にiptablesを初期化させているだけのものだ。
最後にcallmake.shの実行権限とhttpdの再起動をすればOK。
実行権限はvisudoで以下を追加する。
apache ALL=(root) NOPASSWD: /var/wwwblock/callmake.sh
httpdの再起動
/etc/rc.d/init.d/httpd restart
参考 UNIX USER11月号
第1特集 ネットワークトラブル119番