* Apache2.4 のRequireディレクティブでアクセス制御を行う [#nf404a28] #setlinebreak(on); #contents -- 参考 https://httpd.apache.org/docs/2.4/ja/mod/mod_setenvif.html https://httpd.apache.org/docs/2.4/ja/mod/mod_authz_core.html#require ** 概要 [#scb63587] #html(<div style="padding-left:10px;">) Requireディレクティブや SetEnvIfディレクティブを使用して、様々な条件でアクセス制御を行う方法を記載する。 具体的には・・ SetEnvIf でリクエストヘッダフィールドやアクセス元のIPアドレス、アクセス先(URI)などの情報を元に環境変数を設定し、 Requireディレクティブで環境変数の定義有無によってアクセス制限をかける。 #html(</div>) ** Requireディレクティブ [#m7ade092] #html(<div style="padding-left:10px;">) https://httpd.apache.org/docs/2.4/ja/mod/mod_authz_core.html#require Apache2.4 では、Apache2.2 からアクセス制御の記述方法が大幅に変わっている。 例えば、特定のIPからのアクセスのみを許可する場合、Apache2.4では以下のように Requireディレクティブ を使用して記述する。 #html(<div style="vertical-align:top;min-width:300px;display:inline-block">) Apache2.2 #mycode2(){{ Order deny,allow deny from all allow from XXX.XXX.XXX.XXX }} #html(</div><div style="padding-left:10px;vertical-align:top;min-width:300px;display:inline-block">) Apache2.4 #mycode2(){{ <RequireAny> Require all denied Require ip XXX.XXX.XXX.XXX </RequireAny> }} #html(</div>) &br; |例||h |Require all granted|全てのアクセスを許可。| |Require all denied|全てのアクセスを拒否。| |Require [not] env env-var [env-var] ...|指定した環境変数が定義されていれば(not指定時は環境変数が定義されていなければ)アクセスを許可。&br;但し、後述する RequireAny 内では、not は使用できない。&br;※「negative Require directive has no effect in <RequireAny> directive」と怒られる。| |Require method http-method [http-method] ...|HTTPメソッドが指定されたものである場合はアクセスを許可。| |Require valid-user|有効なユーザーの場合はアクセスを許可。(Basic認証等)| |Require ip 10 172.20 192.168.2 |クライアントのIPアドレスが指定されたものである場合はアクセスを許可。| など。 #html(</div>) ** RequireAny | RequireAll | RequireNone ディレクティブ [#m152023a] #html(<div style="padding-left:10px;">) RequireAny、RequireAll、RequireNone の各ディレクティブを使用して複数条件の AND、OR を設定する事ができる。 また、RequireAny|All|None を省略した場合は RequireAny として動作する。 |ディレクティブ名|説明|h |RequireAny|いずれかの条件にマッチする場合はアクセスを許可する。| |RequireAll|全ての条件にマッチする場合のみアクセスを許可する| |RequireNone|いずれかの条件にマッチする場合はアクセスを拒否する| #html(</div>) ** SetEnvIfディレクティブ [#fcca944e] #html(<div style="padding-left:10px;">) https://httpd.apache.org/docs/2.4/ja/mod/mod_setenvif.html#SetEnvIf リクエストの属性に基づいて環境変数を定義する。 |構文|h |SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...| ・attribute には、リクエストヘッダフィールド や Remote_Host など規定されている項目名、環境変数などが指定できる。 ・regex には正規表現を指定する。※attribute に指定したデータとこの正規表現でマッチングさせる。 ・3つ目のフィールドにはマッチした場合に設定する環境変数名を指定する。 環境変数名の前頭句に ! を指定した場合は、定義済みの環境変数を削除する。 env-variable=value のように、環境変数に値を指定する事も出来る。(value未指定時は"1") #html(</div>) ** 設定例 [#xc44bad0] #html(<div style="padding-left:10px;">) *** 設定例の利用シーン [#x8fe515b] #html(<div style="padding-left:10px;">) ・多くのフォルダがあり、個別のフォルダに .htaccess を設定するのが難しい場合 ・基本的には制限をかけたいが、特定のディレクトリ配下のみ制限をかけたくない場合 ・サーバ処理でルーティングを行なっている為、各サブフォルダの実体が無くて.htaccess が設置出来ない場合 #html(</div>) *** 特定のURIのみBasic認証をかける [#mcc6e864] #html(<div style="padding-left:10px;">) #myhtml2(){{ AuthType Basic AuthName "Please Input user name and password" AuthUserFile /path_to_www/.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> }} #html(</div>) *** 特定のURIのみBasic認証をかけない [#w346a50f] #html(<div style="padding-left:10px;">) #myhtml2(){{ AuthType Basic AuthName "Please Input user name and password" AuthUserFile /path_to_www/.htpasswd SetEnvIf Request_URI "^/noauth-dir/*" allow_page <RequireAny> Require env allow_page Require vaild-user </RequireAny> <Files ~ "^\.(htaccess|htpasswd)$"> Require all denied </Files> }} #html(</div>) #html(</div>)