Apache httpd 2.4のアクセス制御

投稿者: | 6月 19, 2020

Apache httpd は、2.4系以降 .htaccess や httpd.confで記述するアクセス制御の記述方法が変わりました。

httpd 2.2などが動いている古いOSから httpd 2.4系にアップグレードしたときに、アクセス制御の記述方式によりエラーになったり、正しくアクセス制御ができないことがあります。

アクセス制御の記述の違い

Apache httpd 2.0/2.2と2.4では、次のように記述が異なります。

Apache httpd 2.0/2.2

Order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx

Apache httpd 2.4


  Require all denied
  Require ip xxx.xxx.xxx.xxx

Requireの記述

Require all granted 全てのアクセスを許可。
Require all denied 全てのアクセスを拒否。
Require [not] env [env-var] [env-var] … 指定した環境変数が定義されていればアクセスを許可。not を指定した場合には、指定した環境変数が提起されていた場合にアクセスを拒否。
RequireAny を指定した場合には、notを指定することはできない。
Require method [HTTP-METHOD] … 指定された HTTP-METHOD(メソッド)である場合にはアクセスを許可
Require valid-user BASIC認証などで認証が通り有効なユーザーの場合にはアクセスを許可。
Require ip [IPADDRESS] クライアントのIPアドレスが指定されたIPアドレスの場合にアクセスを許可

RequireAll | RequireAny | RequireNone

アクセス制御は、RequireAll, RequireAnym, RequireNone ディレクティブで、複数のRequire条件 を AND もしくは OR の指定ができます。

RequireAll (AND) ディレクティブ内の、全ての条件にマッチしたときにアクセスを許可
RequireAny (OR) ディレクティブ内の、いずれかの条件にマッチしたときにアクセスを許可
RequireNone いずれかの条件にマッチする場合には、アクセスを拒否

RequireNoneだけが、拒否の条件を記述することになるので注意が必要です。

環境変数のセット SetEnvIf ディレクティブ

Require env で指定する環境変数は、SetEnvIf ディレクティブで設定します。

SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...

SetEnvIfの使用例

SetEnvIf Referer “DOMAINNAME” refcheck=true 表示しているページのリファラーが DOMAINNAME からであれば refcheck 環境変数にtrueを設定する
SetEnvIf Request_URI “\.png$” pngfile アクセスしたURIが png画像ファイルの時に pngfile 環境変数にtrueを設定する

詳しい設定方法は、Apache httpd mod_setenvif のマニュアルを参照ください。

設定の例

ここからは、いくつかのケースで 設定方法を見ていきます。

全てのアクセスを許可する

全てのアクセスを許可するには、単純に以下の記述だけで問題ありません。
一般公開しているコンテンツなどは、.htaccess や Directory ディレクティブで、以下の設定を追加します。

Require all granted

特定のディレクトリにBASIC認証をかける

AuthType Basic
AuthName "Authentication Directory"
AuthUserFile /path/to/.htpasswd

SetEnvIf Request_URI "^/*" allow_page
SetEnvIf Request_URI "^/auth-dir/*" !allow_page


Require env allow_page
Require vaild-user



Require all denied

特定IPアドレスかBASIC認証でアクセスを許可

オフィスや拠点からのアクセスの時にはアクセスを許可し、それ以外のネットワークからのアクセスの場合にはBASIC認証で認証してアクセスを許可したい場合には、次のように記述します。

AuthType Basic
AuthName "Authentication Directory"
AuthUserFile /path/to/.htpasswd


  Require valid-user
  Require ip xxx.xxx.xxx.xxx



Require all denied