GeoIPを使用してWebサーバのアクセスを国内だけに制限する

· 3 min read
GeoIPを使用してWebサーバのアクセスを国内だけに制限する

覚書用に作った本サイトですが、クローリングの設定は無効なので検索サイトからこのサイトにたどり着く事はありません。
しかし、外部へ晒しているので全くアクセスが来ない訳ではありません。
当然海外から大量のアクセスも来ます。

アクセスログとか見ると、どう考えてもアタックとしか思えないアクセスも多いので
GeoIPを利用してサイトへのアクセスを国内のみ許可する設定をします。


GeoIP
maxmindが提供する、IPアドレスから地理情報を確認することができるサービス(GeoIP)。
無償版と有償版が用意されている。有償版の方が高機能。
国別の判定をするだけなら無償版で十分なので、今回は無償版を利用します。
https://www.maxmind.com/

1.はじめに

作業環境

  • CentOS 6.8
  • Apache 2.2.15

2.Yumリポジトリを追加

Yumのリポジトリ「EPEL」を追加します。

[bash]
[root@kensyo ~]# yum install epel-release
[/bash]

3.パッケージインストール

[bash]
[root@kensyo ~]# yum install mod_geoip GeoIP GeoIP-devel GeoIP-data zlib-devel
[/bash]

これで、

  • IP判別データベース /usr/share/GeoIP/GeoIP.dat (←もうすでに古いデータ)
  • ユーティリティ(geoiplookupgeoiplookup6geoipupdate
  • Apache用国別判定モジュールの modules/mod_geoip.so
  • Apache用設定ファイル /etc/httpd/conf.d/geoip.conf

が入ります。
mod_geoipをインストールすると、「/etc/httpd/conf.d/geoip.conf」が自動生成されるので、後ほど設定します。
4.GeoIPとGeoLiteのデータベースを更新

mod_geoipが参照しているデータベースは、月に1回(たしか2日)更新されます。
データベースの定期更新は必須です。もし、更新を忘れると意図しないアクセスを拒否や許可する可能性があります。

[bash]
[root@kensyo ~]# vi /root/geoipupdate.sh
[/bash]

[bash]
#!/bin/sh

# geoipupdate.sh geoipupdateはID登録がいるので、
# 無償で使えるGeoLiteCountryをダウンロードする
# ダウンロードしたら、geoiplookup <IP_ADDRESS> で確認できる。

# GeoLiteCountryのURL
GEOIP_URL=http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

# CentOS 6のGeoIP.dat の格納場所
GEOIP_PATH=/usr/share/GeoIP/GeoIP.dat
GEOIP_TEMP=/usr/share/GeoIP/GeoIP.dat.temp

curl -f $GEOIP_URL | zcat > $GEOIP_TEMP
if [ $? -ne 0 ]
then
exit 1
fi
if [ -s $GEOIP_TEMP ]
then
mv -f $GEOIP_TEMP $GEOIP_PATH
exit 1
fi
exit 0
[/bash]

[bash]
[root@kensyo ~]# chmod +x /root/geoipupdate.sh
[/bash]

※ちなみに「geoipupdate」コマンドでも更新は可能ですが、更新データベースが少ないのでスクリプトで更新してます。

[bash]
[root@kensyo ~]# geoipupdate
[/bash]

5.mod_geoipの初期設定

[bash]
[root@kensyo ~]# vi /etc/httpd/conf.d/geoip.conf
[/bash]

[bash]
LoadModule geoip_module modules/mod_geoip.so

<IfModule mod_geoip.c>
GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat Standard
</IfModule>

##海外からのアクセスを拒否する
<DirectoryMatch / >
SetEnvIf GEOIP_COUNTRY_CODE JP AllowCountry
Order deny,allow
Deny from all
Allow from env=AllowCountry
</DirectoryMatch>
[/bash]

6.apache再起動

[bash] [root@kensyo ~]# /etc/rc.d/init.d/httpd restart [/bash]

これで終わり。


  • 設定が反映できているか検証

今回海外からのアクセスを検証する為、AWSで海外リージョンのWindows Serverのインスタンスからアクセス。

↓ 設定前。普通に閲覧可。

blgo

↓ 設定後。403エラーで見れなくなっている。

2016-10-16_1651

これでちょっと安心。

 


・余談

データベースの定期更新が面倒なのでcronに登録すると楽ですね。

[bash]
[root@kensyo ~]# crontab -e
00 09 02 * * root /root/bin/geoipupdate.sh
[/bash]

○アクセス制限のサンプル
・日本からのアクセスを拒否する

[bash]
<DirectoryMatch />
SetEnvIf GEOIP_COUNTRY_CODE JP BlockCountry
Order allow,deny
Allow from all
Deny from env=BlockCountry
</DirectoryMatch>
[/bash]

・日本・アメリカ・北アメリカ・南アメリカ・オセアニア・ヨーロッパからアクセスを許可する設定

[bash]
<DirectoryMatch / >
SetEnvIf GEOIP_COUNTRY_CODE US AllowCountry
SetEnvIf GEOIP_COUNTRY_CODE JP AllowCountry
SetEnvIf GEOIP_CONTINENT_CODE SA AllowContinent
SetEnvIf GEOIP_CONTINENT_CODE EU AllowContinent
SetEnvIf GEOIP_CONTINENT_CODE NA AllowContinent
SetEnvIf GEOIP_CONTINENT_CODE OC AllowContinent
Order deny,allow
Deny from all
Allow from env=AllowCountry
Allow from env=AllowContinent
</DirectoryMatch>
[/bash]

・中国とロシアからのアクセスを拒否する設定

[bash]
<DirectoryMatch />
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry
Order allow,deny
Allow from all
Deny from env=BlockCountry
</DirectoryMatch>
[/bash]

※参考サイト
・CentOSでGeoIPを利用してHTTPアクセスを制御する
http://qiita.com/SatoHiroyuki/items/4ccfa109a76dfe474793

・CentOS 6.6 – mod_geoipでWebサーバに対するアクセスを国別で制限してみた。
http://centos.sabakan.red/entry/2015/03/04/020500

・CentOS 6のApacheで外国のspamロボットのアクセスを制限する
https://gist.github.com/CLCL/5894346