セキュリティ

ウェブサーバのパフォーマンスの向上よりも、 セキュリティ重視の方針で可能な限りセキュリティに配慮した実装を行っています。 具体的には次のような対策をしています。

バッファオーバフロー対策

できるだけ動的にメモリを確保するように malloc(3),asprintf(3)などを積極的に利用。 また、境界チェックを行う strncpy(3) などを利用し、バッファ溢れを防止しています。

クロスサイトスクリプティング対策

入力された URI 内のメタキャラクタ「< > & "」および 「' ( )」を出力時に 「&lt; &gt; &amp; &quot;」および 「&#39; &#40; &#41;」に変換します。 ただし、QUERY_STRING に相当する部分は変換していません。 本対策は、ウェブサーバ内部での使用時にのみ適用されます。

変換例その1

http://server/foo.html<script>悪意あるコード</script> は、 http://server/foo.html&lt;script&gt;悪意あるコード&lt;/script&gt; に変換されます。

変換例その2

http://server/foo.html%3Cscript%3E悪意あるコード%3C/script%3E は、 http://server/foo.html&lt;script&gt;悪意あるコード&lt;/script&gt; に変換されます。

変換例その3

http://server/cgi-bin/foo.cgi?<script>悪意あるコード</script> は、変換されません。 つまり、環境変数 QUERY_STRING には、 <script>悪意あるコード</script> がそのまま設定されます。

これは、CGIプログラム作成者の方でどのように QUERY_STRING を利用するかが、 想定できないためです。 CGIプログラム作成者は環境変数の利用には十分注意してください。

SSIにおけるシェルのメタ文字対策

SSI の <!--#exec cmd="〜"--> を利用すると、 ユーザはシステム内の任意のコマンドを実行できます。 Wyvern では、 &;`'\"|*?~<>^()[]{}$\n\r のシェルのメタ文字を含む命令は実行されません。 同時に、SecurityLog で指定されたファイルにコマンドを記録します。

SSLを利用した安全なユーザ認証

Wyvern では、現在、Basic認証機能しか提供していませんが、 認証データを MD5 符号化し、dbm により管理しています。 通常の crypt() を使った符号化とテキストファイルによる管理よりは、 安全性が向上します。また、SSL による暗号化通信も利用可能なので、 Basic認証でも SSL と組み合わせれば従来の方法よりも、 安全なユーザ認証が可能となります。

SuExec機能を用いたCGIプログラムの実行メカニズムの提供

CGIコマンドなどの外部プログラムを呼び出して実行する場合、 Wyvern では CGI プログラムの所有者権限で実行する SuExec 機能を提供しています。 これにより、セキュリティ上の危険を軽減することが可能となります。

シンボリックリンクのチェック

デフォルトの設定では、シンボリックリンクファイルは ServerRoot および DocumentRootUserDir 内のファイルに制限されています。 シンボリックリンクファイルにアクセスした場合は、 以下のように必ずセキュリティログに記録されます。

[Sun, 27 Jan 2002 06:47:54 GMT] request URI '/mrtg.html' is an unsecure symbolic file '/usr/local/share/doc/mrtg/index.html'.
[Sun, 27 Jan 2002 06:53:19 GMT] request URI '/top.html' is a symbolic file 'cover.html'

シンボリックリンクのチェックを行いたくない場合は、 FollowSymLinks の値を「off」にするか、 コメントアウトしてください。 また、設定ファイルである wyvern.conf がシンボリックリンクファイルの場合は、 wyvern 自体が起動できないので注意してください。

セキュリティレベルによる機能制限

設定ファイル(wyvern.conf)の SecureLevel で設定した値に応じてセキュリティレベルを設定します。 レベルは0〜7まで存在し、レベル0が一番脆弱でレベル7が最も安全です。 設定したレベルまでのすべての制約が適用されます。 デフォルトはレベル2です。

level0制限無し
level1root/wheel での起動を禁止します
level2 一時作業ディレクトリおよびログファイルの所有者とグループとパーミッションを User/Group で指定した値に変更します
level3 すべてのシンボリックリンクファイルへのアクセスを禁止します
level4 動的にページを作成するモジュールの使用を禁止します
level5 UserDir で指定したユーザページへのアクセスを禁止します
level6 全モジュールの使用を禁止します
level7 バーチャルホストの使用を禁止します

セキュリティログ機能の実装

設定ファイル(wyvern.conf)の SecurityLog で指定したログファイルに次の情報を記録します。

その他

その他のセキュリティ機能としては、次のような制限を設けています。