許可だか拒否だか allow,deny

Apacheのアクセス制限設定の基本ではあるが、なんだか考え出すとわかんなくなっちゃう人が多い。自分もそうだったので整理。

  • Order allow, deny
  • Allow from all
  • Deny from xxxxx

というパターンが割と一般的だが、これは

  • Order deny,allow
  • Deny from xxxxx

と書く場合もある。(Apacheのデフォルトは deny, allow みたいなのでこっちが普通?)

この2つが同じだよって言われると、「え?なんで?」って事なってくる。

誤解ポイントは2つ

  1. Order A,B を、 Aを評価した後に、Aでなかったものに対してBを評価すると考えてしまう。
  2. Allow, Deny の記述上の順番に意味があると思ってしまう。

例えば、一番失敗しそうな勘違いは、

  • Order deny,allow
  • Deny from xxxxx
  • Allow from all

これだと、xxxxx が、Denyで弾かれて、その他は、Allow from all で許可されるような印象を持つけど、実際は、こんな記述をしたらオール通し!になってしまう。

これでダメなら、次のはどうか!ってやってみる人もいるかもしれない。

  • Order deny,allow
  • Allow from all
  • Deny from xxxxx

Allow from all で全許可しておいて、後ろのDenyで、xxxxx だけ拒否! しかし、残念ながら、Order の事忘れちゃってますよね。記述上 Deny をAllowの前に書こうが、後ろに書こうが関係ないわけです。

これらがうまくいかない理由は次の通り

  1. Order A,B は、 Aを評価した後に、Aだったものに対して、Bを評価する
  2. Allow, Deny の記述上の順番には意味なんかない

つまり上の間違い例だと、 最初に deny を評価するので、 xxxxx が一旦 deny になり、それ以外は、allow になる。この allow になったものは、それ以上チェックされないので、許可。 deny になったものは、更に Allow リストでチェックされるのだが、Allow from all なので、結局 allow になってしまう。で、xxxxx も許可。 ということになってしまうわけです。

from all という記述がよく見られるのは、「とりあえず全部許可」とか「とりあえず全部拒否」みたいな意思を明確にする意図があって、フィルタ設定では、そういう明示的な設定が推奨されるからだと思いますが、Apache の Order 設定だと、処理的には、「とりあえず全部許可、だけど、やっぱ xxxxx はダメ」みたいな感じで、処理的にはややこしくなってしまう。日本はOKだけと、北海道はダメみたいな設定をしたい場合には必須の設定なんだけど、私的には、from all を使うより、Order をヒックリ返して Deny だけ書くとか Allow だけ書く方がわかりやすいような気もします。

正しくはありませんが、とりあえず、「Order deny, allow」を、「deny でなければ、allow(なのでDenyだけ書けば良い)」と読んでしまうのも手かもしれませんね。

カテゴリー: Web, Techinical パーマリンク