Requireディレクティブの概要
- 認可(authorization) を制御するディレクティブ。「誰にアクセスを許可するか」を指定する
Require ディレクティブ本体と RequireAll / RequireAny / RequireNone コンテナは mod_authz_core が提供(各エンティティの判定は担当モジュールが行う)
- Apache 2.4 で導入され、2.2 までの
Order / Allow / Deny に代わる統一的なアクセス制御の仕組み
基本構文
Require [not] <エンティティ> [引数...]
エンティティ一覧(モジュール別)
| エンティティ(引数) | モジュール | 説明 |
|---|
| all granted | mod_authz_core | 全て許可 |
| all denied | mod_authz_core | 全て拒否 |
| env 環境変数 | mod_authz_core | 指定した環境変数が設定されていると許可 |
| method httpメソッド | mod_authz_core | 指定したhttpメソッドに合致すると許可 |
| expr 表現 | mod_authz_core | 指定した表現に合致すると許可 |
| ip IPアドレス(範囲) | mod_authz_host | 指定したアドレス(範囲)を許可 |
| host ホスト名 | mod_authz_host | 指定したホスト名を許可 |
| user ユーザ名 | mod_authz_user | 指定したユーザを許可 |
| valid-user | mod_authz_user | 正常に認証されたユーザを許可 |
| group グループ名 | mod_authz_groupfile | 指定したグループを許可 |
モジュールの覚え方
mod_authz_core … 基本(all / env / method / expr)
mod_authz_host … ネットワーク系(ip / host)
mod_authz_user … 認証ユーザ系(user / valid-user)
mod_authz_groupfile … グループファイル系(group)
否定(not)
Require not <エンティティ> で条件を否定する。
- 注意:
not は単独では使えない。必ず <RequireAll> または <RequireNone> の中に置く必要がある
- ただし
<RequireNone> の中では通常 not は書かない(コンテナ自体が否定するため Require host evil.example.com のまま一致=拒否になる)。明示的に not を書くのは <RequireAll> の中
複数条件の結合コンテナ
| ディレクティブ | 説明 | 論理 |
|---|
<RequireAll> | 全ての条件に合致したら真 | AND |
<RequireAny> | いずれかの条件に合致したら真 | OR |
<RequireNone> | 全ての条件に合致しなかったら真 | NOR(どれにも合致しなければ許可) |
補足
- コンテナを使わず
Require を複数並べた場合、デフォルトは <RequireAny>(OR)扱い。
- コンテナは入れ子(ネスト)可能。
<RequireNone> は単体では「許可(真)」を作れず、否定にしか効かないブラックリスト専用。Require all granted があっても、<RequireNone> に一致した相手は弾かれる。
設定例
# 特定IP範囲のみ許可
<Directory "/var/www/secure">
Require ip 192.168.1.0/24
</Directory>
# 認証済みユーザ全員を許可
Require valid-user
# AND条件: 認証済み かつ 社内ネットワークからのアクセス
<Directory "/var/www/admin">
<RequireAll>
Require valid-user
Require ip 192.168.1.0/24
</RequireAll>
</Directory>
# 全許可しつつ特定ホストだけ除外(not は RequireAll 内)
<RequireAll>
Require all granted
Require not host evil.example.com
</RequireAll>