Requireディレクティブの概要

  • 認可(authorization) を制御するディレクティブ。「誰にアクセスを許可するか」を指定する
  • Require ディレクティブ本体と RequireAll / RequireAny / RequireNone コンテナは mod_authz_core が提供(各エンティティの判定は担当モジュールが行う)
  • Apache 2.4 で導入され、2.2 までの Order / Allow / Deny に代わる統一的なアクセス制御の仕組み

基本構文

Require [not] <エンティティ> [引数...]

エンティティ一覧(モジュール別)

エンティティ(引数)モジュール説明
all grantedmod_authz_core全て許可
all deniedmod_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-usermod_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>