アクセスログを眺めていると海外からのアタックが非常に多いですよね。アジア圏は元より欧米からも日常的にやってきます。一般的な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が読める形式に変換してやるのが最も正確でしょう。
が、世の中には大変ありがたいことにすでにその作業を行ってくださっている方がいらっしゃいます。以下のページの「.htaccessダウンロード」をクリックしダウンロード、Apacheの設定ファイルなどにコピペしてやります。
今回はhttpd-allow-ip.conf
というファイルを別に作成し、httpd.confから読み込ませる(includeされる)形にしました。最後にApache自体を再起動してやれば完了です。
何も考えたくない、コピペだけしたいという方は以下のGistをどうぞ。
検証する
実際に海外からアクセスできないか検証してみましょう。
海外のIPが利用できるVPNサービスなどを使う手もありますが、頻繁に利用しないのであればもったいないので、AWSやGCPなどで海外リージョンにサーバを建ててアクセスしてあげるのが手っ取り早いでしょう。最近は秒単位の課金なので1回の検証に数十円もかかりません。
今回はAWSのLightsailに建ててみました。
オレゴン(us-west-2)にAmazonLinux、スペックは一番低い物で十分です。
インスタンスが作成されたらブラウザからシェルを起動、設定を行ったサーバへwget
し403 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アドレスを追加しておく手があります。
最近は家庭用のルータにもVPNサーバの機能が付いているものもありますので個人利用ならこういった物を使うのがお手軽です。
売り上げランキング: 162
もしくは先ほどもご紹介した日本国内のVPNサービスを利用するとか。
企業用途で厳格に運用したいのであれば、何らかの法人向けの製品を採用するのが良いかと思います。お値段は張りますが……(;´∀`)
釣れますか?
ログファイル覗いてると、アタックのトレンドや手法がわかって面白いですよね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
日本国内の法人であれば「攻撃遮断くん」「Scutum」あたりが有名ですね。いずれもクラウド型でリバースプロキシのような動きをしてくれます。攻撃手法は日々新しい物が登場していますが、クラウド型の利点は常に最新の状態に保たれるという点にあります。運用しなくて良いので非常に楽ですが、原則としてルールが公開されないので導入時には入念にテストを行う必要があります。またリバースプロキシ的な構成になるため重たいファイルを配信するのには向きません。非常に大量のリクエストが同時にくるような場合は運営会社に相談する必要もあります。
AWSをお使いであれば「AWS WAF」があります。ルールは自分で設定することもできますが販売もされているので工数をかけられない場合は買ってしまった方が運用は楽です。
参考ページ
技術評論社
売り上げランキング: 4,777
このブログを応援する
お寄せいただいたお気持ちは全額サーバ代や次の記事を執筆するための原資として活用させていただいております。この記事が参考になった場合などぜひご検討ください。