Apache HTTP Server: Security Tips 日本語訳

「Apache HTTP Server: Security Tips」 は、The Apache Software Foundation が、 http://httpd.apache.org/docs/misc/security_tips.html で公開しております。2001/10/14 時点で公開されていたドキュメントを futomi が日本語化したものです。Windows 上で Apache を利用する際の理解に役立てれば幸いです。なお、緑色で記載された文章は、futomi が注釈として加筆したものです。また、一部、直訳ではなく、意訳した部分がございます。原文と表現がことなることがございますので、ご了承ください。

注意: この日本語訳は、futomi が Windows 版 Apache の理解を深めるために、自分なりに日本語にしたものです。本日本語訳には、翻訳上の誤りがある可能性があります。したがって、内容について一切保証をするものではありません。正確さを求める場合には、必ず原文を参照してください。当方は、この文書によって利用者が被るいかなる損害の責任を負いません。

もし誤りなどを見つけたら、こちらからご連絡いただければ幸いです。


Apache HTTP Server Version 1.3
Security Tips for Server Configuration

ウェブサーバのセットアップにおける、セキュリティー問題に関するヒントや忠告を掲載しています。いくつかの提案は一般的な話ですが、その他は Apache 特有の話です。

ServerRoot ディレクトリのパーミッション

典型的な運用では、Apache は root ユーザの権限で起動され、アクセスがあると、User ディレクティブで定義されたユーザに切り替わります。root で実行されるコマンドと同様に、root でないユーザによる変更から守られるということに注意しなければいけません。ファイルは、root だけに書き込み権限を与えるべきです。ディレクトリや、すべての親ディレクトリもしかりです。たとえば、もしあなたが /usr/local/apache を ServerRoot に指定したとすると、次のようなコマンドを使って、root 権限でそのディレクトリを作成するということになります。

mkdir /usr/local/apache
cd /usr/local/apache
mkdir bin conf logs
chown 0 . bin conf logs
chgrp 0 . bin conf logs
chmod 755 . bin conf logs
/, /usr, そして /usr/local が、root に書き込み権限のみあると仮定します。実行可能な httpd をインストールしたときには、同様に保護されます。
cp httpd /usr/local/apache/bin
chown 0 /usr/local/apache/bin/httpd
chgrp 0 /usr/local/apache/bin/httpd
chmod 511 /usr/local/apache/bin/httpd

あなたは、他のユーザに書き込み権限がある htdocs のサブディレクトリを作る事ができます。-- root は、そこから外のファイルを決して実行せず、その中にファイルを作るべきではないからです。

root でないユーザに、root が実行または書込するファイルを編集できるようにするなら、あなたは、あなたのシステムを root の妥協に開くことになります。例えば、あなたが次回にそれを起動するために、誰かが httpd バイナリを置き換えることができるとしたら、それは、任意のコードを実行するでしょう。もしログディレクトリが(root でないユーザによって)書き換え可能だとすると、誰かは symlink を使って、ログファイルを他のシステムファイルに置き換えることができてしまうのです。そして、root は任意のデータでそのファイルを上書きしてしまうかもしれません。もしログファイル自身が(root でないユーザによって)書き換え可能だとすると、誰かはログファイル自身を偽のデータに書き換えてしまうことができるかもしれません。

Server Side Includes

Server Side Includes (SSI) は、サーバ管理者にいくつかの潜在的なセキュリティーリスクをもたらします。

第一のリスクとして、サーバのロードが増加してしまうという点です。すべての SSI 実行可能なファイルは、Apache によって、そのファイル内に SSI ディレクティブが含まれているかどうかを解析されます。このロード増加は小さいものの、共有されたサーバ環境では、莫大なものになり得ます。

SSI ファイルも、一般的に、CGI スクリプトに関連ずけられた同じリスクを引き起こします。"exec cmd" を使うと、SSI 実行可能なファイルは、httpd.conf で設定されたように、Apache を実行するユーザとグループのパーミッションに基づき、CGI スクリプトやプログラムを実行することができます。それは、あきらかに、サーバ管理者に躊躇させます。

SSI ファイルが提供する利益を利用する一方、SSI ファイルのセキュリティーを高める方法があります。

不安定な SSI ファイルが引き起こし得るダメージを隔離するために、サーバ管理者は、CGI in General section で説明されているように、suexec を利用することができます。

拡張子が .html や .htm のファイルに SSI を許可すると危険になりうります。これは、特に、共有され、高いトラフィックのサーバ環境において、真実味を増します。SSI が許可されたファイルは、慣習的に使われる .shtml のように、それ専用の拡張子にすべきです。これは、サーバロードを最小限に抑え、リスク管理を簡単にすることに寄与します。

その他の解決策は、SSI ページから、スクリプトやプログラムを実行させないようにすることです。これをするためには、Opution ディレクティブで IncludesIncludesNOEXEC に置き換えます。もし、これらのスクリプトが、ScriptAlias ディレクティブによって指定されたディレクトリに存在するなら、ユーザは、まだ、 <--#include virtual="..." --> を、CGI スクリプトを実行させるために使っているかもしれないことに注意してください。

Non Script Aliased CGI

ユーザに対して、どのディレクトリでも CGI スクリプトを実行できるようにすることは、次の事を考慮すべきです。

  1. あなたは、あなたのユーザが、故意にせよ偶然にせよ、アタックに対してシステムをさらけ出すスクリプトを書かないと、信用できるかどうか。
  2. あなたは、一つ以上の潜在的なセキュリティーホールを無関係にするほど、他のエリアで弱くなるよう、あなたのサイトのセキュリティーを考慮しているかどうか。
  3. あなたは、ユーザを持っておらず、誰もあなたのサーバを訪れないかどうか。

Script Aliased CGI

CGI を特定のディレクトリに限定することは、それらディレクトリの中に行くことに関して、管理者制御を与えます。これは、必然的に、non script aliased CGI より安全です。しかし、そのディレクトリに書き込み権限を持つユーザが信用されている場合や、管理者が潜在的なセキュリティーホールを見つけるために、各新しい CGI スクリプトやプログラムを試験したいと思う場合に限ります。

ほとんどのサイトは、non script aliased CGI アプローチに関して、このオプションを選択します。

CGI in General

常に、あなたは自分自身の能力を信じ、故意であれ偶然であれ、CGI スクリプト/プログラムの作者、もしくは、CGI の潜在的なセキュリティーホールを見つけられなければいけないことを忘れないで下さい。

すべての CGI スクリプトは、同じユーザ権限で実行されるため、それらは他のスクリプトと(偶然もしくは故意に)コンフリクトする可能性を秘めています。例えば、ユーザ A は、ユーザ B のことが嫌いだとします。ユーザ A はユーザ B の CGI データベースを削除するスクリプトを書けてしまうのです。Apache 1.2 から含まれている suEXEC を使えば、スクリプトを別々のユーザ権限で実行されるようにすることができるのです。Apache サーバコードで特殊なフックから呼び出されます。他にも、有名な方法として、CGIWrap があります。

システム設定を守る

厳しい環境で動作させるためには、サーバ利用者に、あなたが設定したセキュリティ機能を上書きすることができてしまう .htaccess ファイルのセットアップをさせたくないでしょう。これは、そのひとつの方法です。

サーバの設定ファイルに、

<Directory />
  AllowOverride None
  Options None
  Allow from all
</Directory>

と設定すると、特定のディレクトリに対しての設定となります。

これは、指定されたディレクトリを除き、すべてのディレクトリ内のすべての上書き、インクルード、アクセスを停止します。

Protect Server Files by Default

時折誤解される Apache の一面として、デフォルトのアクセスの機能があります。つまり、あなたがそれを変更するステップを踏まない限り、もしサーバが通常の URL マッピングルールを通してファイルへの道を見つけたなら、それはクライアントにそれを提供することができます。

例えば、次のような例を考えてみてください。

  1. # cd /; ln -s / public_html
  2. http://localhost/~root/ にアクセスする

これは、クライアントに、ファイルシステム全体を見せることになってしまうのです。これに対処するために、あなたのサーバの設定に、次のブロックを加えてください。

 <Directory />
     Order Deny,Allow
     Deny from all
 </Directory>

これは、ファイルシステムのロケーションへのデフォルトアクセスを禁止します。あなたが望むエリアにだけアクセスを許可するには、適切な <Directory> ブロックを加えてください。例えば、

 <Directory /usr/users/*/public_html>
     Order Deny,Allow
     Allow from all
 </Directory>
 <Directory /usr/local/httpd>
     Order Deny,Allow
     Allow from all
 </Directory>

<Location><Directory> の相互作用に特に注意してください。例えば、たとえ、<Directory /> がアクセスを拒否していたとしても、<Location /> ディレクティブはそれを覆すかもしれません。あなたが Apache 1.3 以上を使っているなら、私達は、あなたがサーバの設定ファイルに次の行を加えることを強くお勧めします。

UserDir disabled root

他にも有益なセキュリティー tips があれば、是非、problem report に書き込んで、Apache Group に送ってください。もし Apache のソースコード自身にセキュリティーバグを見つけたと確信されたら、是非、私たちにお知らせください