Help us understand the problem. What is going on with this article?

Amazon LinuxでGeoIPを使って海外からの攻撃を遮断する方法

More than 3 years have passed since last update.

概要

AWSの環境でmod_geoipというApacheモジュールを使って、海外のIPからのアタックを遮断する設定例です。

設定が簡単なので
海外からの攻撃を一刻も早く遮断したい!といった場合に、
ちゃんとした WAF, IPS/IDS ツールを導入するまでのつなぎとして使える小技です。

環境

EC2 (Amazon Linux AMI release 2016.03)
ELB (Classic)

GeoIP-1.4.8-1.5.amzn1.x86_64
httpd24-2.4.23-1.66.amzn1.x86_64
mod24_geoip-1.2.7-1.6.amzn1.x86_64

GeoIPとは?

maxmind社が提供しているIPアドレスから地理情報を確認することができるサービスです。
https://www.maxmind.com/

mod_geoipの設定

前提:Apache2.4がインストール済みであること(設定は割愛)。

mod_geoipのインストール

# yum install mod24_geoip

GeoIPデータベースの更新

# cd /usr/share/GeoIP

<<< データが古いので退避 >>>
# mv GeoIP.dat GeoIP.dat.org

<<< 最新のデータを取得 >>>
# wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
# gunzip GeoIP.dat.gz

geoip.confの設定

日本国外からの接続を遮断する設定

/etc/httpd/conf.d/geoip.conf
<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>

<DirectoryMatch />
SetEnvIf GEOIP_COUNTRY_CODE JP AllowCountry
Order deny,allow
Deny from all
Allow from env=AllowCountry
</DirectoryMatch>

反映

# service httpd restart

ApacheがELB配下にある場合

普通に設定するとアクセス元IPがELBのものになったり、ヘルスチェックが弾かれてしまったりしてうまく動作しません。
これらの問題を回避する為、以下の設定を追加します。

ELB経由でもallow fromで元IPをチェックできるようにする

/etc/httpd/conf/httpd.conf
#<<< 下記を追加 >>>
RemoteIPHeader X-Forwarded-For

#<<< LogFormat 設定を変更 %h -> %a >>>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%a %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

ELBのヘルスチェックIPをチェック対象から除外

ELBのSubnetからの接続を許可する設定を追加すればOK(この例はクラスB全部)

/etc/httpd/conf.d/geoip.conf
<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>

<DirectoryMatch />
SetEnvIf Remote_Addr "^172.(1[6-9]|2[0-9]|3[0-1])." AllowCountry <<<-- New!!
SetEnvIf GEOIP_COUNTRY_CODE JP AllowCountry
Order deny,allow
Deny from all
Allow from env=AllowCountry
</DirectoryMatch>

反映

# service httpd restart

以上。

参考サイト

GeoIP Legacy Apache Module ドキュメント 国の他に,大陸や地域ごとの制御も可能なようです。
CentOSでGeoIPを利用してHTTPアクセスを制御する

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away