何回設定しても覚えられない Apache の Order Deny,Allow と Order Allow,Deny の意味。

Apache 2.4 からは RequireAll, RequreAny, RequireNone という新しいディレクティブが 導入されてわかりやすくなったみたい。 http://httpd.apache.org/docs/trunk/mod/mod_authz_core.html#requireall

でも今日は 2.2 までの古い Apache のお話。

デフォルトAllow

Order Deny,Allow

公式の説明

First, all Deny directives are evaluated; if any match, the request is denied unless it also matches an Allow directive. Any requests which do not match any Allow or Deny directives are permitted.

Deny ディレクティブが Allow ディレクティブの前に評価されます。アクセスはデフォルトで許可されます。Deny ディレクティブに合わないか、Allow ディレクティブに合うクライアントはアクセスを許可されます。

Allow にも Deny にもマッチしないリクエストは許可される。つまりデフォルトで許可の設定。追加で拒否の設定をすることもできる。

最初にDenyディレクティブが評価されて、そこでマッチしなければ許可。次に、Denyに合致したリクエストのうち、Allowに合致しないものが拒否される。Denyの効果をAllowで打ち消せる。だから、丸ごと拒否しておいて、一部だけ許可するという用途に使える。丸ごと拒否の Deny from all と一緒に使うことが多い。

デフォルトDeny

Order Allow,Deny

公式の説明

First, all Allow directives are evaluated; at least one must match, or the request is rejected. Next, all Deny directives are evaluated. If any matches, the request is rejected. Last, any requests which do not match an Allow or a Deny directive are denied by default.

Allow ディレクティブが Deny ディレクティブの前に評価されます。 アクセスはデフォルトで拒否されます。Allow ディレクティブに合わないか、Deny ディレクティブに合うクライアントはアクセスを拒否されます。

Allow にも Deny にもマッチしないリクエストは拒否される。つまりデフォルトで拒否の設定。追加で許可の設定をすることもできる。

最初に Allowディレクティブが評価されて、そこでマッチしなければ拒否。次に、Allow に合致したリクエストのうち、Denyに合致しないものが通過する。Allowの効果をDenyで打ち消せる。だから、あるリクエストのグループを許可したいんだけど、そのうち一部は拒否したい、という場合に使える。

Order Deny,Allow
Deny from all
Allow from apache.org

これはデフォルト許可で、Deny from all によって全拒否した上で、apache.org からのアクセスのみを許可している。

Order Allow,Deny
Allow from apache.org
Deny from foo.apache.org

これはデフォルト拒否で、Allow from apache.org によって apache.org からのアクセスを許可した上で、 Deny from foo.apache.org で foo.apache.org だけ仲間はずれにしている。

もう一度まとめると

Order Deny,Allow
  1. deny を評価。マッチしなければ許可(= デフォルト Allow)。
  2. deny にマッチしたリクエストに対して allow を評価。allow にマッチしなければ deny。
Order Allow,Deny
  1. Allowを評価。マッチしなければ拒否(= デフォルト Deny)。
  2. Allowにマッチしたリクエストに対して、deny を評価。deny にマッチしなければ allow。

Basic認証で一部のユーザのみに許可したいとき

よくあるのは、Basic認証で一部のユーザのみに見せたいというケース。 単にBasic認証したいだけなら、Orderは要らない。

AuthUserFile /etc/httpd/etc/passwd
AuthName "admin"
AuthType Basic
Require valid-user

複数の条件を組み合わせてアクセス制限したい場合

例えばこんなケース * 社内のIPからのアクセスはBasic認証無し、それ以外の場合にはBasic認証する。 * 特定のURLは誰にでも見せて、その他は認証済みユーザのみアクセス可にする。

以下は /robots.txt だけBasic認証無しにする場合の一例。

SetEnvIf Request_URI ^/robots.txt$ noauth=1

<Location />
Order Allow,Deny
Satisfy any
Allow from env=noauth

AuthUserFile /etc/httpd/etc/passwd
AuthName "admin"
AuthType Basic
Require valid-user
</Location>

Require が Allow や Deny と一緒に使われるとき、Satisfy によって Require と Allow/Deny の組み合わせを制御する。Satisfy any なら、Require または Allow/Deny のどちらかで permit なら permit。Satisfy all なら、Requre も Allow/Deny も、両方とも permit になる必要がある。