CentOS7 HTTPサーバ2.4系でアクセスの許可と拒否の書き方

シェアする

CentOS7から、Apache HTTPサーバのバージョンが2.4系になり、アクセスの許可と拒否の書き方が新しくなりました。
2.2系では、Orderディレクティブを使用していましたが、2.4系ではRequireディレクティブを使用するようになります。

Orderディレクティブ
https://httpd.apache.org/docs/2.4/ja/mod/mod_access_compat.html#order

Requireディレクティブ
https://httpd.apache.org/docs/2.4/ja/mod/mod_authz_core.html#require

基本的な書き方

基本的なアクセスの許可と拒否の書き方について、2.2系以前と2.4系以後を記載します。

・全ての接続元を許可

2.2系以前

Order Deny,Allow <= 拒否してから許可
Allow from all <= 全てのアクセスを許可

2.4系以後

<RequireAny> <= いずれかがマッチすれば真 (デフォルト)
  Require all granted <= 全てのアクセスを許可
</RequireAny>

・特定の接続元を許可

2.2系以前

Order Deny,Allow <= 拒否してから許可
Deny from all <= 全てのアクセスを拒否
Allow from 192.168.1.0/24 <= 192.168.1.0/24のアクセスを許可
Allow from 127.0.0.1/32 <= 127.0.0.1/32のアクセスを許可

2.4系以後

<RequireAny> <= いずれかがマッチすれば真 (デフォルト)
  Require ip 192.168.1.0/24 <= 192.168.1.0/24のアクセスを許可
  Require ip 127.0.0.1/32 <= 127.0.0.1/32のアクセスを許可
</RequireAny>

・特定の接続元を拒否

2.2系以前

Order Allow,Deny <= 許可してから拒否
Allow from all <= 全てのアクセスを許可
Deny from 192.168.1.0/24 <= 192.168.1.0/24のアクセスを拒否
Deny from 127.0.0.1/32 <= 127.0.0.1/32のアクセスを拒否

2.4系以後

<RequireAll> <= 全てがマッチすれば真
  Require all granted <= 全てのアクセスを許可
  Require not ip 192.168.1.0/24 <= 192.168.1.0/24のアクセスを拒否
  Require not ip 127.0.0.1 <= 127.0.0.1/32のアクセスを拒否
</RequireAll>

2.2系以前のアクセス制御設定の判りにくさ

2.2系以前のアクセス制御は、個人的にずっと判りにくいと思っていました。
下記は、間違いやすい単純な例です。

アクセス制御でよくあるのは、アプリケーションなどの管理画面をローカルのみアクセス許可としたい場合、2.2系以前では、下記のような設定となります。

<Directory /var/www/appadmin>
  Order Deny,Allow <= 拒否してから許可
  Deny from all
  Allow from 127.0.0.1
</Directory>

しかし、下記のような設定ミスをしてしまうと、全てをアクセス拒否という意味になってしまいます。

<Directory /var/www/appadmin>
  Order Allow,Deny <= 許可してから拒否
  Deny from all
  Allow from 127.0.0.1
</Directory>

これは、Deny fromとAllow fromの設定順序ではなくて、アクセス制御の評価順序は、Orderディレクティブに設定する内容で決まるという前提があるからです。
この例では、単純なものですが、複雑なアクセス制御となると、なかなか、人間の脳の動きに反する設定となります。(大げさか)

ちなみに、2.4系以後では、下記のような設定になります。

<Directory /var/www/appadmin>
  <RequireAny> <= デフォルトなので書いていない事が多い(っていうか普通?)
    Require ip 127.0.0.1
  </RequireAny>
</Directory>

シンプルで、非常に判りやすいですね。

2.4系以後のアクセス制御設定

現実としては、2.2系以前のApache HTTPを利用しているシステムがまだまだ多いと思いますし、そもそも、Apache HTTPベースの製品であったりすると、アクセス制御は、Orderディレクティブを使うのが前提になってたりします。

もし、2.4系以後の設定が使えるシステムであれば、2.2系以前の謎のアクセス制御を利用し続けるより、個人的には、早いうちに設定しなおすのが良いかと思っています。
(CentOS7にあるApache HTTPは、両方使えるようになっています。)

ここでは、2.4系以後のアクセス制御を行なうディレクティブと、いくつかのアクセス制御のサンプルをメモっておこうと思います。

  • <RequireAny> ... </RequireAny>

当該ディレクティブ内の条件でいずれかがマッチすれば真となる。(省略時のデフォルト動作)

  • <RequireAll> ... </RequireAll>

当該ディレクティブ内の条件で全てがマッチすれば真となる。

  • <RequireNone> ... </RequireNone>

当該ディレクティブ内の条件でいずれかがマッチすれば偽となる。

  • Require

具体的なアクセス制御について記述する。

色々なアクセス制御設定

いくつかのアクセス制御の設定について、ケースごとにメモします。

  • 無条件にアクセスを拒否する。
<Directory />
  Require all denied
</Directory>
  • 無条件にアクセスを許可する。
<Directory /var/www/html>
  Require all granted
</Directory>
  • ローカルからのみアクセスを許可する。
<Directory /var/www/appadmin>
  Require ip 127.0.0.1/32
</Directory>
 
もしくは、
 
<Directory /var/www/appadmin>
  Require ip local <= こっちの方が良いかも
</Directory>
  • 特定のIPアドレス範囲からのアクセスは拒否する。
<Directory /var/www/appadmin>
  Require not ip 192.168.2.0/24
</Directory>
  • 特定のHTTPメソッドのアクセスを許可する。
<Directory /var/www/request>
  Require method GET POST
</Directory>