Apache の基本 - 色々なアクセス制御 -

Apache の基本 - 色々なアクセス制御 -

イメージ

すっかり秋めいてきましたね!できるならば冬場は冬眠していたい、こんにちは nakamura です。

以前、Apache の機能の中でもよく使う バーチャルホストの設定 について説明させて頂きましたが、それに負けず劣らずよく使うのがアクセス制御の機能ではないでしょうか。単純な基本認証から、接続元の IP 制限、更には mod_rewrite 等を使ったちょっと複雑なものまで、Apache のアクセス制御はとても多機能で、うまく使えば実に色々な事ができます。

今回はそんな Apache でのアクセス制御について、僕の独断と偏見で決めてみました『あるあるアクセス制御ベスト 5』を解説を交えながらご紹介したいと思います。

1. 接続元を制限する( IP 制限)

基本認証と並び最も頻繁に使用するアクセス制御ですね。やっている事は単純ですが、意外と根本的な部分を分からずに使いがちなので、その辺りを解説したいと思います。

Order Deny,Allow
Deny from All
Allow from 172.16.0.100

上記は 172.16.0.100 以外からのアクセスを全て拒否する設定です。

では、これは?

Order Allow,Deny
Allow from 172.16.0.100

正解は最初に書いたルールと同じく 172.16.0.100 以外からのアクセスは全て拒否されます。

IP 制限の肝は Order ディレクティブがどのような挙動をするかという所にあります。最初の例の場合、デフォルトで全てのアクセスは許可されます。つまり『 Order Deny,Allow 』のみを書くとアクセス制限は一切掛かりません。逆に『 Order Allow,Deny 』のみを書いた場合、全てのアクセスは拒否されます。

基本的には自分の分かりやすい書き方をするのが一番ですが、接続を許可する IP を記述したい場合は『 Order Allow,Deny 』、逆に拒否したい IP を書く場合は『 Order Deny,Allow 』を使うのが記述としてはスッキリしますね。

2. 会社以外からのアクセスには基本認証を掛ける

お客さんが固定 IP を持っていないので IP 制限は掛けられない、でも社内からのアクセスで基本認証が掛かるのは煩わしい、、、そんな時はこの設定を使いましょう。

AuthType Basic
AuthName "Enter ID/PW"
AuthUserFile "/var/www/example.com/.htpasswd"
Require user "user1"
Order Allow,Deny
Allow from 172.16.0.54
Satisfy Any

Satisfy ディレクティブを使う事で、基本認証か IP 制限のいずれかに合致すればアクセスを許可する事が出来ます。ちなみに Satisfy All とすると両方に合致していないとアクセス出来なくなります。

3. www なしのアクセスを www ありに書き換える

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !www\.example\.com
RewriteRule (.*) http://www.example.com/$1 [R,L]

mod_rewrite を使います。バーチャルホストの設定 でもご紹介した ServerAlias ディレクティブと併用する事で www なしでも同じコンテンツを見せつつ URL を www ありに統一する事が出来ます。SSL を使用しているサイトの場合、欠かせない設定ですね。

4. 会社以外からのアクセスにはメンテナンス画面を表示する

RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_ADDR} !172.16.0.100
RewriteCond %{REQUEST_URI} !^/maintenance\.html$
RewriteCond %{HTTP_REFERER} !http://example.com/maintenance\.html
RewriteRule (.*) maintenance\.html [R,L]

これはサイトリニューアル時等に、外部にはメンテナンス画面を見せておいて社内から動作確認をしたい場合に有用な設定です。リダイレクトループを避ける為にメンテナンスページ自身とメンテナンスページを表示するのに必要な css や画像ファイルにはルールを適用しないようにしています。ちなみに css ファイル内で画像を読み込んでいるとリファラーがその css ファイルになってしまうので、画像は html に直接記述するようにしましょう。

5. 特定のパスへのアクセスは SSL を強制する

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/login/.*
RewriteCond %{SERVER_PORT} ^80$
RewriteRule (.*) https://www.example.com/$1 [R,L]

CakePHP を使っているとログインフォームの URL が http://www.example.com/login のようになる事が多いですね。そのような場合にプログラムサイドでも SSL を強制する事は可能ですが、mod_rewrite を使えばほんの数行 httpd.conf に記述するだけで実現出来てしまいます。

以上、かなり駆け足でしたが個人的『あるあるアクセス制御ベスト 5』でした。工夫次第でもっと複雑なアクセス制御が可能です。特に mod_rewrite はとても多機能なモジュールなのでどんどん活用していきましょう!

参考 URL

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ