Apacheで日本からのアクセスのみ受け付ける

アクセスログを眺めていると海外からのアタックが非常に多いですよね。アジア圏は元より欧米からも日常的にやってきます。一般的なWebサービスなどはある意味仕方がないのですが、身内だけのツールや自分しか使わない物など間違いなく日本以外からアクセスがない物についてはサーバの設定で弾くことでリスクを多少なりとも減らすことができます。

そこで今回はApacheで海外からのアクセスを防ぐ設定、言い換えると日本からのリクエストのみ受け付ける設定について取り上げます。

設定

原理は非常にシンプルです。以下のようにApacheの設定ファイルに単にIPアドレスを羅列すれば完了。

<Directory "/var/www/html/">
  order deny,allow
  deny from all

  ### 以下に許可するIPアドレスの一覧を記述
  allow from 1.0.16.0/20
  allow from 1.0.64.0/18
  (略)
</Directory>

ここで問題になるのはどうやってこのリストを持ってくるのか…ですが、正攻法としては日本のIPアドレスの管理を行っているJPNICの以下のページにまとまっているので、こいつを何らかのスクリプトか手作業でApacheが読める形式に変換してやるのが最も正確でしょう。 www.nic.ad.jp

が、世の中には大変ありがたいことにすでにその作業を行ってくださっている方がいらっしゃいます。以下のページの「.htaccessダウンロード」をクリックしダウンロード、Apacheの設定ファイルなどにコピペしてやります。 www.cgis.biz

今回はhttpd-allow-ip.confというファイルを別に作成し、httpd.confから読み込ませる(includeされる)形にしました。最後にApache自体を再起動してやれば完了です。

何も考えたくない、コピペだけしたいという方は以下のGistをどうぞ。

検証する

実際に海外からアクセスできないか検証してみましょう。

海外のIPが利用できるVPNサービスなどを使う手もありますが、頻繁に利用しないのであればもったいないので、AWSやGCPなどで海外リージョンにサーバを建ててアクセスしてあげるのが手っ取り早いでしょう。最近は秒単位の課金なので1回の検証に数十円もかかりません。 www.interlink.or.jp

今回はAWSのLightsailに建ててみました。 オレゴン(us-west-2)にAmazonLinux、スペックは一番低い物で十分です。

インスタンスが作成されたらブラウザからシェルを起動、設定を行ったサーバへwget403 Forbiddenが返ってきたら成功です。もちろん日本国内からもアクセスし無事に表示されるかも確認しておきましょう。

$ wget 'https://xxxxx.nicecode.net/'
--2018-10-16 08:04:59--  https://xxxxx.nicecode.net/
Connecting to xxxxx.nicecode.net (xxxxx.nicecode.net)|xxx.xxx.xxx.xxx|:443... connected.
HTTP request sent, awaiting response... 403 Forbidden
2018-10-16 08:04:59 ERROR 403: Forbidden.

最後にインスタンスを忘れずに削除しておきます。

一時的に海外からアクセスしたい場合は?

海外出張や海外の拠点から一時的にアクセスしたい場合ですが、事前にIPアドレスが判明していれば、Apacheの設定ファイルに書いておけば良いのですがそうも行かない場合はどうすれば良いでしょうか?

自前で何とかしたい場合はプロキシやVPNサーバを建ててしまい、そのIPアドレスを追加しておく手があります。 blog.katsubemakito.net blog.katsubemakito.net

最近は家庭用のルータにもVPNサーバの機能が付いているものもありますので個人利用ならこういった物を使うのがお手軽です。

もしくは先ほどもご紹介した日本国内のVPNサービスを利用するとか。 www.interlink.or.jp

企業用途で厳格に運用したいのであれば、何らかの法人向けの製品を採用するのが良いかと思います。お値段は張りますが……(;´∀`)

釣れますか?

ログファイル覗いてると、アタックのトレンドや手法がわかって面白いですよねw phpMyAdminや、よく使うバックアップ用のファイル名などは鉄板ですね。

$ cat access_log | grep ' 403 '
122.114.164.113 - - [30/Sep/2018:05:37:55 +0000] "GET /phpMyAdmin-3.0.1.1/scripts/setup.php HTTP/1.1" 403 245
122.114.164.113 - - [30/Sep/2018:05:37:59 +0000] "GET /phpmyadmin3/scripts/setup.php HTTP/1.1" 403 238
47.254.215.143 - - [30/Sep/2018:07:20:59 +0000] "GET /phpMyAdmin-3.0.1.1/scripts/setup.php HTTP/1.1" 403 245
47.254.215.143 - - [30/Sep/2018:07:21:00 +0000] "GET /phpmyadmin3/scripts/setup.php HTTP/1.1" 403 238
114.67.227.32 - - [30/Sep/2018:10:43:03 +0000] "GET /phpMyAdmin-3.0.1.1/scripts/setup.php HTTP/1.1" 403 245
114.67.227.32 - - [30/Sep/2018:10:43:03 +0000] "GET /phpmyadmin3/scripts/setup.php HTTP/1.1" 403 238
61.12.38.162 - - [30/Sep/2018:12:27:08 +0000] "GET /phpMyAdmin-3.0.1.1/scripts/setup.php HTTP/1.1" 403 245
61.12.38.162 - - [30/Sep/2018:12:27:09 +0000] "GET /phpmyadmin3/scripts/setup.php HTTP/1.1" 403 238

珍しいところだと監視ツールのCactiのプラグイン狙い。懐かしい…すっかり使わなくなったなぁ…。

182.61.171.57 - - [12/Oct/2018:21:35:00 +0000] "GET /cacti/plugins/weathermap/configs/conn.php HTTP/1.1" 403 250

更に強固にしたい場合

素直にWAFを入れましょう。

個人利用や自前で運用するのであればModSecurity github.com

日本国内の法人であれば「攻撃遮断くん」「Scutum」あたりが有名ですね。いずれもクラウド型でリバースプロキシのような動きをしてくれます。攻撃手法は日々新しい物が登場していますが、クラウド型の利点は常に最新の状態に保たれるという点にあります。運用しなくて良いので非常に楽ですが、原則としてルールが公開されないので導入時には入念にテストを行う必要があります。またリバースプロキシ的な構成になるため重たいファイルを配信するのには向きません。非常に大量のリクエストが同時にくるような場合は運営会社に相談する必要もあります。 www.shadan-kun.com www.scutum.jp

AWSをお使いであれば「AWS WAF」があります。ルールは自分で設定することもできますが販売もされているので工数をかけられない場合は買ってしまった方が運用は楽です。

aws.amazon.com

aws.amazon.com

参考ページ

www.cgis.biz

セキュリティのためのログ分析入門 サイバー攻撃の痕跡を見つける技術 (Software Design plusシリーズ)
折原 慎吾 鐘本 楊 神谷 和憲 松橋 亜希子 阿部 慎司 永井 信弘 羽田 大樹 朝倉 浩志 田辺 英昭
技術評論社
売り上げランキング: 4,777