9.9. アクセス制御の設定(mod_access)

Web サーバーで公開しているファイルやディレクトリを不正なアクセスから保護するためにクライアントからのアクセスを適切に制限することができます。アクセス制御の設定は、mod_access モジュールで提供される Allow、Deny、Order ディレクティブ、および Core モジュールで提供される AllowOverride、Option ディレクティブと、<Directory>、<Location>、<Files> などのディレクティブとを組み合わせることにより設定を行います。/etc/httpd/conf/modules には以下の記述があり、mod_access はデフォルトで読み込まれています。

LoadModule access_module       /usr/lib/httpd/modules/mod_access.so

以下では、アクセス制御に関連するディレクティブを解説します。これらのディレクティブを、<Directory>、<Location>、<Files>、<Limit> などのディレクティブの中に指定することで、特定のディレクトリやファイルに対するアクセス要求を制御することができます。

Options [+|-]option [[+|-]option] ...

サーバーの動作を制御するためのオプションを指定します。指定可能なオプションは以下の通りです。

表 9-6. Options ディレクティブ

option意味
Noneすべてのオプションを無効にします。
Allすべてのオプションを有効にします。
IndexesDirectoryIndex ディレクティブに指定されたファイルがない場合、ディレクトリをインデックスリストで表示します。
ExecCGICGI の実行を許可します。
IncludesSSI の実行を許可します。
IncludesNOEXECSSI の実行は許可しますが、#exec コマンドや CGI スクリプトの #include は禁止します。
FollowSymLinksシンボリックリンクを許可します。
SymLinksIfOwnerMatchシンボリックリンクとリンク先のファイルの所有者が一致した場合だけシンボリックリンクを許可します。
MultiViewsMultiViews を許可します。MultiViews とは、クライアントの Web ブラウザに言語設定がされている場合に、異なる Web ページを表示させる機能です。

+ や - の符号は、親ディレクトリの設定を変更するときに使用します。+ の符号は親ディレクトリの設定に追加され、- の符号は親ディレクトリの設定から削除されます。符号の指定がない場合は、指定したオプションで親ディレクトリの設定を置き換えます。例えば、以下のように指定されている場合、/var/www/html/data の下では ExecCGI は許可されますが、/var/www/html/data/list の下では拒否されます。その代わり、Indexes が許可されています。

<Directory /var/www/html/data>
    Options ExecCGI
</Directory>

<Directory /var/www/html/data/list>
    Options -ExecCGI +Indexes
</Directory>

Order ordering

Order ディレクティブでは、後述する Allow ディレクティブと Deny ディレクティブを組み合わせたアクセス制御設定を行った場合に、どの順番でこれらのディレクティブを適用するのかを指定します。ordering には以下の値が指定可能です。

表 9-7. Order ディレクティブ

ordering意味
allow,denyAllow ディレクティブが最初にチェックされます。もし、Allow ディレクティブの指定でアクセスが許可されると、Deny ディレクティブはチェックされません。Allow ディレクティブで許可されなかった場合は、Deny ディレクティブがチェックされ、Deny ディレクティブの指定とマッチすれば、アクセスは拒否されます。最終的にどちらのディレクティブにもマッチしなかった場合には、アクセスは許可されます。
deny,allowDeny ディレクティブが最初にチェックされます。もし、Deny ディレクティブの指定でアクセスが拒否されると、Allow ディレクティブはチェックされません。Deny ディレクティブで拒否されなかった場合は、Allow ディレクティブがチェックされ、Allow ディレクティブの指定とマッチすれば、アクセスは許可されます。最終的にどちらのディレクティブにもマッチしなかった場合には、アクセスは拒否されます。
mutual-failureAllow ディレクティブと Deny ディレクティブの両方を満たすホストからのアクセスを許可します。

Allow from all|host|env=env-variable [host|env=env-variable] ...

アクセスを許可するホストを指定します。指定可能なオプションは以下の通りです。

表 9-8. Allow ディレクティブ

all全てのアクセスを許可します。
hostドメイン名(exaple.com)、完全な IP アドレス(10.1.2.3)、IP アドレスの一部(10.1)、ネットワーク/サブネットマスク(10.1.0.0/255.255.0.0)を指定することができ、指定されたホストからのアクセスを許可します。
env=env-variablemod_setenvif モジュールにより提供される機能を利用してクライアントのリクエスト属性から環境変数を設定することができます。この環境変数を指定して、例えばブラウザの種類や Referer などの HTTP リクエストヘッダなど条件にマッチした場合に環境変数を定義します。ここで指定した環境変数が存在するときアクセスを許可します。

Deny from all|host|env=env-variable [host|env=env-variable] ...

アクセスを拒否するホストを指定します。指定可能なオプションは以下の通りです。

表 9-9. Deny ディレクティブ

all全てのアクセスを拒否します。
hostドメイン名(exaple.com)、完全な IP アドレス(10.1.2.3)、IP アドレスの一部(10.1)、ネットワーク/サブネットマスク(10.1.0.0/255.255.0.0)を指定することができ、指定されたホストからのアクセスを拒否します。
env=env-variablemod_setenvif モジュールにより提供される機能を利用してクライアントのリクエスト属性から環境変数を設定することができます。この環境変数を指定して、例えばブラウザの種類や Referer などの HTTP リクエストヘッダなど条件にマッチした場合に環境変数を定義します。ここで指定した環境変数が存在するときアクセスを拒否します。

AllowOverride All|None|directive-type [directive-type] ...

.htaccess ファイルによるアクセス権限の上書き許可を指定します。指定可能な値は以下の通りです。

表 9-10. Apache - AllowOverrideディレクティブ

All.htaccess のすべての設定を優先します。(規定値)
None.htaccess ファイルによる設定の上書きを拒否します。つまりファイルが存在しても参照しません。
AuthConfig認証に関するものだけを優先します。
FileInfoドキュメントタイプに関するものだけを優先します。
Indexesリスト表示に関するものだけを優先します。
Limitアクセス制御に関するものだけを優先します。
Options対象ディレクトリのみを制御する Options と XBitHack ディレクティブのみ優先します。

9.9.1. アクセス制御の設定例

以下では、アクセス制御に関連するディレクティブを使用した設定例を紹介します。

ディレクトリへのアクセス制御の例

以下の例は、/var/www/html ディレクトリに対するアクセス制御を設定しています。このディレクトリは、Turbolinux 10 Server の Apache で DocumentRoot として指定されているディレクトリです。デフォルトの /etc/httpd/conf/httpd.conf では以下のように Option ディレクティブにより、Indexes、FollowSymLinks のみが有効に設定されています。

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

URL へのアクセス制御の例

以下の例では、http://fully-qualified-domain-name/~turbolinux という URL に対するすべてのアクセスを禁止しています。

<Location /~turbolinux>
    Deny from all
</Location>

ファイルへのアクセス制御

以下の例では .ht で始まるファイルへのアクセスを禁止しています。

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

メソッドへのアクセス制御

<Limit> ディレクティブを使用すると、HTTP リクエストに含まれる POST や GET など、特定のメソッドに対するアクセス制御を指定することができます。以下の例では、/var/www/cgi-bin2 ディレクトリへの POST ができなくなります。

<Directory /var/www/cgi-bin2>
    <Limit POST>
        Order deny,allow
        Deny from All
    </Limit>
</Directory>

.htaccess によるアクセス制御

前述のように、<Directory> ディレクティブを使用して、特定のディレクトリに対するアクセス制御を指定することができます。しかし、/etc/httpd/conf/httpd.conf を編集できない一般ユーザーが自分の公開ディレクトリに対してアクセス制御を設定したい場合もあります。このようなときに使用できるのが、.htaccess ファイルです。システム管理者により /etc/httpd/conf/httpd.conf の AllowOverride ディレクティブで上書きを許可されているとき、ユーザー自身が該当のディレクトリ直下に .htaccess ファイルを作成し、/etc/httpd/conf/httpd.conf のアクセス制限設定を上書きすることができます。また、システム管理者は、ユーザーの指定する .htaccess ファイルに上書きを許可する内容を制限できますので、ユーザーの設定がすべて優先されるわけではありません。システム管理者は、セキュリティを考慮し、AllowOverride ディレクティブでユーザーが設定できるディレクティブを適切に制限しておく必要があります。

ティップ

.htaccess というアクセス制御用ファイルの名前は AccessFileName ディレクティブで設定されます。Turbolinux 10 Server の /etc/httpd/conf/httpd.conf には、初期設定で .htaccess が指定されています。

例えば、/var/www/html/secret ディレクトリ以下へのアクセスは組織内部(example.com)にあるホストからのみ許可したい場合、/etc/httpd/conf/httpd.conf には、以下のような設定を記述します。

<directory /var/www/html/secret>
        AllowOverride None
        order deny,allow
        deny from all
        allow from .example.com
</directory>

.htaccess ファイルで設定する場合は以下のように指定します。

最初に httpd.conf ファイルの AllowOverride ディレクティブで .htaccess ファイルが存在する場合の処理を指定します。以下の例では、アクセス制御に関する設定を有効にする Limit だけを指定しています。

<directory /var/www/html/secret>
        AllowOverride Limit
</directory>

次に、以下の .htaccess ファイルを /var/www/html/secret ディレクトリに配置します。

order deny,allow
deny from all
allow from .example.com