Apache2.4のアクセス制御はRequireに統一するといい
問題
Apache2.2から2.4への移転で、元の .htaccess のIP制限やベーシック認証を持ってきたのですが、なんだか思ったように設定しづらいです。
答え
古い .htaccess だと、Order、Allow、Deny、Satisfy などを使って書かれていると思う。
Order Deny,Allow Deny from all Allow from xxx.xxx.xxx AuthType Basic AuthUserFile /var/www/example.com/.htpasswd AuthName "auth" require valid-user Satisfy any
Apache2.4 でこれらがまだ使えるのは、互換性のために用意された mod_access_compat モジュールのおかげ。
# apache2ctl -M Loaded Modules: core_module (static) ... ... access_compat_module (shared) ← これ ... ...
上の階層に .htaccess で Satisfy any など書かれていると、影響を受けて思ったような設定が難しくなる場合がある。
互換性モジュールのおかげで古い書き方がまだ使えるが、廃止していくとよい。
また、Apache2.4 のRequireは、より具体的なDirectoryや.htaccessでの設定があるとデフォルトではそちらで上書きされていくので、完全に Require で書き直したほうがすっきりする。
例)
/ は制限なし
/test/ はIP制限したい
/test/private/ はベーシック認証したい
→ それぞれの階層で Require で設定するだけ
# httpd.conf か / の .htaccess Require all granted
# /test/ の .htaccess Require ip xxx.xxx.xxx.xxx
# /test/private/ の .htaccess AuthType Basic AuthUserFile /var/www/example.com/.htpasswd AuthName "auth" Require valid-user
Apache2.4 のRequireは、いろんな表現もできるようになっているので、今まで複雑に書いていた設定が簡単に書ける。
例)プロキシ経由するので X-Forwarded-For を見たい。 SetEnvIf して環境変数をセットしてどうのこうの……
Require expr "%{HTTP:X-Forwarded-For} in { 'xxx.xxx.xxx.xxx', 'yyy.yyy.yyy.yyy' }"
もちろん SetEnvIf もできる。
SetEnvIf X-Forwarded-For xxx.xxx.xxx.xxx allowed_ip
SetEnvIf X-Forwarded-For yyy.yyy.yyy.yyy allowed_ip
Require env allowed_ip
でも Require expr だと IP を CIDR で書けたり、複数キーワードを in で列挙したりできるので便利。
→ https://httpd.apache.org/docs/2.4/ja/expr.html → ipmatch
AND条件は <RequireAll></RequireAll> で囲む。
例)IP制限なおかつベーシック認証
<RequireAll> Require ip xxx.xxx.xxx.xxx Require valid-user </RequireAll>
デフォルトは OR扱いなので以下はどちらも「~~ または ~~」
Require ip xxx.xxx.xxx.xxx Require valid-user
<RequireAny> Require ip xxx.xxx.xxx.xxx Require valid-user </RequireAny>
古い書き方(Allow、Denyなど)を混ぜなければ、単純に下の階層の Require で上書きしていけるので、とても分かりやすくなる。
コメント