Plesk11入りwebサーバーでアクセス制限

お客さんが仕立てた(多分)GMOのクラウドサーバーにはPlesk11が入っていた。
そもそもPleskが何なのかよく分からないけど、なんかしらの管理ツールなのだろうか。

このサーバーのとあるディレクトリでIPによるアクセス制限をかけたい、と言われたので真っ先に.htaccessを思いついた。

order deny,allow
deny from all
allow from 192.168.1.1

Apacheならこの記述を.htaccessに書くだけで192.168.1.1以外のアクセスを全て403で返してくれるのだけど、今回は勝手が違った。
どんなIPで接続しても弾かれてしまうという恐ろしい現象に陥ってしまった。
テストサーバーでは問題なくできたのに、おかしい…。

試しに同じ.htaccess内にrewriteやbasic認証を書いてみた。
すると問題なく動く。
つまりサーバーの設定で.htaccessが使えない訳ではなさそうだ。
AllowOverride AllにしててIP制限だけ使用できないとか、聞いたことがないけどもしかしたら限定的な機能の制限とかあるのかも…と思って調べてみた。
けど、そんな設定はなかった。

つまり、htaccessで記述できる設定の内アクセス制限だけが何かしらの原因で今できていないらしい。

すげー困って色々調べてみたところ、PleskにはApacheだけじゃなくてNginxというwebサーバーらしき物が入っている(?)らしい。
そしてnginxがリバースプロキシも何ちゃらで普通のIP制限(order,deny,allow)は効かないらしい。

もっと詳しく言うと、Plesk11の初期設定の状態だとNginxが起動していて、Apacheの方の設定は「Nginxに対しての応答をすべて通過させる」という設定になっているらしい。
ええい、ややこしい!

という訳でPleskの環境下でNginx + ApacheのwebサイトでIPアドレスによるアクセス制限を行う場合は.htaccessに下記の様に書くとバッチグーだそうな。

SetEnvIf X-Forwarded-For ^192.168.1.1$ allowIP #192.168.1.1を接続許可の場合
<Files ~ (.*)>
Order deny,allow
Deny from all
Allow from env=allowIP
</Files>
SetEnvIf X-Forwarded-For ^192.168.1.1$ denyIP #192.168.1.1を接続不許可の場合
<Files ~ (.*)>
Order allow,deny
Allow from all
Deny from env=denyIP
</Files>

キモは二つ。
まず、1行目で接続許可(/不可)するIPを書いてやること。
そしてディレクトリだけでなくその下のファイル全てに.htaccessを効かせたい場合は<Files ~ (.*)>~</Files>で囲んでやること。

SetEnvIf X-Forwarded-For ^192.168.1.1$ denyIP
Order allow,deny
Allow from all
Deny from env=denyIP

↑の様に書いた場合、該当ディレクトリには効くがその下のファイルにはアクセスできてしまう、という現象が起こる。
つまり
http://example.com/hoge/
にアクセスした時は弾かれるのに、
http://example.com/hoge/index.html
にはアクセスできてしまうという余り意味をなさない設定になってしまう。
これを防ぐために<Files ~ (.*)>~</Files>で囲ってやる。
逆に特定のファイルだけアクセス制限したい場合は

SetEnvIf X-Forwarded-For ^192.168.1.1$ denyIP
<Files ~ (index\.html)>
Order allow,deny
Allow from all
Deny from env=denyIP
</Files>

の様に書いてやる。
また、アクセス制限対象のIPが複数ある場合はSetEnvIf X-Forwarded-Forの行を増やしてやる↓

SetEnvIf X-Forwarded-For ^192.168.1.1$ denyIP
SetEnvIf X-Forwarded-For ^192.168.1.2$ denyIP
SetEnvIf X-Forwarded-For ^192.168.1.3$ denyIP
<Files ~ (.*)>
Order allow,deny
Allow from all
Deny from env=denyIP
</Files>

ちなみに「denyIP」「allowIP」となっている箇所は実は自由に変えられる。
hogehogeでもACCESSとかでもなんでも大丈夫。

本当にややこしくてかなわんです。
Apache万歳。

今回は以下のサイトに助けられました。多謝。

ウェブサーバーの構成【Plesk11】

ロードバランサーやプロキシー経由でも.htaccessでのIPアドレスを制限したい場合

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)