[ 先頭 | 上へ | 前へ | 次へ | 目次 | 索引 ]

Readme for analog3.90beta2

フォームインタフェースと CGI プログラム

フォームインタフェースは、analog に対して HTML のフロントエンドを提供します。これは、ユーザが環境設定ファイルを作成しないで、web ページからオプションを選択できることを意味します。

重要: セキュリティの理由 から、analog を CGI プログラムとして走らせないように、あるいは他の web ファイルや CGI プログラムと一緒のディレクトリやフォルダーに入れておかないように気をつけてください。フォームインタフェースが analog を走らせる時に、analog が危険なオプションを与えられていないかどうかを確認します。この確認が無いと、あなたのシステムは、外部からの攻撃に対し無力になるでしょう。

analog が完全に設定されて、それ自身で適切に動作するまで、フォームの設定をしないで下さい。そうしないと、問題個所の発見に余計な、複雑な要因を付け加えるだけになります。analog とは異なり、フォームインタフェースは、"規格外" の動作を しません 。この章をよく読み、どのようにして環境設定するかを理解してください。

フォームインタフェースは、普通のユーザが使用するのに適していますが、システム管理者あるいは他の専門家が設定する必要があります。設定するためには、web サーバが動いていないといけません。CGI プログラムが何たるか、またそれらの動作許可を適切に設定する方法もを知らなければなりませんし、HTML フォームを書く方法も知る必要があります。この章の残りは、これらの知識を前提として話を進めます。また、Perl 5.001 かそれ以降のバージョンも持っているものとします。他のシステムに必要な事柄については、下記の 技術的な詳細 を参照すること。 ( 実際には、Windows を使用しており、Perl を持っていないときには、役立つソフトのページ からフォームインタフェースの実行版をダウンロードできます。)

注意: CGI プログラムは、セキュリティの抜け道を含み得る。それを使って、破廉恥なユーザがあなたのシステムを破壊するかもしれない。 ( もしこの事実を知らなければ、あなたは CGI プログラムを全く使ってはいけません。WWW のセキュリティについての FAQCGI のセキュリティについての FAQ を最初によく読んで理解してください。) このフォームインタフェースはできるだけ安全に作成した積りですが、完全に保証はできません。最高に注意深く設計された CGI プログラムでさえ、偶然にセキュリティのバグを含むことがあります。もし何か起こっても、私は責任を取れません。自分の責任に於いて使用してください。 ( ライセンス を読んでください。) 更に、もしパスワードのような特別な防御をしないか、特別なホスト名に対して anlgform.pl を制限しない限り、フォームインタフェースを設定することは、インターネット上の誰にも analog を実行させることを、ログファイルを解析可能にすることを意味していることに注意すべきである。この章の終わりの部分に、このプログラムについての セキュリティ設計についてのノート がもう少し書かれています。

フォームインタフェースは、2つの部分からなっている。オプションを選択するフォーム( anlgform.html と呼ばれている)と、それらを analog に渡す CGI プログラム( anlgform.pl と呼ばれている)である。動作させる前に、anlgform.htmlanlgform.pl の両方共に、あなたのシステム用に設定 しなければならない 。この設定方法についての説明は、両方のファイルの先頭部分に書かれている。

プログラムと一緒に配布されているフォームは、フォームの一例とみなしてください。英語以外の言語のフォームは、lang ディレクトリにあります。あるいは、もし希望するなら、自分自身のフォームを書くこともできます。実際には、フォームは全く必要とされません。もし、単に CGI プログラム (anlgform.pl) にリンクを張ることだけが望みなら、通常の様に URL の中でクエスチョンマークの後に渡される引数を書けば、それで動作します。


analog の殆ど全ての環境設定コマンドが、フォーム中にその名前の要素を含めば、指定することができます。例えば、ログファイル名を選択する要素を付け加えたい時には、以下の様に書きます。
ログファイル名: <input type=text name="LOGFILE">
または、以下のように書くこともできます。
<select name=LOGFILE size=1>
  <option value="/var/log/apache/fred"> Fred のログファイル
  <option value="/var/log/apache/jane"> Jane のログファイル
</select>

セキュリティあるいはパフォーマンスの理由から、フォームで指定できない幾つかのコマンドがあります。それら全ての一覧は、*LOGFORMATLANGFILEHEADERFILEFOOTERFILEUNCOMPRESSOUTFILECACHEOUTFILEERRFILEDNS それに SETTINGS です。そしてフォームを設定する人は、もっと付け加えることができます。これらを除外する理由について、またあなたが一覧に付け加えたいコマンドについては、以下の セキュリティについてのノート をご覧下さい。


幾つかのコマンドは、本当に便利なことに、2つに分割して指定することができる。最初に、2個の引数を持つコマンド(例えば、ALIASes )がある。これらは、COMMAND1COMMAND2 と呼ばれる2個のコマンドをフォームから送れば、簡単に取り扱うことができる。例えば、
元ファイル名: <input type=text name="FILEALIAS1">
別名: <input type=text name="FILEALIAS2">
このようにして、一対の引数を指定することだけができる。そのため、例えば、同じ ALIAS に対していくつかの別名を指定する方法は無い。

次に、FLOOR コマンドがある。もしこれらのコマンドを2つ、FLOORAFLOORB、に分けて指定すれば、これらのコマンドの文法をフォームの使用者が知らなくても済む。これらの2つのコマンドは一体となって働く。例えば、プログラムと一緒に配布されているフォームは、以下の様に指定している。

<br>最低
<input type=TEXT name="DOMFLOORA" maxlength=6 size=6>
<select name="DOMFLOORB">
  <option value=r>リクエスト
  <option value=p>ページへのリクエスト
  <option value=b selected>バイト
</select>
以上を持つ全てのドメインを含む
もし、DOMFLOORA5% かつ DOMFLOORBr であれば、DOMFLOOR 5%r がプログラムに送られる。 (または、もし、以下の様にフォームを送りたいならば、DOMFLOORA=5 かつ DOMFLOORB=%r も同様の結果となる。)
2, 3の analog 用でない余分のコマンドがあり、それらはフォームから送られる。最初に、もしオプション qv=1 が設定されると、analog は起動せずに、analog へ送られるはずの設定コマンドの一覧が画面上に出力される。CGI プログラムがきちんと動作していることを確認する意味で、これは役に立つ。これは、またユーザがフォームから環境設定ファイルを生成することができることを意味する。

2つ目は、特定の時に他の環境設定ファイルを読み込むことを指定できることである。analog が CGI プログラムによって呼ばれた時、初期環境設定ファイル を通常どおり読み込む。次に、cg という名前を持ったオプションにより指定された他の環境設定ファイルを処理する。次は、CGI プログラムが指定する他の全てのコマンドを処理する。その後、cm という名前をもったオプションにより指定された他の環境設定ファイルを処理する。最後に、通常の様に 強制的環境設定ファイル を処理します。 (従って、2個の analog を必要とするかもしれない。一つは、フォーム用でもう一つは、フォームを使わない時の analog であり、それぞれ異なる環境設定ファイルをコンパイルしてある。) 初期と強制的環境設定ファイル中のコマンドは、環境設定に寄与することに注意せよ。それらのうちいくつかは、フォームで指定されたオプションに取って代わる。例えば、初期環境設定ファイルが INCLUDE を含んでいると、これはフォームで指定される INCLUDEEXCLUDE コマンドに影響を与え、予期しない振る舞いをするかもしれない。


anlgform.pl は、通常コマンドを受け取った順に analog に送っており、その順番はフォームで受け取った順と同じはずである。しかし、幾つかの例外がある。最初に、同じ名前の全てのコマンドはまとめられる。従って、例えば、織り込むように入り組んで指定された INCLUDEs と EXCLUDEs は、順番通りには行かない。二つ目に、コマンドの名称は大文字小文字を区別しないが、同じ名前だが大小文字が異なるコマンドは、誤った順番を取ることがある。同じ大きさの文字を使用してください。3つめに、LOGTIMEOFFSET は、まず最初に送られる (それに従い、フォームで指定されるどのログファイルにも適用される)。

フォームが常に設定する数個のコマンドがある。これらは、あなたがどこかで設定したものに取って代わるでしょう。まず、(もし DNSFILE がフォームで設定されているなら) DNS READ かまたは(そうでない時) DNS NONE が設定される。この振る舞いを制限するには、強制的環境設定ファイルを使えばよいが、もしそうすると時間切れという問題がおそらく持ち上がるでしょう。2番目に、常に WARNINGS FL が設定される。これは、重要でない注意がサーバのエラーログに溜まらないようにするためである。これを抑えるためには、あからさまに WARNINGS コマンドをフォームの始めに書けばよい。


問題解決法

フォームインタフェースが動作しないわけには、いくつもの理由があり、それらを簡単には診断できない。もし問題が起きた時に、どうすればよいかを以下に述べる。

最初に、anlgform.pl をコマンドラインから走らせることができる。これは大部分の問題のバグを見つけるのに充分である。対のオプションを以下の様に指定できる。

anlgform.pl qv=1 LOGFILE=/some/log REQINCLUDE=pages
もし、上記の様に引数に qv=1 を含めると、anlgform.pl が何を analog に送ろうとしているのかを見ることができる。もし、qv=1 を含めないと、anlgform.pl は analog を走らせようとするだろう。

もしそれでも動かない時には、以下の点を確認してください。

  1. ファイルの上部に書いてあるように、anlgform.planlgform.html を編集しましたか。
  2. 他の CGI プログラムはあなたのサーバで動きますか。anlgform.pl は、 CGI プログラムとしてサーバにより認識され、正しい場所に配置されていますか。
  3. サーバのエラーログを見て手がかりを探してください。
  4. 全ての関連のあるファイル (analog 自身、ログファイル、環境設定ファイル、 ドメインファイルのような補助ファイル、...) は、あなたの web 上で 実行可能か読み込み可になっていますか。
  5. もし幾つかのフォームのオプションが効果を表さない時には、環境設定ファイル中 のコマンドにより取って代わられていないかどうか確認してください。
  6. もし長いこと待たされて何のデータも返されなかった時には、多分 analog が終了 する前に、サーバがリクエストに対して時間切れになったのでしょう。対策は、 時間切れの間隔を増やすことです。
  7. 上記で説明されたように、フォームは、常に DNS READDNS NONE、そして WARNINGS FL を設定し、初期設定ファイルの設定に取って代わってしまいます。

セキュリティについて

上記に述べたように、CGI プログラムは、しばしばいわゆるセキュリティホールをかかえています。フォームインターフェースが安全であるとは 保証しない が、私のベストを尽くして作りました。私の設計方針について説明します。これにたいするコメントはもちろん歓迎します。もし極秘にしたいときには、私宛に個人的に電子メールを analog-author@lists.isite.net 宛てに送ってください。

最初に、フォームインターフェースを誰が動かすことができるかを考えるべきである。パスワードで防御するか anlgform.pl を特別のホスト名に制限するという手段を取らない限り、あなたのサイトにフォームインターフェースを付加するということは、インターネット上の誰でもに analog を実行可能にし、ログファイルを解析可能にするという事を意味する。これは、システムに対するプライバシーと負荷に明らかに関係している。

ある種のコマンドは、anlgform.pl により無視され analog には渡されない。それらの一覧は、anlgform.pl の一番上に書かれている。それたいする理由は以下の通りである。HEADERFILEFOOTERFILE は、システム上のどのファイルも出力してしまう。*LOGFORMAT コマンドもまた、どのファイルも読まれてしまう。何故なら、誰かが各行に一つのファイル名を指定し、ファイル名の一覧を得ることができるからである。OUTFILECACHEOUTFILEERRFILE は、ファイルシステムに他人が書き込むことを許してしまう;ERRFILE ははまた、エラーをエラーログに溜めずに、どこかへ飛ばしてしまうことも可能である。UNCOMPRESS は、ユーザにどんなコマンドも実行可能にさせてしまう。DNS の使用は、これを READ よりも高い設定にすると、通常プロセスを時間切れにしてしまうので、禁止している。

上記のどれも削除してはならない (本当に、本当にあなた以外の誰も anlgform.pl を走らせることが完全に不可能であると確信していない限り)。初期設定で禁止されているもう2つのコマンドがあるが、これらは禁止の一覧から除外することもできる。SETTINGS が禁止の一覧に含まれている理由は、システム上の幾つかのファイルの位置を移動するためである。しかし、診断するためには有用であり、もしフォームを設定する上で問題が起きた時、一時的に除外することを考えても良い。もう一つのコマンドは、私はより危険が少ないと考えるが、LANGFILE が含まれている。このコマンドが含まれている理由は、別ファイルが言語ファイルと全く同じ行数であり、言語ファイルとして受け付けられて、出力にそのファイルの一部分が紛れ込むことが理論的にありうるからである。しかし、まずファイルは全く同じ長さでなければならない。もしこのような危険に対し充分対処できると考えるなら、LANGFILE を一覧から除外できる。

一覧に付け加えたい他のコマンドがある。例えば、(やや起こりそうも無いことではあるが)以下のことは理論的に可能である。システム上の別ファイルが、analog が解析できるログ形式に充分一致しており、その内容を漏らしてしまうことがありうる。これについて心配し、フォームからはただ一つの特別なログファイルのみを解析しようとするなら、LOGFILE コマンドを禁止リストに付け加えることができる。同様の理由から、DOMAINSFILE も付け加えられる。また、もし全ての CONFIGFILECMCG を付け加えない限り、ユーザがシステム上のどの環境設定ファイルも使えるということに注意すべきである。


CGI のセキュリティ問題について知っている人たちにたいする、私の設計方針についての技術的なコメントがある。anlgform.pl は、-T オプションを付けられて動作する。これは、analog をパイプを通して開き、従って、analog の標準入力に引数を渡す。ユーザが指定したデータは、open() 関数ではなく、パイプを通してのみ渡される。

LOGFILECACHEFILE コマンドの引数は、ある許可された文字 (特に、文字、10進数、/\.:_ スペース、それに2つの{文字、10進数、下線}の間の - ) のみ含んでいるかどうかチェックされる。これは、圧縮コマンドが popen() 関数を使って使用されたとき、文字列が UNCOMPRESS コマンドと一致して、シェルに渡されてしまうかもしれないからである。

これを除いて、コマンド名は文字と10進数、1と2、だけを含んでいるかどうか確認される。そして、コマンドの引数は、制御文字 (実際には文字コード 0-32 と 127-159;特に、新行文字は禁止されている ) を含まないように確認されている。コマンドの長さは、anlgform.pl ではチェックされていないが、環境設定コマンドの長さが、analog によりチェックされているので、バッファーのオーバーフローは問題にはなりません。

ところで、analog 自身を CGI プログラムとして使うべきではないと忠告する理由は、ある種のサーバー、特にマイクロソフトの IIS は、コマンドラインの引数を CGI プログラムに渡すことをユーザに許してしまうからである。それに、たとえプログラムが適切な CGI ヘッダーを返さないときでも、出力はユーザに戻され得る。これは、上記の全ての引数の確認は、妨害されることを意味する。もちろん、CGI プログラムにコマンドラインの引数を渡せないサーバー上では、同じようなセキュリティ上の問題は無い。しかし、もしどんな引数も渡せないなら、初期設定の出力しか得られないので、analog は、CGI プログラムとしてあまり有用ではない。


技術的詳細

Perl 5.001 かそれ以上のバージョンが使える必要がある (Windows を使い、役立つソフトのページ からフォームインターフェースの実行版をダウンロードしているならば、問題は無い)。Perl の最新版は、無料で www.perl.org から得られる。また、CGI.pm というモジュールが必要であり、Windows では、libwin32 というファイルから、Win32::Console というモジュールが必要である。しかし、これらは通常 Perl と一緒に配布されているはずである。

Windows では、Perl スクリプトが Perl によって実行されるためには、Perl の実行ファイルは、.pl という拡張子を付ける必要がある。

anlgform.pl は、フォームへの引数渡しに GET あるいは POST メソッドを受け付ける。HTML の仕様 によると、この場合の様に、プログラムを走らせるのに何も副作用がない時に、GET を使うべきであると述べている。しかし、別の HTTP の仕様 の 15.1.3 章によると、オプションの幾つかが秘密に扱われるべき時は、POST を使うべきであると述べている。また、多くのオプションが付いた非常に長い URL は、幾つかの古いサーバーで問題を引き起こす。従って、anlgform.html は、初期設定で POST メソッドを使う。しかし、GET メソッドを使っても動く。例えば、通常の GET の様に、?記号の後ろにオプションを指定して、anlgform.pl に普通のリンクを張ることもできる。


Stephen Turner
analog についての質問は analog-help の メーリングリスト を読んでください。

[ 先頭 | 上へ | 前へ | 次へ | 目次 | 索引 ]