2017年8月16日水曜日

Apacheで特定の国からのアクセスを拒否する


for CentOS7.x

GCEの利用料金を抑えるため、1パケット目から料金の発生する中国とオーストラリアからのHTTPリクエストに拒否応答(403)を返すApacheの設定です。

完全に遮断したいのであれば、GCEのFWでブロックしたほうがいいのですが、中国もオーストラリアもとなると対象IPが多すぎるのと一つ一つ登録するのが面倒なので・・・

まずは、mod_geoipをインストールします。
sudo yum install mod_geoip
次にGeoIPのデータベースをmaxmind社からダウンロードして配置しておきます。
Licenseは CC BY-SA 3.0で、下記の文章を製品などに含むことでライセンスを満たすことになるようです。
この製品には MaxMind が作成した GeoLite2 データが含まれており、
<a href="http://www.maxmind.com">http://www.maxmind.com</a> から
入手いただけます。
mkdir geoip
cd geoip/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
sudo mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat.bak
sudo mv GeoIP.dat /usr/share/GeoIP/GeoIP.dat
httpdのconfを変更します。mod_geoipのconfigは/etc/httpd/conf.d/geoip.confに配置されますので、若干の修正を加えます。
sudo vi /etc/httpd/conf.d/geoip.conf

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

  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat MemoryCache
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat CheckCache
</IfModule>
あとは、httpd.confでCountry Codeをブラックリストとして登録して拒否します。
sudo vi /etc/httpd/conf/httpd.conf

<Location "/">
  Order allow,deny
  SetEnvIf GEOIP_COUNTRY_CODE CN BLACKLIST_COUNTRY
  SetEnvIf GEOIP_COUNTRY_CODE AU BLACKLIST_COUNTRY

  Allow from all
  Deny from env=BLACKLIST_COUNTRY
</Location> 
ログにCountry Codeを追加したい場合は"%{GEOIP_COUNTRY_CODE}e"を追加すると、下図のようにJPとかUSとかがログに記載されるようになります。
LogFormat "%h %l %u %t  \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{GEOIP_COUNTRY_CODE}e" combined
LogFormat "%h %l %u %t  \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{GEOIP_COUNTRY_CODE}e"
あと、403を返す時に少しでもサイズを減らすため、最小の文字列を返すように設定しておきます。まぁ、1文字でもいいと思いますが、E403とだけ返すように設定してみました・・・。
ErrorDocument 403 "E403"
最後にhttpdを再起動して設定を反映させてください。
sudo systemctl restart httpd
以上ですー。

0 件のコメント:

コメントを投稿