Allow, Denyの順番とデフォルト状態

Apacheでアクセス制限をかけるときに

Order Allow,Deny
Allow from 192.168.10.0/24

みたいにAllowとDenyの片方を省略して書いたりするんだけど、省略した場合デフォルトはどうなるのかがOrderによって異なるのでいつも混乱する。
混乱するなら省略せずに書けばいいじゃん、俺。バカか。
というわけで今後は省略せずに両方書こう。


と、思ったのだが……

Orderによるデフォルトの違い

公式マニュアルによるとこうなっている。


Deny,Allow
Deny ディレクティブが Allow ディレクティブの前に評価されます。アクセスはデフォルトで許可されます。Deny ディレクティブに合わないか、Allow ディレクティブに合うクライアントはアクセスを許可されます。
Allow,Deny
Allow ディレクティブが Deny ディレクティブの前に評価されます。アクセスはデフォルトで拒否されます。Allow ディレクティブに合わないか、Deny ディレクティブに合うクライアントはアクセスを拒否されます。
Mutual-failure
Allow のリストに現れて、 Deny のリストに現れないホストのみがアクセスを許可されます。 この順番付けは Order Allow,Deny と同じ効果を持ち、 その設定の方が好ましいために非推奨となっています。

なんとなくデフォルトが直感に反する気がするのは自分だけなんだろうか。


Deny,Allowはいわゆるホワイトリスト方式に適した評価順なので、デフォルトは拒否になっていて欲しい。
対してAllow,Denyはブラックリスト方式に適した評価順なので、デフォルトは許可になっていて欲しい。


……と思ったんだけど、それだと例として載っているfoo.apache.orgのパターンがうまく書けないことに気付いた。


次の例では、foo.apache.org サブドメインにあるホスト以外の、 apache.org ドメインのすべてのホストがアクセスを許可されます。 apache.org ドメインでないホストは、デフォルトの状態がアクセス拒否のため、 サーバへのアクセスを拒否されます。

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

apache.orgは許可するけど、foo.apache.orgやそれ以外は拒否するという設定。


もし先の希望通りにデフォルトが逆だったとしたら、上記の設定ではapache.orgでもfoo.apache.orgでもない人はアクセスできてしまう。
しかしDeny from allだとapache.orgの人もアクセス出来ない。


逆にOrder Deny,Allowを使ったとしても、デフォルトが逆だったら、Allow from apache.orgの時点でfoo.apache.orgもアクセスできてしまう。


ううむ。
つまり、最初に全体に対する許可なり拒否があって、それをAllowまたはDenyで上書きする。さらに上書きしたルールの例外を設定する……って感じ?
そう考えるとなんか納得できたような気がする。気がするだけかも。


なんだか余計に混乱してきたが、デフォルトを明示的に書けばいいとかそういう問題じゃないことがわかった。
とりあえず

  • (Allow from all),Deny,Allow
  • (Deny from all),Allow,Deny

サンドイッチになっているという感じで覚えるか。


ホワイトリスト方式/ブラックリスト方式に適している、というのも最初にAllow/Deny from allするのが前提だから、勝手に「適している」とか言われても……って話だな。
デフォルトがわかってれば逆のOrderでもできるし。