<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Apache suEXEC Support</title>
</head>
<!-- English revision:1.24 -->
<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
<body
 bgcolor="#ffffff"
 text="#000000"
 link="#0000ff"
 vlink="#000080"
 alink="#ff0000"
>
<!--#include virtual="header.html" -->

<h1 align="center">Apache suEXEC Support</h1>

<ol>
        <li><big><strong>目次</strong></big></li>
        <li><a href="#what">suEXEC とは?</a></li>
        <li><a href="#before">始める前に</a></li>
        <li><a href="#model">suEXEC のセキュリティモデル</a></li>
        <li><a href="#install">suEXEC の設定とインストール</a></li>
        <li><a href="#enable">suEXEC の有効化と無効化</a></li>
        <li><a href="#usage">suEXEC の使用</a></li>
        <li><a href="#debug">suEXEC のデバッグ</a></li>
        <li><a href="#jabberwock">とかげに注意: 警告と事例</a></li>
</ol>

<h3><a name="what">suEXEC とは?</a></h3>
<p align="left">
Apache 1.2 で導入された <strong>suEXEC</strong> 機能により、
Apache ユーザは Web サーバを実行しているユーザ ID と
異なるユーザ ID で <strong>CGI</strong> プログラムや <strong>SSI</strong> 
プログラムを実行することができます。
CGI プログラムまたは SSI プログラムを実行する場合、通常は web サーバと
同じユーザで実行されます。
</p>

<p align="left">
適切に使用すると、この機能によりユーザが個別の CGI や SSI
プログラムを開発し実行することで生じるセキュリティ上の危険を、
かなり減らすことができます。しかし、suEXEC の設定が不適切だと、
多くの問題が生じ、あなたのコンピュータに新しい
セキュリティホールを作ってしまう可能性があります。
あなたが root に setuid されたプログラムと、それらから生じる
セキュリティ上の問題の管理に詳しくないようなら、suEXEC の使用を
検討しないように強く推奨します。
</p>

<p align="center">
<strong><a href="suexec.html">目次に戻る</a></strong>
</p>

<h3><a name="before">始める前に</a></h3>
<p align="left">
この文書の先頭に飛ぶ前に、Apache グループと
この文書での仮定を知っておくべきでしょう。
</p>

<p align="left">
第 1 に、あなたが <strong>setuid</strong> と 
<strong>setgid</strong> 操作が可能な UNIX 由来の
オペレーティングシステムを使っていることを想定しています。
これは、すべてのコマンド例にあてはまります。
その他のプラットホームでは、もし suEXEC がサポートされていたと
しても設定は異なるかもしれません。
</p>

<p align="left">
第 2 に、使用中のコンピュータのセキュリティに関する基本的な概念と、
それらの管理についてあなたが詳しいことを想定しています。
これは、<strong>setuid/setgid</strong> 操作、
あなたのシステム上でのその操作による様々な効果、
セキュリティレベルについてあなたが理解しているということを含みます。
</p>

<p align="left">
第 3 に、<strong>改造されていない</strong> suEXEC コードの
使用を想定しています。
suEXEC のコードは、多くのベータテスタだけでなく、開発者によっても
注意深く精査されテストされています。
それらの注意により、簡潔で信頼できる安全なコードの基盤が
保証されます。このコードを改変することで、予期されない問題や
新しいセキュリティ上の危険が生じることがあります。
セキュリティプログラミングの詳細に通じていて、
今後の検討のために成果を Apache グループと共有しようと思うので
なければ、suEXEC コードは変えないことを
<strong>強く</strong>推奨します。
</p>

<p align="left">
第 4 に、これが最後ですが、suEXEC を Apache のデフォルト
インストールに<strong>含めない</strong>ことが
Apache グループで決定されています。
これは、suEXEC の設定には管理者の詳細にわたる慎重な注意が必要
だからです。suEXEC の様々な設定について検討が終われば、
管理者は suEXEC を通常のインストール方法でインストールする
ことができます。これらの設定値は、suEXEC 機能の使用中に
システムセキュリティを適切に保つために、管理者によって
慎重に決定され指定されることが必要です。
この詳細な手順により、
Apache グループは、suEXEC のインストールについて、
注意深く十分に検討してそれを使用することを決定した場合に
限っていただきたいと考えています。
</p>

<p align="left">
それでも進みますか? よろしい。では、先へ進みましょう!
</p>

<p align="center">
<strong><a href="suexec.html">目次に戻る</a></strong>
</p>

<h3><a name="model">suEXEC セキュリティモデル</a></h3>
<p align="left">
suEXEC の設定とインストールを始める前に、まず
実装しようとしているセキュリティモデルについて
論じておきます。それには、suEXEC の内部で行なわれていること、
システムのセキュリティを保証するために警告されること
をよく理解しておいた方がよいでしょう。
</p>

<p align="left">
<strong>suEXEC</strong> は Apache web サーバから
<strong>suEXEC</strong> は、Apache web サーバから
呼び出される setuid された "wrapper" プログラムが基本となっています。
設計した CGI、または SSI プログラムへの HTTP リクエストが
あると、この wrapper が呼び出されます。
このようなリクエストがあると、Apache はそのプログラムが
実行される際のプログラム名とユーザ ID とグループ ID を指定して
suEXEC wrapper を実行します。
</p>

<p align="left">
それから、wrapper は成功または失敗を決定するため
以下の処理を行ないます。
これらの状態のうち一つでも失敗した場合、プログラムは失敗を
ログに記録してエラーで終了します。そうでなければ、
後の処理が続けられます。
</p>

<ol>
 <li><strong>wrapper が適切な数の引数で呼び出されたか?</strong>
  <blockquote>
   wrapper は適切な数の引数が与えられた場合に実行されます。
   適切な数の引数を受け取らなければ、攻撃をされたか
   あなたの Apache バイナリの suEXEC の部分が
   どこかおかしい可能性があります。
  </blockquote>
 </li>
 <li><strong>wrapper を実行しているユーザは
このシステムの正当なユーザか?</strong>
  <blockquote>
   これは、wrapper を実行しているユーザが
   本当にシステムの利用者であることを保証するためです。
  </blockquote>
 </li>
 <li><strong>この正当なユーザは wrapper の実行を許可されているか?</strong>
  <blockquote>
   このユーザは wrapper 実行を許可されたユーザですか?
   ただ一人のユーザ (Apache ユーザ) だけが、このプログラムの
   実行を許可されます。
  </blockquote>
 </li>
 <li><strong>対象のプログラムが安全でない階層の参照をしているか?</strong>
  <blockquote>
   対象のプログラムが '/' から始まる、または
   '..' による参照を行なっていますか? これらは許可されません。
   対象のプログラムは Apache の web 空間内になければなりません。
  </blockquote>
 </li>
 <li><strong>対象となるユーザ名は正当なものか?</strong>
  <blockquote>
   対象となるユーザ名は存在していますか?
  </blockquote>
 </li>
 <li><strong>対象となるグループ名は正当なものか?</strong>
  <blockquote>
   対象となるグループ名は存在していますか?
  </blockquote>
 </li>
 <li><strong>目的のユーザはスーパーユーザでは<em>ない</em>か?</strong>
  <blockquote>
   今のところ、suEXEC は 'root' による CGI/SSI プログラムの
   実行を許可していません。
  </blockquote>
 </li>
 <li><strong>対象となるユーザ ID は、最小の ID 番号よりも<em>大きい</em>か?
  </strong>
  <blockquote>
   最小ユーザ ID 番号は設定時に指定されます。
   これは、CGI/SSI プログラム実行を許可されるユーザ ID の
   とりうる最小値です。これは "system" 用のアカウントを
   閉め出すのに有効です。
  </blockquote>
 </li>
 <li><strong>対象となるグループはスーパーユーザのグループでは<em>ない</em>か?
  </strong>
  <blockquote>
   今のところ、suEXEC は 'root' グループによる CGI/SSI
   プログラムの実行を許可していません。
  </blockquote>
 </li>
 <li><strong>対象となるグループ ID は最小の ID 番号よりも<em>大きい</em>か?
  </strong>
  <blockquote>
   最小グループ ID 番号は設定時に指定されます。
   これは、CGI/SSI プログラム実行を許可されるグループ ID の
   とりうる最小値です。これは "system" 用のグループを
   閉め出すのに有効です。
  </blockquote>
 </li>
 <li><strong>wrapper が正常に対象となるユーザとグループになれるか?
  </strong>
  <blockquote>
   ここで、setuid と setgid の起動によりプログラムは対象となる
   ユーザとグループになります。グループアクセスリストは、
   ユーザが属しているすべてのグループで初期化されます。
  </blockquote>
 </li>
 <li><strong>プログラムが置かれるディレクトリは存在しているか?
  </strong>
  <blockquote>
   ディレクトリが存在しないなら、そのファイルも存在しない
   かもしれません。
  </blockquote>
 </li>
 <li><strong>ディレクトリが Apache のドキュメントツリー内にあるか?
  </strong>
  <blockquote>
   リクエストがサーバ内のものであれば、要求されたディレクトリが
   サーバのドキュメントルート配下にありますか?
   リクエストが UserDir のものであれば、要求されたディレクトリが
   ユーザのドキュメントルート配下にありますか?
  </blockquote>
 </li>
 <li><strong>ディレクトリを他のユーザが書き込めるようになって
  <em>いない</em>か?</strong>
  <blockquote>
   ディレクトリを他ユーザに開放しないようにします。
   所有ユーザだけがこのディレクトリの内容を改変できるようにします。
  </blockquote>
 </li>
 <li><strong>対象となるプログラムは存在するか?</strong>
  <blockquote>
   存在しなければ実行できません。
  </blockquote>
 </li>
 <li><strong>対象となるプログラムファイルが他アカウントから書き込めるようになって
  <em>いない</em>か?</strong>
  <blockquote>
   所有者以外にはプログラムを変更する権限は与えられません。
  </blockquote>
 </li>
 <li><strong>対象となるプログラムが setuid または setgid 
  されて<em>いない</em>か?</strong>
  <blockquote>
   UID/GID を再度変更してのプログラム実行はしません
  </blockquote>
 </li>
 <li><strong>対象となるユーザ/グループがプログラムのユーザ/グループと同じか?
  </strong>
  <blockquote>
   ユーザがそのファイルの所有者ですか?
  </blockquote>
 </li>
 <li><strong>安全な動作を保証するための環境変数クリアが可能か?</strong>
  <blockquote>
   suEXEC は、安全な環境変数のリスト
   (これらは設定時に作成されます) 内の変数として
   渡される安全な PATH 変数 (設定時に指定されます) を
   設定することで、プロセスの環境変数をクリアします。
  </blockquote>
 </li>
 <li><strong>対象となるプログラムを exec して実行できるか?</strong>
  <blockquote>
   ここで suEXEC が終了し、対象となるプログラムが開始されます。
  </blockquote>
 </li>
</ol>

<p align="left">
ここまでが suEXEC の wrapper におけるセキュリティモデルの標準的な動作です。
もう少し厳重に CGI/SSI 設計についての新しい制限や規定を
取り入れることもできますが、suEXEC はセキュリティに注意して
慎重に少しずつ開発されてきました。
</p>

<p align="left">
このセキュリティモデルを用いて
サーバ設定時にどのように許すことを制限するか、
また、suEXEC を適切に設定するとどのようなセキュリティ上の
危険を避けられるかに関するより詳しい情報については、
<a href="#jabberwock">"とかげに注意" (Beware the Jabberwock)</a>
 の章を参照してください。
</p>

<p align="center">
<strong><a href="suexec.html">目次に戻る</a></strong>
</p>

<h3><a name="install">suEXEC の設定とインストール</a></h3>
<p align="left">
ここから楽しくなります。Apache 1.2 あるいは <code>"src/Configure"</code> 
スクリプトで Apache 1.3 を設定するなら、suEXEC ヘッダファイルを編集して
バイナリを適切な場所に手作業でインストールしなければなりません。
この処理については <a href="suexec_1_2.html">別の文書</a>に
記載されています。以下の章では、AutoConf-style インタフェース
(APACI) を使った Apache 1.3 での設定とインストールに
ついて述べています。
</p>

<p align="left">
<strong>APACI の suEXEC 設定オプション</strong><br>
</p>

<dl>
<dt><code>--enable-suexec</code>
<dd>このオプションは、デフォルトではインストールされず、有効にはならない
    suEXEC 機能を有効にします。suEXEC を使うように APACI に
    要求するには、--enable-suexec オプションにあわせて
    少なくとも一つは --suexec-xxxxx オプションが指定
    されなければなりません。
<dt><code>--suexec-caller=<em>UID</em></code>
<dd>Apache を通常動作させる
    <a href="mod/core.html#user">ユーザ名</a>を指定します。
    このユーザだけが suexec の実行を許可されたユーザになります。
<dt><code>--suexec-docroot=<em>DIR</em></code>
<dd>Apache のドキュメントルートを設定します。
    これが suEXEC の動作で使用する
    唯一のディレクトリ階層になります (UserDir の指定は別)。
    デフォルトでは --datedir に "/htdocs" というサフィックスを
    つけたものです。"<code>--datadir=/home/apache</code>" 
    として設定すると、
    suEXEC wrapper にとって "/home/apache/htdocs" がドキュメント
    ルートとして使われます。
<dt><code>--suexec-logfile=<em>FILE</em></code>
<dd>suEXEC の処理とエラーが記録されるファイル名を指定します。
    (監査やデバッグ目的に有用)
    デフォルトではログファイルは "suexec_log" という名前で、
    標準のログファイルディレクトリ (--logfiledir) に置かれます。
<dt><code>--suexec-userdir=<em>DIR</em></code>
<dd>suEXEC がアクセスを許されるユーザホームディレクトリ配下の
    サブディレクトリを指定します。このディレクトリ以下の全実行
    ファイルは、"安全な" プログラムになるよう、suEXEC が
    そのユーザとして実行できるようにします。
    "単純な" UserDir ディレクティブを使っている場合
    (すなわち "*" を含まないもの)、これと同じ値を設定すべきです。
    Userdir ディレクティブがそのユーザのパスワードファイル内の
    ホームディレクトリと同じ場所を指していなければ、
    suEXEC は適切に動作しません。
    デフォルトは "public_html" です。
    <br>
    各 UserDir が異なった仮想ホストを設定している場合、
    それらを全て一つの親ディレクトリに含めて、その親ディレクトリの
    名前をここで指定する必要があります。
    <strong>このように指定されなければ
    "~userdir" cgi へのリクエストが動作しません。</strong>
<dt><code>--suexec-uidmin=<em>UID</em></code>
<dd>suEXEC の対象ユーザとして許される UID の最小値を指定します。
    大抵のシステムでは 500 か 100 が一般的です。
    デフォルト値は 100 です。
<dt><code>--suexec-gidmin=<em>GID</em></code>
<dd>suEXEC の対象グループとして許される GID の最小値を指定します。
    大抵のシステムでは 100 が一般的なので、デフォルト値としても 100 が使われています。
<dt><code>--suexec-safepath=<em>PATH</em></code>
<dd>CGI 実行ファイルに渡される安全な PATH 環境変数です。
    デフォルト値は "/usr/local/bin:/usr/bin:/bin" です。
</dl>

<p align="left">
<strong>suEXEC 設定の確認</strong><br>
suEXEC wrapper をコンパイルしてインストールする前に、
設定内容を --layout オプションで確認できます。
<br>
出力例:
</p>

<pre>
    suEXEC setup:
            suexec binary: /usr/local/apache/sbin/suexec
            document root: /usr/local/apache/share/htdocs
           userdir suffix: public_html
                  logfile: /usr/local/apache/var/log/suexec_log
                safe path: /usr/local/bin:/usr/bin:/bin
                caller ID: www
          minimum user ID: 100
         minimum group ID: 100
</pre>

<p align="left">
<strong>suEXEC wrapper のコンパイルとインストール</strong><br>
--enable-suexec オプションで suEXEC 機能を有効にすると、
"make" コマンドを実行した時に suEXEC のバイナリ (Apache 自体も) が
自動的に作成されます。
<br>
すべての構成要素が作成されると、それらのインストールには
 "make install" コマンドが実行できます。バイナリイメージの "suexec" は
--sbindir オプションで指定されたディレクトリにインストールされます。
デフォルトの場所は "/usr/local/apache/sbin/suexec" です。
<br>
インストール時には <em><strong>root</em></strong> 権限が
必要なので注意してください。
wrapper がユーザ ID を設定するために、
所有者 <em><code>root</em></code> での
セットユーザ ID ビットをそのファイルのモードに
設定しなければなりません。
</p>

<p align="center">
<strong><a href="suexec.html">目次に戻る</a></strong>
</p>

<h3><a name="enable">suEXEC の有効化と無効化</a></h3>
<p align="left">
起動時に、Apache は "sbin" ディレクトリで "suexec" を探します
 (デフォルトは "/usr/local/apache/sbin/suexec") 。
適切に設定された suEXEC がみつかると、エラーログに
以下のメッセージが出力されます。
</p>

<pre>
    [notice] suEXEC mechanism enabled (wrapper: <em>/path/to/suexec</em>)
</pre>

<p>
サーバ起動時にこのメッセージが出ない場合、大抵はサーバが
想定した場所で wrapper プログラムが見つからなかったか、
<em>setuid root</em> としてインストールされていないかです。
<br>
suEXEC の仕組みを使用するのが初めてで、Apache が既に動作中
であれば、Apache を kill して、再起動しなければなりません。
HUP シグナルや USR1 シグナルによる単純な再起動では不十分です。
<br>
suEXEC を無効にする場合は、"suexec" ファイルを削除してから
Apache を kill して再起動します。
</p>

<p align="center">
<strong><a href="suexec.html">目次に戻る</a></strong>
</p>

<h3><a name="usage">suEXEC の使用</a></h3>
<p align="left">
<strong>仮想ホスト:</strong><br>
suEXEC wrapper の使い方として、
<a href="mod/core.html#virtualhost">仮想ホスト</a>設定での
<a href="mod/core.html#user">User</a> ディレクティブと
<a href="mod/core.html#group">Group</a> ディレクティブ
を通したものがあります。これらのディレクティブを
メインサーバのユーザ ID と異なるものにすると、CGI リソース
へのすべてのリクエストは、その <code>&lt;VirtualHost&gt;</code> で
指定された <em>User</em> と <em>Group</em> として実行されます。
<code>&lt;VirtualHost&gt;</code> でそれらの
ディレクティブのどちらか、または両方が指定されていない場合、
メインサーバのユーザ ID が想定されます。
<p>
<strong>ユーザディレクトリ:</strong><br>
suEXEC wrapper は、リクエスト先のユーザとして CGI を実行するためにも
使えます。これは期待する実行権限のユーザ ID の前に、
"<strong><code>~</code></strong>" 文字を
置くことで実現されます。この機能を動作させるために必要なことは、
CGI をそのユーザで実行できること、そのスクリプトが
上記の<a href="#model">セキュリティ検査</a>を
パスできることです。

<p align="center">
<strong><a href="suexec.html">目次に戻る</a></strong>
</p>

<h3><a name="debug">suEXEC のデバッグ</a></h3>
<p align="left">
suEXEC wrapper は、上記で述べた --suexec-logfile オプションで
指定されたファイルにログ情報を記録します。
wrapper を適切に設定、インストールできていると思う場合、
どこで迷っているか見ようとするならこのログとサーバの
エラーログを見るとよいでしょう。
</p>

<p align="center">
<strong><a href="suexec.html">目次に戻る</a></strong>
</p>

<h3>
<a name="jabberwock">とかげに注意: 警告と事例</a>
</h3>
<p align="left">
<strong>注意!</strong>  この章は完全ではありません。
この章の最新改訂版については、
Apache グループの<a href="http://www.apache.org/docs/suexec.html">
オンラインドキュメント</a>版を参照してください。
</p>

<p align="left">
サーバの設定に制限をもうける wrapper について、
いくつか興味深い点があります。suEXEC に関する "バグ" を
報告する前にこれらを確認してください。
<ul>
        <li><strong>suEXEC の興味深い点</strong></li>
        <li>階層構造の制限
        <blockquote>
        セキュリティと効率の理由から、suEXEC の全てのリクエストは
        仮想ホストへのリクエストにおける最上位のドキュメントルート内か、
        ユーザディレクトリへのリクエストにおける個々のユーザの最上位の
        ドキュメントルート内に残らなければなりません。
        例えば、四つの仮想ホストを設定している場合、
        仮想ホストの suEXEC に有利なように、
        メインの Apache ドキュメント階層の外側に
        全ての仮想ホストのドキュメントルートを構築する必要があります。
        (例は後日記載)
        </blockquote>
        </li>
        <li>suEXEC の PATH 環境変数
        <blockquote>
        これを変更するのは危険です。この指定に含まれる各パスが
        信頼できるディレクトリであることを確認してください。
        世界からのアクセスにより、誰かがホスト上でトロイの木馬
        を実行できるようにはしたくないでしょう。
        </blockquote>
        </li>
        <li>suEXEC コードの改造
        <blockquote>
        繰り返しますが、何をやろうとしているか把握せずにこれをやると
        <strong>大きな問題</strong>を引き起こしかねません。
        可能な限り避けてください。
        </blockquote>
        </li>
</ul>

<p align="center">
<strong><a href="suexec.html">目次に戻る</a></strong>
</p>

<!--#include virtual="footer.html" -->
</body>
</html>
