【Apache2.4】IP制限が効かねーぞゴラァ

前提条件

  • 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 とかの作法に書き換えましょう。