by ryou

Apacheのアクセス制御に関して

CentOS7にCakePHP3の開発環境を整えるに当たってphpmyadminをインストールしていた所、参考にしていたサイトで気になる記述があったので覚書。

Require all granted

気になった記述はPHP5.6(CentOS7x64)にphpMyAdminをインストールするの以下の箇所

vi /etc/httpd/conf.d/phpMyAdmin.conf

<IfModule mod_authz_core.c>
  # Apache 2.4
  # Require local
  Require all granted
</IfModule>

ここで設定ファイルに「Require all granted」と記述しているが、意味がわからなかった。

Apache2.4からのアクセス制御

調べてみた所、Apache2.4からはアクセス制御の書き方が変わっており、従前の

<Location /admin>
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
</Location>

ではなく、Requireを使用して

<Location /admin>
  Require ip 127.0.0.1
</Location>

と書けるようになったらしい。

例のような特定のipからのアクセスのみを許可する場合は1行で書くことができ、Requireという単語から「ipが127.0.0.1であることを要求する」という意味を類推することが出来直感的で良い。

ただ、全て許可/拒否の記述をしたい場合は

# 全て許可
Require all granted

# 全て拒否
Require all denied

と記述する必要があり、これだと単語の意味から類推することが出来ず直感的ではないので、初見ではなんだこれ?となった。

Order

Apacheのアクセス制御をちゃんと理解する。に説明があったのだが、自分はこの記事を見るまでOrderがどんな意味を持っているのか知らなかった。(とりあえず決まり文句のように記述していた)

が、これを読んだ所「Order A,Bと記述されている場合、まずAの判定を行い真であるならばBの判定へ進む。Aの判定が偽であるなら処理を終了する」といったような動きをするらしい。

記事にあった例だと、

Order deny,allow
Deny from all
Allow from 127.0.0.1

の場合はローカルからのアクセスを許可だが、Orderの順番を入れ替えて

Order allow,deny
Deny from all
Allow from 127.0.0.1

と記述すると全てのアクセスを拒否してしまう、とのこと。

個人的には「Orderの順番に判断をしていき、後にした判断の方が優先される」といった意識でいればそれほど複雑には感じなかった。

例えば最初の例の場合は「全てのアクセスを拒否(Deny from all)するけれども、ローカルからのアクセスは許可(Allow from 127.0.0.1)する」、後の例の場合は「ローカルからのアクセスは許可(Allow from 127.0.0.1)するけれども、全てのアクセスを拒否(Deny from all)する」といったように日本語に置き換えればそうややこしくないのではないだろうか。

…あ、やっぱり後者は日本語として意味がわからないしやっぱ直感的じゃないですね。

また、この例は単純な例だからましとしても、複雑な例になると指数関数的にややこしくなっていきそうではある。

参考

Apache 2.4系でのモダンなアクセス制御の書き方
Apacheのアクセス制御をちゃんと理解する。