Webサーバのセキュリティがほんの少し向上するかもしれない設定
2017/04/06
Webサーバを初めて公開した人が驚くのはボットからの攻撃の多さ。
IPレベルで全域的に攻撃してるのか、Googleにインデックスされていないサイトでも攻撃ログが残っていることがあります。
今回はこのボットの特性を逆手にとって、Webサーバのセキュリティをほんの少しだけ向上させる(かもしれない)方法をご紹介しようと思います。
スポンサーリンク
一応言っておくと、私はセキュリティの専門家ではないので、あくまで手法の一つ程度で捉えて下さい。
ボットの性質
結論から言うと、「管理外のドメインでのアクセス(IP直打ち)があった場合にページを見せない」事です。
つまりどういうことかというと、ボットからのアクセスは「Hostヘッダが不正」である事が多いです。
IP直打ちでアクセスしてるからなのか、Hostヘッダを正しく扱えない玩具なのかは分かりませんが、大抵普通じゃないアクセスが来ます。(HTTP/1.0とか)
そうです、VirtualHostを応用して明らかに普通じゃないアクセスを調理してやるのです。
リダイレクトでもOK
IP直打ちや管理外ドメインのアクセスを正しいドメインにリダイレクトするようにしておけば、ユーザの利便性が向上するかも?
Hostヘッダを正しく送れないボットはリダイレクトを辿りませんし、辿ったところでどちらにせよHostヘッダを正しく送れないので問題ないです。
とはいえ、普通はIP直打ちでアクセスされる事はありませんし、403やnginxの444(切断)でも十分OKです。
私は前までリダイレクトさせていたのですが、あまり意味はなさそうだったので現在は403や444を設定しています。
懸念
Hostヘッダを正しく扱えない(ほぼイコールでHTTP/1.1が使えない)クライアントがアクセス出来なくなりますが、そもそもきょうびHTTP/1.1が使えないクライアントなんか居ないと思って問題ないです。
HTTP/2も出たか、という時代にHTTP/1.0なんて古墳から出土したブラウザみたいなものですよ。
流行りのSSL対応やHTML5、CSS3なんかを視野に入れていると古墳から出土したブラウザなんかはそもそも論外ですし。
つまり気にしない。
実際に設定してみる
といっても、VirtualHostの使い方が分かっていれば簡単です。
VirtualHostが使えるならばApacheでもnginxでもそれ以外でも。
設定例
お先に実際の設定例
nginx
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
access_log off;
log_not_found off;
return 444;
}
Apache
<VirtualHost *:80>
ServerName any
Redirect 403 /
ErrorLog /dev/null
CustomLog /dev/null combined env=0
</VirtualHost>
解説
設定を読めばだいたい何をしたいのかは分かると思いますけど……
nginxでは「default_server」が使えるのでこれを指定します、これで正しくないリクエストをこのVirtualHostが受け持つようになります。
Apacheの場合はそれらが使えないので、最初に読み込まれるように読み込み順序に気を付けてください、sites-availableに設定を置いて、sites-enabledにリンクを張るタイプのやり方の場合は000-defaultとかにすればいいかと。
(Apacheにも_default_があるけど、どうやら名前ベースのVirtualHostには使えないみたい)
nginxでドメインを設定しない場合は「server_name _;」です、Apacheに該当する設定はないみたいなので「any」で代替するパターンが多いかと思います。
後は403や444などの好きな応答を返すだけです。上の例ではログは捨てていますが、必要であれば保存して研究してみるのも面白いでしょう。
実際の効果は?
割と引っかかってます。
この設定を行えばボットの攻撃が実際に公開しているサイト(WordPressとか)に行く事がなくなるので、ついうっかり何かマズい物がサーバ上に残っていた場合、みたいな時にダメージを受けるリスクが減らせるかと思います。
HTTP/1.0なんか居ないと思って良いでしょうし、VirtualHostを使うのであれば一緒に設定しておくと良いでしょう。