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
Apache httpd 2.0/2.2では次のようにアクセス制御を設定していた。
Order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
Apache httpd 2.4
Apache httpd 2.4以降は、以下のようにアクセス制御の記述が変更になる。
<RequireAny>
Require all denied
Require ip xxx.xxx.xxx.xxx
</RequireAny>
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 | ディレクティブ内の、全ての条件にマッチしたときにアクセスを許可 |
RequireAny | ディレクティブ内の、いずれかの条件にマッチしたときにアクセスを許可 |
RequireNone | いずれかの条件にマッチする場合には、アクセスを拒否 |
RequireNoneだけが、拒否の条件を記述することになるので注意が必要である。
環境変数のセット SetEnvIf ディレクティブ
Require env で指定する環境変数は、SetEnvIf ディレクティブで設定する。
SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
詳しい設定方法は、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
<RequireAny>
Require env allow_page
Require vaild-user
</RequireAny>
<Files ~ "^\.(htaccess|htpasswd)$">
Require all denied
</Files>
特定IPアドレスかはBASIC認証でアクセスを許可
オフィスや拠点からのアクセスの時にはアクセスを許可し、それ以外のネットワークからのアクセスの場合にはBASIC認証で認証してアクセスを許可したい場合には、次のように記述する。
AuthType Basic
AuthName "Authentication Directory"
AuthUserFile /path/to/.htpasswd
<RequireAny>
Require valid-user
Require ip xxx.xxx.xxx.xxx
</RequireAny>