Requireディレクティブ:アクセスの許可や拒否などのアクセス制限を行う

Apache ではディレクトリやファイルに対してアクセス元の IP アドレスやホスト名を対象としたアクセス制限を行うことができます。記述の仕方が Apache 2.2 以前と Apache 2.4 以降で大きく変わっており、 Apache 2.4 以降では Require ディレクティブを使ってアクセスを許可するか拒否するかの設定を記述します。ここでは Require ディレクティブを使って Apache 2.4 以降の方式でアクセス制限を行う方法について解説します。

※ Apache 2.4 の環境で Allow や Deny を使ったアクセス制限を記述する方法については「Apache2.4でOrder/Allow/Denyディレクティブを利用する」を参照されてください。

(Last modified: )

Requiredディレクティブを使ったアクセス制限の設定手順

それでは Apache でアクセス制御を設定する手順です。最初に対象のディレクトリやファイルを指定します。ディレクトリを対象とする場合は Directory ディレクティブ、ファイルを対象とする場合は Files ディレクティブなどを使います。

<Directory d:/pg/Apache/Apache24/htdocs>
  ...
  ...
</Directory>

<Files ".png">
  ...
  ...
</Files>

※ Directory ディレクティブの使い方については「Directoryディレクティブ/DirectoryMatchディレクティブ:設定が適用されるディレクトリを指定する」、 Files ディレクティブの使い方については「Filesディレクティブ/FilesMatchディレクティブ:設定が適用されるファイルを指定する」を参照されてください。

続いて Require ディレクティブを使ってどのようなアクセスを許可するのか、または逆にアクセスを拒否するのかを記述していきます。例えば指定したディレクトリへのアクセスをすべて許可する場合は次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  Require all granted
</Directory>

Require ディレクティブを記述できる場所は Directory, .htaccess です。 .htaccess で設定する場合は AllowOverride AuthConfig が設定されている必要があります。

Require ディレクティブではいろいろな書式が用意されており、目的に応じて使い分けます。それでは順に Require ディレクティブで利用可能な書式について見ていきます。

すべて拒否する(Require all denied)

すべてのアクセスを拒否するには Require all denied を使用します。書式は次の通りです。

Require all denied

httpd.conf ファイルにはデフォルトで次のように記述されています。

<Directory />
  Require all denied
</Directory>

ルートディレクトリ以下のすべてのディレクトリに対してすべてのアクセスを拒否しています。この設定だけだと Apache で公開しているコンテンツへもアクセスができないため、別の設定でドキュメントルート以下のすべてのディレクトリに対してすべてのアクセスを許可する設定を行っています。

すべて許可する(Require all granted)

すべてのアクセスを許可するには Require all granted を使用します。書式は次の通りです。

Require all granted

httpd.conf ファイルにはデフォルトで次のように記述されています。

Define SRVROOT "d:/pg/Apache/Apache24"

<Directory "${SRVROOT}/htdocs">
  Require all granted
</Directory>

ドキュメントルート以下のすべてのディレクトリに対してすべてのアクセスを許可しています。この設定によって Apache で公開しているすべてのコンテンツに対して外部からアクセスが可能となっています。

指定のIPアドレスからのアクセスを許可する(Require ip)

指定した IP アドレスからのアクセスだった場合にアクセスを許可するには Require ip を使用します。書式は次の通りです。

Require ip IPアドレスA [IPアドレスB] ...
Require not ip IPアドレスA [IPアドレスB] ...

指定した IP アドレスからのアクセスの場合はアクセスを許可します。複数の IP アドレスが指定されている場合はいずれかの IP アドレスにマッチすればアクセスを許可します。なお not を先頭につけた場合は逆に指定の IP アドレスからのアクセスを拒否します。

IP アドレスの指定方法には次のようなものがあります。

完全な指定:
Require ip 192.168.0.1
Require ip 10.1.1.5

一部の指定:
Require ip 192.168.0
Require ip 10

Net Mask または CIDR での指定:
Require ip 172.16.0.0/255.255.0.0
Require ip 172.16.0.0/16

例えばアクセス元の IP アドレスの最初の 3 組の数字が 192.168.4 だった場合にアクセスを許可するには次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  Require ip 192.168.4
</Directory>

指定のホスト名からのアクセスを許可する(Require host)

指定したホスト名からのアクセスだった場合にアクセスを許可するには Require host を使用します。書式は次の通りです。

Require host ホスト名A [ホスト名B] ...
Require not host ホスト名A [ホスト名B] ...

指定したホスト名からのアクセスの場合はアクセスを許可します。複数のホスト名が指定されている場合はいずれかのホスト名にマッチすればアクセスを許可します。なお not を先頭につけた場合は逆に指定のホスト名からのアクセスを拒否します。

クライアントのホスト名は次のように取得します。アクセス元の IP アドレスを逆引きしホスト名を取得します。そしてホスト名を正引きして元の IP アドレスと一致するか確認します。一致した場合に IP アドレスを逆引きしたものをクライアントのホスト名として比較します。

一致するかどうかは Require host ディレクティブで指定したホスト名がクライアントのホスト名の後ろの部分が一致するかどうかで判断します。ただしドット(.)で区切られた名前が一致する必要があります。例えば example.com を指定した場合 host.example.com はマッチしますが hostexample.com のように名前の一部だけが一致する場合はマッチしませんのでご注意ください。

Require host example.jp
〇 example.jp
〇 host.example.jp
✕ hostexample.jp
✕ javadrive.jp

Require host .jp
〇 example.jp
〇 host.example.jp
〇 javadrive.jp
✕ example.com

例えばアクセス元のホスト名が example.com で終わる名前だった場合にアクセスを許可するには次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  Require host example.com
</Directory>

指定の環境変数が定義されていれば許可する(Require env)

指定した環境変数が定義されている場合にアクセスを許可するには Require env を使用します。書式は次の通りです。

Require env 環境変数A [環境変数B] ...
Require not env 環境変数A [環境変数B] ...

指定した環境変数が定義されていればアクセスを許可します。複数の環境変数が指定されている場合はいずれか一つでも定義されていればアクセスを許可します。なお not を先頭につけた場合は逆に環境変数が定義されていればアクセスを拒否します。

例えば環境変数 my_referral が定義されている場合だけアクセスを許可するには次のように記述します。( SetEnvIf ディレクティブはリクエストの属性に基づいて環境変数を設定するディレクティブです)。

<Directory d:/pg/Apache/Apache24/htdocs>
  SetEnvIf Referer www\.example\.com my_referral
  Require env my_referral
</Directory>

※ SetEnvIf ディレクティブの使い方については「SetEnvIfディレクティブ:リクエストに含まれる情報に基づいて環境変数を設定する」を参照されてください。

指定のHTTPリクエストメソッドであれば許可する(Require method)

リクエストが指定した HTTP リクエストメソッド を使っている場合にアクセスを許可するには Require method を使用します。書式は次の通りです。

Require method HTTPメソッドA [HTTPメソッドB] ...
Require not method HTTPメソッドA [HTTPメソッドB] ...

指定した HTTP リクエストメソッドが使われていればアクセスを許可します。複数の HTTP リクエストメソッドが指定されている場合はいずれか一つが使われていればアクセスを許可します。なお not を先頭につけた場合は逆に指定した HTTPリクエストメソッドが使われていたらアクセスを拒否します。

なお HTTP リクエストメソッドには GET / HEAD / POST / PUT / DELETE / CONNECT / OPTIONS / TRACE / PATCH などの種類があります。

例えば HTTP リクエストメソッドが GET の場合にだけアクセスを許可するには次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  Require method GET
</Directory>

条件式がtrueとなった場合に許可する(Require expr)

リクエストが指定した条件式で true となった場合にアクセスを許可するには Require expr を使用します。書式は次の通りです。

Require expr 条件式
Require not expr 条件式

指定した条件式が true となればアクセスを許可します。なお not を先頭につけた場合は逆に指定した条件式が true となった場合にアクセスを拒否します。

例えばユーザーエージェントが iPhone または Android とマッチする場合にアクセスを許可するには次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  Require expr %{HTTP_USER_AGENT} =~ /(iPhone|Android)/
</Directory>

ユーザーまたはグループを指定して許可する(Require user/Require group/Require valid-user)

特定のユーザーからのリクエストに対してアクセスを許可するには Require user を使用します。書式は次の通りです。

Require user ユーザーA [ユーザーB] ...

リクエストがあった時点で Basic 認証などを行いユーザーとして認証が通ったあと、 Require user に指定されているユーザー名と一致した場合にアクセスを許可します。

またユーザーが所属するグループを指定してアクセスを許可するには Require group を使用します。書式は次の通りです。

Require group グループA [グループB] ...

リクエストがあった時点で Basic 認証などを行いユーザーとして認証が通ったあと、ユーザーの所属しているグループが Require group に指定されているグループ名と一致した場合にアクセスを許可します。

有効なすべてのユーザーにアクセスを許可するには Require valid-user を使用します。書式は次の通りです。

Require valid-user

リクエストがあった時点で Basic 認証などを行いユーザーとして認証が通った場合にアクセスを許可します。

ユーザーまたはグループを使ったアクセス権限の設定については、別のページで詳しく解説します。

ローカルホストからのアクセスを許可する(Require local)

リクエストがローカルホストからのアクセスだった場合にアクセスを許可するには Require local を使用します。書式は次の通りです。

Require local

次のいずれかと一致する場合にローカルホストからのアクセスと判断されます。

・接続元 IP アドレスが 127.0.0.0/8
・接続元 IP アドレスが ::1
・サーバの IP アドレスと接続元 IP アドレスが同じ

※ 127.0.0.0/8 は IPv4 でのローカルホストを表すループバックアドレスです。 127.0.0.1 をはじめ 127.0.0.0/8 の IP アドレスはすべてループバックアドレスとなります。

※ ::1 は IPv6 でのローカルホストを表すループバックアドレスです。省略せずに記述すると 0000:0000:0000:0000:0000:0000:0000:0001 となります。

例えばローカルホストからのアクセスを許可するには次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  Require local
</Directory>

複数のRequiredディレクティブを組み合わせる

対象となるディレクトリやファイルに対して複数の Require ディレクティブを記述することができます。その場合に複数の条件を AND で判定するのか OR で判定するのかを指定するために RequireAll / RequireAny / RequireNone の 3 つのディレクティブが用意されています。

それでは 3 つのディレクティブの使い方について確認していきます。

いずれかの条件にマッチすればアクセスを許可(RequireAny)

複数記述した条件の少なくともいずれか一つにマッチした場合にアクセスを許可するには RequireAny を使用します。書式は次の通りです。

<RequireAny>
  ・・・
  ・・・
</RequireAny>

例えばアクセス元が 192.168.1 または 10.1 で始まる IP アドレスからのアクセスだった場合にアクセスを許可する場合は次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  <RequireAny>
    Require ip 192.168.1
    Require ip 10.1
  </RequireAny>
</Directory>

なお RequireAll / RequireAny / RequireNone のいずれも記述しなかった場合、 RequireAny ディレクティブで囲まれているとして扱われるため RequireAny ディレクティブは省略することができます。その為、先ほどの例は次のように記述することもできます。

<Directory d:/pg/Apache/Apache24/htdocs>
  Require ip 192.168.1
  Require ip 10.1
</Directory>

注意点として RequireAny ディレクティブのブロック内で Require not xxx のような not を付けた Require ディレクティブを記述すると、 Apache の起動時に次のようなエラーメッセージが出て起動することができません。

negative Require directive has no effect in <RequireAny> directive

すべての条件にマッチした場合だけアクセスを許可(RequireAll)

複数記述した条件のがすべてマッチした場合にアクセスを許可するには RequireAll を使用します。書式は次の通りです。

<RequireAll>
  ・・・
  ・・・
</RequireAll>

例えばアクセス元が 192.168.1 で始まる IP アドレスからのアクセスだけを拒否する場合は次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  <RequireAll>
    Require all granted
    Require not ip 192.168.1
  </RequireAll>
</Directory>

注意点として RequireAll ディレクティブのブロック内で Require not xxx のような not を付けた Require ディレクティブだけを記述すると、 Apache の起動時に次のようなエラーメッセージが出て起動することができません。 not を付けた Require ディレクティブを記述する場合は一緒に Require all granted を記述してください。

<RequireAll> directive contains only negative authorization directives

すべての条件にマッチしない場合にだけアクセスを許可(RequireNone)

RequireNone ディレクティブは RequireAll ディレクティブのブロック内でだけ使用可能なディレクティブで、 RequireNone ディレクティブのブロック内で記述した条件のいずれにもマッチしない場合にアクセスを許可します。書式は次の通りです。

<RequireAll>
  ・・・
  ・・・
  <RequireNone>
    ・・・
    ・・・
  </RequireNone>
</RequireAll>

例えばアクセス元が 192.168.1 または 10.1 で始まる IP アドレスからのアクセスだけを拒否する場合は次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  <RequireAll>
    Require all granted
    <RequireNone>
      Require ip 192.168.1
      Require ip 10.1
    </RequireNone>
  </RequireAll>
</Directory>

これは RequireAll だけを使って次のように記事した場合と同じです。

<Directory d:/pg/Apache/Apache24/htdocs>
  <RequireAll>
    Require all granted
    Require not ip 192.168.1
    Require not ip 10.1
  </RequireAll>
</Directory>

注意点として RequireNone ディレクティブを RequireAny ディレクティブのブロック内で記述したり、 RequireNone ディレクティブだけを単独で記述すると、 Apache の起動時に次のようなエラーメッセージが出て起動することができません。

<RequireNone> directive has no effect in <RequireAny> directive

-- --

Require ディレクティブを使って Apache 2.4 以降の方式でアクセス制限を行う方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。