mattintosh note

どこかのエンジニアモドキの備忘録

Apache 2.4とEC-CUBE 3系で管理画面にBasic認証を設定した場合に.htaccessや.htpasswd他が外部に漏洩する可能性

既に配布も終了している EC-CUBE 3 系ですが、たまに触る機会があって設定に問題ないかなとか見るのですが、とあることが気になって色々調べている最中に下記の記事を読ませていただきました。

qiita.com

EC-CUBE 3 系の .htaccess ですが、まさにこの記事通りで Apache 2.4 で下記のサンプル部分のコメントアウトを外して利用しようとすると .htaccess.htpasswd などの .ht で始まるファイルへのアクセス制限が上書きされたりサブディレクトリへのアクセス制限が上書きされるようです。(Apache2.2用とは書いていますが)

# 管理画面へのBasic認証サンプル(※Apache2.2用)
#
# Satisfy Any
#
# AuthType Basic
# AuthName "Please enter username and password"
# AuthUserFile /path/to/.htpasswd
# AuthGroupFile /dev/null
# require valid-user
#
# SetEnvIf Request_URI "^/admin" admin_path  # ^/adminは, 管理画面URLに応じて変更してください
# Order Allow,Deny
# Allow from all
# Deny from env=admin_path

原因としては記事の著者も書かれている通り mod_access_compat の Satisfy AnyRequire all denied の設定を上書きしてしまうからでしょう。Apache 2.4 からは .ht ファイルへのアクセスは Require all denied が使われています。

<Files ".ht*">
   Require all denied
</Files>

Satisfy Any & Allow from all はサブディレクトリに対しても効くようで、html/template/.htaccessRequire all denied で作成しても .htaccess を閲覧できてしまいますし、.htaccess ファイルだけなく .htaccess で設定したサブディレクトリの Require all denied の効果を無効にしてしまうようです。(その結果中が全部見れる)

ちなみに下記部分ですが、このままコメントアウトを外して使おうとすると SetEnvIf の 3 番目以降の引数は環境変数として設定されるので admin_path だけでなくそれ以降の文字列も環境変数になります。

# SetEnvIf Request_URI "^/admin" admin_path  # ^/adminは, 管理画面URLに応じて変更してください

phpinfo を見てみるとこのように設定されているのがわかります。(だから何ができるかってわけではないのですが)

話が逸れましたが Apache 2.4 で EC-CUBE 3 系を使用している場合は上記の罠を踏んでいないか注意した方がよさそうです。EC-CUBE 4.0.1 以降は RequireAll に変更されているのでこの問題は起きないと思われます。

EC-CUBE というよりは Apache の仕様なのですが何らかの理由で Satisfy Any を設定している場合はアクセス制限が正しく効いているか確認した方がいいでしょう。

もう mod_access_compat 使えないようにしたい…。