SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...

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 で上書きしていけるので、とても分かりやすくなる。

関連するメモ

コメント