第9回 IP認証によるアクセス制限のテクニック

Webサイト(あるいはその一部)を特定のユーザーのみに公開したい場合がある。これを実現するのが「アクセス制限」だ。アクセス制限にはIP認証とユーザー認証の2種類があるが、今回はIP認証について解説する。

2001/9/29

Index
ApacheによるWebサーバ構築
Apacheでできるセキュリティ対策
 アクセス制限を実現する2つの方法
  Apacheのセキュリティ機能の構成要素と設定
 .htaccessファイルで制限可能な範囲の設定
 IP認証を定義する3つの要素と記述方法
 アクセス制限を行う範囲の指定
 .htaccessのアクセス制限記述方法

Apacheでできるセキュリティ対策

 Webサーバのセキュリティには、大別して2つのアプローチがある。1つは、ファイルシステムに対する不正な書き込みやサーバ上での不正なプログラム実行の防御。もう1つは、ファイルの不正な読み込み操作や送受信する内容の盗聴の防御である。

コラム WebサーバはWebサーバに徹するべし
 Apache以外の領域の話になるが、「WebサーバはWebサーバに徹するべし」といいたい。WebサーバとMailサーバを兼ねさせるだけでも危険を助長しているのに、ファイルサーバやクライアントとして利用するなどもってのほかである。そうした“兼務”はセキュリティを弱体化させ、不正なアクセスを試みるすきを与える。

 可能なら、コンテンツやサーバの管理もリモートアクセスではなく直接コンソールを使うべきとさえ考える。

 前者については、サーバ上の不要なプログラムの停止やファイアウォールの構築など、Apache以外の領域において行うべき対策ポイントである。

 後者こそが、Apacheの領域における問題となる。今回と次回は、この中でも特にファイルの不正な読み込み操作に焦点を絞ることにする。送受信する内容の盗聴については、それ以降に回を設けて解説したい。

アクセス制限を実現する2つの方法

 Webサーバは、不特定多数に情報を発信するのが使命である。しかし、場合によっては情報を発信する対象を限定する必要が生じる。例えば、会員制のコンテンツやビジネスパートナー限定の情報、社員にのみ公開する社外秘の情報などだ。

 そこで考えなくてはならないのが、Webサーバ上のコンテンツに対して個別のセキュリティを施し、限定された対象者にのみ情報を発信する方法である。これには、

  • アクセスする機器(クライアント)を特定、制限する方法
  • ユーザー名とパスワードの入力を要求するユーザー認証の方法

が考えられる。

 今回は、通信する機器(クライアント)を限定する方法について解説する。通信する機器を特定するには、ドメイン名(atmarkit.co.jpなど)やホスト名(www.atamrkit.co.jpなど)を用いる方法と、IPアドレス(172.16.0.5など)を用いる方法の2種類が考えられる。

コラム 「なりすまし」に注意
 いずれにしても注意しなければいけないのが、クライアントの「なりすまし」である。なりすましとはIPアドレスを偽る行為であり、これを行われてしまうと意図しない相手に対して正規のアクセスとしてコンテンツが提供されてしまう。

 「なりすまし」を防ぐのは容易ではないから、IP認証とともにユーザー認証(次回解説)を併用することをお勧めする。さらに、今後紹介する予定のSSLも利用すれば、なりすましに対しても強靭なセキュリティ環境を構築できる。

 どちらの方法でも構わないのだが、ドメイン名やホスト名を用いる場合には、それを特定するために「DNSの逆引き」と呼ばれる処理が必要になる。これは、Webサーバにアクセスするクライアントの情報がIPアドレスのみで、ドメイン名やホスト名は含まれないからである。ちなみに、ApacheではDNSの逆引き設定(HostNameLookupsディレクティブ)を変更しなくても、必要であれば自動的にDNSの逆引きを行うように作られている。

 変更される可能性のあるIPアドレスよりも、ホスト名やドメイン名を用いる方が運用しやすいのは事実ではある。しかし、アクセス数が多くなればなるほどDNSの逆引き処理に時間がかかるため、Webサーバにも負荷がかかる

Apacheのセキュリティ機能の構成要素と設定

 Apacheにおけるアクセス制限には、Apacheの設定ファイル(httpd.conf)を使う方法と、制限を設けたいディレクトリに「.htaccess」という名称のファイルを作成する方法の2種類がある。.htaccessには、そのディレクトリ以下のコンテンツ(サブディレクトリも含む)に対する制限を記述する。

/home
ichishi/
public_html
.htaccess
  images/
    icon.jpg
    cgi-bin/
    access.cgi
    members/
    .htaccess
    ……
図 .htaccessの影響範囲。.htaccessが置かれたディレクトリとそのサブディレクトリにも及ぶが、さらに.htaccessがある場合はそちらが使われる

 重要なことは、アクセス制限を行う設定ファイルはhttpd.confではなく.htaccessを使うこと。.htaccessの名前が限定されていること(httpd.confのAccessFileNameディレクティブで規定)。.htaccessによる制限の影響範囲は、そのディレクトリのコンテンツ(ファイル)だけでなくサブディレクトリに含まれるファイルにまで及ぶこと。サブディレクトリにさらに.htaccessが置かれている場合は、その内容が優先することである()。

 httpd.confにも記述できるのに、なぜディレクトリに.htaccessを用意するのだろうか? それは、.htaccessを使えばApacheの管理者以外に対してもコンテンツへのアクセス制限の管理を任せられるからである(編注)。

編注:もう1つ重要な点は、httpd.confに記述した場合は設定を変更するたびにApacheの再起動が必要だが、.htaccessであればApacheの再起動なしにアクセス制限の設定変更が可能なことにある。

 通常、Apacheの設定ファイルは限られた管理者によってのみ編集される。それに対し、Webサーバでコンテンツを公開するのは管理者だけとは限らない。特に、ユーザーディレクトリを利用して、多くのユーザーにコンテンツ配信を許可する場合、いちいちユーザーの要求に合わせてアクセス制限を設けてはいられない。各ユーザーに.htaccessファイルを作成・管理させれば、管理者は面倒から解放される。

.htaccessファイルで制限可能な範囲の設定

 各ディレクトリに.htaccessファイルを配置したアクセス制限を設ける場合、以下の点についても理解しておきたい。

 AllowOverrideディレクティブは、.htaccessファイルによるアクセス制限やディレクトリ固有の設定について、指定可能な範囲を制限する。このディレクティブには、5種類のオプションと、その5種類すべてを指定する「All」、すべてを不可にする「None」オプションがある。5つのオプションすべてを指定するのと、Allオプションを指定するのは同じであり、

AllowOverride All

と指定すれば、それは「.htaccessファイルで指定できるすべてのアクセス制限を利用する」ということである。

 All/None以外には、次のオプションがある。これらを複数指定する場合は、

AllowOverride Options Limit

のように、空白(半角スペース)で区切って記述する。

  • AuthConfig
    ユーザー認証に関する指定を可能にする。

  • FileInfo
    MIME-Typeの指定やエラードキュメントの指定など、ドキュメントタイプに関する指定を可能にする。

  • Indexes
    ファイル一覧の表示やファイル名が省略された場合にデフォルトで表示されるファイル名など、ディレクトリインデックスに関する指定を可能にする。

  • Limit
    アクセス制限を行うためのallowdenyorderの指定を可能にする。

  • Options
    オプション命令(Optionsディレクティブ)の指定を可能にする。

コラム .htaccessファイルへの読み込み制限の設定
 不正アクセスを試みようとする者に.htaccessファイルの内容を読み取られるのは望ましくない。しかし、.htaccessファイルはコンテンツと同じディレクトリに配置される。従って、何の防御策も施さなければ、コンテンツ・ファイルと同じように容易に読み取ることができてしまう。そうした事態を防ぐために、Apacheの設定ファイルには以下のように記述されている。

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

 これは、.htで始まるファイルについて、読み取りを拒否する設定である。最初から設定ファイルに記述されているはずだが、再度確認しておきたい。もし記述されていなかったり、「#」を先頭に付けてコメントアウトされているようなら修正して有効化すべきだ。

IP認証を定義する3つの要素と記述方法

 アクセス制限1つ設定するにも、理解しなければならない事柄は多い。しかし、IP認証に関する制限内容の記述は思いのほか簡単だ。「order」「allow」「deny」の3つさえ理解していれば、どのような制限も表現できる。

 orderは、その後に続くallow(許可)とdeny(拒否)の評価順を指定する。例えば、

order allow,deny

とすれば、allowを先に、denyを後に評価する。基本的にアクセスを拒否し、allowで明記されているアクセスを許可する。逆に、

order deny,allow

とあれば、denyを先に、allowを後に評価する。基本的にアクセスを許可し、denyの記述にマッチしたアクセスを拒否する。

 allowとdenyの使い方も難しくはない。

allow from 許可する対象

と記述するか、または

deny from 拒否する対象

と記述する。例えば、atmarkit.co.jpドメインからのアクセスのみを許可するなら、

allow from .atmarkit.co.jp

とするわけだ。また、すべての対象からアクセスの許可/拒否を行う場合は

allow from all

または

deny from all

と記述できる。

 上記の内容を総合すると、atmarkit.co.jpドメインからのアクセスのみを許可(それ以外からのアクセスは拒否)する場合、以下の3行で表現できる。

order deny,allow
deny from all
allow from .atmarkit.co.jp

 ここではドメイン名を使った認証を例にしたが、ホスト名やIPアドレスで指定することもできる。その場合は、ドメイン名の部分を置き換えればいい。

 もう1つ付け加えるなら、複数のドメイン名やIPアドレスを指定する方法だろう。対象を複数にするには、それに応じて複数の行を記述することになる。例えば、atmarkit.co.jpとtis.co.jpからのアクセス、さらに192.168.1.*(つまりイントラネット)からのアクセスを許可する場合、記述する内容は以下のとおりになる。

order deny,allow
deny from all
allow from .atmarkit.co.jp
allow from .tis.co.jp
allow from 192.168.1.

アクセス制限を行う範囲の指定

 制限内容の記述は理解できたとしても、問題は、その記述をどこに書けばいいのか、ということである。ファイルとしてはhttpd.confと.htaccessの2種類があることはすでに説明したが、それらのファイルにどう記述すればいいのかを明確にしていない。

 まず、httpd.confへの記述について解説しよう。httpd.confは、Apacheで構築されるWebサイト全体の設定をつかさどる。従って、このファイルにアクセス制限を記述するには、その制限対象を明確にしなければならない。

 httpd.confでアクセス制限を設定できる対象は、以下の3つである。

1.実ディレクトリ

 実ディレクトリに対する設定は、<Directory></Directory>ディレクティブに記述する。このディレクティブは、

<Directory "/usr/local/apache/htdocs">

のようにディレクトリ名を指定するが、

<Directory />

という指定は全ディレクトリ共通の設定(デフォルト設定)として用いられる特別な記法だ。

 実ディレクトリを指定した制限の設定は.htaccessファイルを用意することに等しく、ディレクトリ単位でのアクセス制限に有効である。

 例えば、/usr/local/apache/htdocsというディレクトリ以下に対してアクセス制限を設けるならば、以下のように記述する。

<Directory "/usr/local/apache/htdocs">
    order deny,allow
    deny from all
    allow from .atmarkit.co.jp
</Directory>

2.仮想ディレクトリ

 実ディレクトリに対して設定するのと同様に、仮想ディレクトリに対しても設定を行うことができる。この場合には、<Location></Location>ディレクティブを用いる。仮想ディレクトリの場合は、制限対象を直感的に把握するのが実ディレクトリよりも難しいものの、仮想ディレクトリに対するマッピングの変更に影響を受けない利点がある。

 この場合の記述方法は、<Directory>ディレクティブと同様なので、サンプルについては省略する。

3.ファイル

 ファイル単位でのアクセス制限も可能で、<Files></Files>ディレクティブを用いる。このディレクティブを普通に指定すると、サイト全体に共通する設定となる。ただし、<Directory>ディレクティブや<Location>ディレクティブの中に記述することで、特定のディレクトリ内のみを対象とすることもできる

 例えば、次のように記述すれば、/usr/local/apache/htdocsというディレクトリ以下の、拡張子が画像形式(gif、jpeg、jpg、png)のファイルのみを対象にすることができる。

<Directory "/usr/local/apache/htdocs">
  <Files ~ "\.(gif|jpe?g|png)$">
    order deny,allow
    deny from all
    allow from .atmarkit.co.jp
  </Files>
</Directory>

 このように、<Files>ディレクティブにおけるファイルの指定には「正規表現」を用いる。もちろん、特定のファイル名を指定することもできるが、この例のように正規表現を用いる場合の方が多いだろう。

.htaccessのアクセス制限記述方法

 .htaccessに制限を設定する場合、ディレクトリを明確にする必要はない。なぜなら、.htaccessファイルを保存したディレクトリ以下が対象になることは、わざわざ指定しなくても明白だからである。従って、.htaccessファイルにおいては、必要であれば<Files>ディレクティブを用いて対象となるファイルを指定する以外あり得ない。

 <Files>ディレクティブでファイル単位の制限を行う必要がなければ、以下のように直接制限内容を記述する。

order deny,allow
deny from all
allow from .atmarkit.co.jp