前提条件
- CentOS 7
- Apache HTTP Server 2.4
- ドキュメントルートを配置するディレクトリを
/www
と変更 /www/phpmyadmin
をドキュメントルートとしてIP制限をかけたい
現象
いつも通り Allow from xxx.xxx.xxx.xxx
の設定を追加しても、forbidden
のままでアクセスできず….
. . . DocumentRoot "/www/phpmyadmin" . . . <Directory "/"> AllowOverride None Require all denied </Directory> . . . <Directory "/www/phpmyadmin"> AllowOverride All Options All Order allow,deny Allow from xxx.xxx.xxx.xxx </Directory> . . .
原因
以下の条件の組み合わせ。
/
のアクセス制限Require all denied
が適用されたSatisfy
がデフォルト値 (Satisfy All
) となっていた
つまり、アクセス許可条件がイメージ的には下記の様になっていた。
Require all denied かつ Allow from xxx.xxx.xxx.xxx => 常にdenied
対策
対策1: ドキュメントルートを配置するディレクトリ ( /www
) のアクセス制限を全許可 ( Require all granted
) に変更する
<Directory "/www"> AllowOverride None Require all granted </Directory>
ちなみに、Apacheがデフォルト設定で、いつも通り /var/www
配下を使う場合は、同様の設定↓が最初から存在するので、ふつうはこんな現象は発生しない。
<Directory "/var/www"> AllowOverride None # Allow open access: Require all granted </Directory>
対策2: Allow from xxx.xxx.xxx.xxx
を記載するDirectoryセクションすべてに Satisfy Any
を追加する
<Directory "/www/phpmyadmin"> AllowOverride All Options All Order allow,deny Allow from xxx.xxx.xxx.xxx Satisfy Any </Directory>
だるい
補足
mod_access_compat の Satisfy ディレクティブ
Allow と Require の両方が使われているときの アクセスポリシーを設定します。
Require valid-user
Allow from 192.168.1.1
Satisfy Any
Apache2.4 では、Requireディレクティブ が拡張されていろんな制限ができるようになっているので、 “SatisfyはBasic認証とIP制限を同時に使うときの設定” みたいな認識だと、一瞬「ファッ」となる。
まぁ、 mod_access_compat
自体が互換性維持用の非推奨モジュールなので、とっとと mod_authz_core
とかの作法に書き換えましょう。