Apache のセキュリティ処理フェーズ
Apache では、受け取ったすべての要求はフェーズを通過させて処理している。
Apache の各モジュールは、要求がそれぞれのフェーズを通過する際にそれらを処理することができるが、ほとんどのモ
ジュールが属するのは 1 つあるいは 2 つのフェーズだけだ。
Apache にはセキュリティ チェックに関係した 3 つの処理フェーズがあり、それらは次のような順序で移行する。
access_checker このフェーズでは強制アクセスのチェックが適用される。たとえば、
mod_access によって、クライアントの IP アドレスがドキュメントへのアクセスを許可されているか
どうかがチェックされる。
check_user_id これは認証フェーズだ。
mod_auth のような DAC モジュールにより、ユーザーの証明情報がデータベース中にあってそれが有効
かどうかがチェックされる。
auth_checker このフェーズでは承認が行われる。
mod_auth などのモジュールにより、上のフェーズで認証されたユーザーにドキュメントへのアクセス
が許可されているかどうかがチェックされる。
任意アクセス チェックを課すモジュールは、通常、後の 2 つのフェーズに加わっている。
基本認証とダイジェスト認証
ユーザー名とパスワードはどのようにしてネットワーク中を送信されるのだろうか? 2000 年初頭における状況は、あま
りいいとはいえないが、これはデータ送信に関する技術的な問題というよりは、哲学的な問題と言えるだろう。
現在、証明情報の受け渡しには、主に基本認証とダイジェスト認証という 2 つの方法がある。ダイ
ジェスト法は非常にセキュアな方法だが、残念なことに実際にはあまり使われていない。 Web 上でのほとんどの認証に
は、より低いセキュリティしか持たない基本認証のメカニズムが使われている。
基本認証では、ユーザー名とパスワードを base64 エンコードしたものをサーバーへ送信しているにすぎない。こ
れは、通信を傍受すればユーザー名とパスワードを知ることができるということだ。もちろん、それらの情報が正しく
て認証に成功しないと意味がないが。一方、ダイジェスト認証では、証明情報は容易にデコードできない方式で送信さ
れる。
ユーザー名とパスワードは基本認証のメカニズムではほとんど保護されておらず、複数の保護領域で、ユーザー情報
を格納するために使用される認証データベースは同じものが使われる。ダイジェスト認証メカニズムでは、証明情報が
有効な保護領域の名前がエンコードされるので、ダイジェスト法を使った保護領域では、それぞれ個別の認証データベ
ースをもつ必要がある。
Apache の構成時に任意制御を設定するには、AuthType 指示子が必要だ。設定は、より高
位のディレクトリや場所から継承されるが、継承される値はあらかじめ設定する必要がある。デフォルト値はない。
強制および任意制御の組み合わせ Satisfy 指示子
任意および非任意アクセス制御を組み合わせて使いたい場合もあるだろう。たとえば、ローカル ネットワークにいるユ
ーザーは自由にドキュメントへアクセスできるが、それ以外はユーザー名とパスワードを入力する必要がある、という
風に設定したいような場合だ。
このような設定を行うには Satisfy 指示子を使う。これは次のようなキーワードを 1 つとる。
All
Satisfy All 指示子が適用されるドキュメントにアクセスするには、クライアントはすべて
の非任意チェック (Allow や Deny 指示子) および任意チェック
(Require 指示子など) の両方にパスする必要がある。
Any
Satisfy Any 指示子が適用されるドキュメントにアクセスするには、クライアントは非任意
チェック (最初に行われる) または任意チェックのどちらかにパスすればいい。
たとえば次の設定では、ローカル ネットワーク (IP アドレスが 10.*.*.*) にいるクライアントは、
foo.html ページへ自由にアクセスできるが、それ以外の人にはすべて、ユーザー名とパスワードを要
求する。
Order Deny,Allow
Deny from All
Allow from 10.0.0.0/255.0.0.0
AuthName "Insiders Only"
AuthType Basic
AuthUserFile /usr/local/web/apache/.htpasswd-foo
Require valid-user
Satisfy Any
IP アドレスによるアクセス制限
>>