.htaccessを利用した国内IP制限を行う方法と.htaccessによる速度低下の影響を紹介します。
日本国内IPに制限すれば攻撃の被害を大きく低減できる
日本国内のサービスであれば言語は日本語でビジターのほとんどが日本人だと思います。
一方でアプリケーションの脆弱性をついた攻撃や悪質なスクレイピング、クローラなどの多くは海外IPからのアクセスです。
弊社のサーバのSSHポート(22)へのアクセスログを見ると攻撃のほとんどは海外で日本のIPは2.8%でした。大雑把に計測したもので参考程度のものですが、サーバ管理者には概ね同意いただけると思います。
したがって、海外をターゲットとしているサービスでなければ海外からのアクセスをブロックすることで多くの攻撃を防ぐことができます。
※海外在住の日本人のアクセスもブロックされるのは注意
ビジターの国はIPで見分ける
IPアドレスは国レベルで割り振られているため、ビジターの国をIPアドレスで見分けられます。
IPアドレスによる国の識別は一般的に98~99%程度の精度と言われています。
参考)ipify.org website: https://geo.ipify.org/blog/ip-geolocation-accuracy-how-reliable-is-the-technology
CloudFront の地理制限を利用: https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/georestrictions.html
許可リスト方式の採用が楽だが拒否リスト方式でもOK
IP制限の方針は2つあります。
- 日本IPのみを許可する許可リスト方式
- 特定の海外IPを拒否する拒否リスト方式
許可リスト方式の特徴
- シンプルで楽
- 精度上日本人でも拒否される人が僅かにいる
許可リスト方式では一部にサービス影響が出る可能性がありますが、看過できる場合は許可リスト方式が良いです。
拒否リスト方式の特徴
- サービス影響がでにくい
- ブロックの効率は低い
- 拒否対象が多いと拒否リストの管理が煩雑
拒否リストではサービスの影響は出にくいですが、ブロック効率は低いので国という大きな範囲ではなく特定のIP帯(特定のホスティング事業者等)のみを攻撃の都度加えていき、ユーザーエージェントやリファラなどIP以外の情報でアクセス制限するという方法が効率的だと思います。
.htaccessで国内IPのみに制限する
数あるIP制限方法のなかで代表的なwebサーバ・Apacheの設定ファイル.htaccessを使った方法を紹介します。
.htaccessの利点は「管理者以外でも設定可能」であり、レンタルサーバでも利用可能です。
欠点は「パフォーマンス低下」でリクエストのたびに.htaccessを走査することが理由です。
しかし、簡単に使えるメリットがあるので速度低下がどのくらいなのか?というのを調べてみます。
.htaccessとは?設定の書き方国内IPリストを取得する方法
国内のIPリストを取得する方法はたくさんあります。
ここではinverse-rir-ipを使います。 https://github.com/ipverse/rir-ip
毎日更新される?ようですがそんなにリアルタイムではなくて良いのでひと月に一回IPリストを定期的に取得する形にします。
#!/bin/bash
FILE_PATH=/tmp/jp_iplist
HTACCESS_PATH=/home/www/light2.example.com/htdocs/.htaccess
#過去に取得したリストがあればリネーム
if [ -e "${FILE_PATH}" ]; then
mv -f "${FILE_PATH}"{,.bef}
else
echo "NoFile"
fi
#リスト取得してApache2.4の許可形式に変換してファイル出力
curl https://raw.githubusercontent.com/ipverse/rir-ip/master/country/jp/ipv4-aggregated.txt | sed -E 's/^([0-9])/Require ip \1/g' > "${FILE_PATH}"
#前回IPリストと.htaccessの差分と新しく取得したリストを合体して.htaccessを作成
cp -f "${HTACCESS_PATH}" "${HTACCESS_PATH}".bak
cat <(diff "${FILE_PATH}".bef "${HTACCESS_PATH}"|grep ">" |sed -e 's/> //g') "${FILE_PATH}" > "${HTACCESS_PATH}".tmp
cp -f "${HTACCESS_PATH}".tmp "${HTACCESS_PATH}"
rm -f "${HTACCESS_PATH}".tmp
これをcrtonに登録して月一回動かします(毎月5日の11:25分に実行)
25 11 5 * * /root/bin/jp_list.sh
apache 2.4 https://httpd.apache.org/docs/2.4/howto/access.html
Apache Benchで比較!想定よりも遅くなった
Apache BenchはApacheに付属してくるベンチマークソフトです。
下記のように総リクエスト200, 同時10で測定しました。どちらも測定前にapacheをリスタートしています。
ab -n 200 -c 10 http://example.com
.htaccessに上記で設定した日本IPの許可設定をした場合
Requests per second: 20.14 [#/sec] (mean)
Time per request: 496.532 [ms] (mean)
Time per request: 49.653 [ms] (mean, across all concurrent requests)
.htaccessに何も記述していない場合の設定
Requests per second: 324.14 [#/sec] (mean)
Time per request: 30.851 [ms] (mean)
Time per request: 3.085 [ms] (mean, across all concurrent requests)
何とIP許可設定を.htaccessを入れた場合は16倍も遅い結果になりました。
.htaccessは空でhttpd.conf側に入れたらどうなるか?
.htaccessがあまりにも遅すぎたので、httpd.conf側に設定を入れたらどうなるか確認してみました。
測定するバーチャルホストの.confにjp_iplistをIncludeして設定しました。abの測定条件は全く同じでapacheを測定前に再起動しています。
Requests per second: 354.07 [#/sec] (mean)
Time per request: 28.243 [ms] (mean)
Time per request: 2.824 [ms] (mean, across all concurrent requests)
あれ、めちゃくちゃ早いです。.htaccessに記述していない時とほとんど変わらないですね。
もしかしたら.htaccessに少しでもルールが入ると遅くなったりするのか?を確認するため.htaccessに10行だけrequireのルールを追加して測定してみました(403にならないように自身のIPも追加)。
Requests per second: 395.10 [#/sec] (mean)
Time per request: 25.310 [ms] (mean)
Time per request: 2.531 [ms] (mean, across all concurrent requests)
変わらないですね。むしろ早い?
最後に.confと.htaccess両方に日本IPの許可設定を入れた状態で測定します
Requests per second: 20.18 [#/sec] (mean)
Time per request: 495.630 [ms] (mean)
Time per request: 49.563 [ms] (mean, across all concurrent requests)
ちゃんと遅くなってますね。
同じ数のルールを拒否設定した時の速度低下は?
同じ数のルールを拒否設定した場合はどうなるでしょうか?日本IPを拒否する設定にして測定してみました。
アメリカのIPからアクセスを行うので環境が変わり結果は先ほどと変わると思います。
Requests per second: 15.85 [#/sec] (mean)
Time per request: 630.757 [ms] (mean)
Time per request: 63.076 [ms] (mean, across all concurrent requests)
.htaccessからの状態でのアクセス
Requests per second: 37.32 [#/sec] (mean)
Time per request: 267.972 [ms] (mean)
Time per request: 26.797 [ms] (mean, across all concurrent requests)
2.3倍ほど遅くなってますが、影響は少なそう?です。
結論 .htaccessでIP許可設定を入れるとかなり遅くなる。.conf側ならそんなに速度低下は気にならない。
拒否設定の方が軽そう。