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

Analog 5.91beta1: フォームインタフェースと CGI プログラム


フォームインタフェースは、UNIX や Windows プラットフォーム(おそらくそれ以外のプラットフォームにも)に対して Analog の HTML のフロントエンドを提供します。これにより、ユーザは設定ファイルを作成しなくても、Web ページからオプションを選択することが可能になります。

重要: セキュリティ上の理由により、 Analog 自体を CGI プログラムとして動かさないように、また他の Web ファイルや CGI プログラムと同じディレクトリやフォルダに置いたままにしないように気をつけてください。フォームインタフェース経由で Analog を実行する際には、Analog に危険なオプションがわたされていないことが確認されます。このチェックがないとシステムに悪意ある攻撃に対する脆弱性が発生します。

フォームインタフェースは、一般的なユーザが使いやすいようになっていますが、専門家やシステム管理者による設定が必須です。これを設定するためには、Web サーバが実行されている必要があります。また CGI プログラムがどういったもので、Web サーバのどこに配置する必要があり、どのようにアクセス権を設定すればよいかといった点についても把握している必要があります。さらに HTML のフォームを記述する方法についても知っておく必要があります。この章では、こうした知識については知っているものとして説明を続けます。また Perl 5.001 以降のバージョンの実行環境もすでに整っているものとします。その他システムに必要な条件については、以下の 技術詳細を参照してください。(Windows プラットフォームで Perl がないという場合は、実行形式のフォームインタフェースをhelper applications pageからダウンロードすることも可能です。)

Analog の設定が完了して適切に動作するようになるまで、フォームの設定は行なわないでください。そうしないとトラブルシューティングが余計に複雑になってしまいます。 And unlike analog itself, the form interface will not run "out of the box". 安全に設定する方法を把握する上で、この章を必ず熟読してしてください。

注意: CGI プログラムには、悪意をもったユーザにシステムを破壊させてしまうようなセキュリティホールが存在していることがあります。 (こうした事実を知らないのであれば、CGI プログラムを実行させるべきではないでしょう。まずは World Wide Web Security FAQCGI Security FAQ などを熟読して理解するようにしてください。) このフォームインタフェースは安全にしたつもりですが、それを保証することはできません。どんなに注意して設計した CGI プログラムであっても、致命的なセキュリティホールが存在していることはあります。もし何か問題が発生しても、それについての責任をとることはできませんので、あくまでも各自の責任において使用してください。(ライセンスを参照してください。) さらに、パスワードをつけたり、anlgform.plを実行可能なホストを制限したりしない限り、フォームインタフェースを設定することは、インターネット上の誰でも Analog を実行してログの解析を行なうことを可能にすることに他ならないという点を忘れてはなりません。 It's usually a bad idea to allow this, because it has obvious negative implications both for privacy and for the load on your system: an attacker can run multiple copies of analog causing a denial-of-service attack. There are more notes on security design in this program towards the end of this section.

フォームインタフェースは2つのファイルからなっています。オプションを選択するフォーム(anlgform.html) と、それを Analog に引き渡す CGI プログラム (anlgform.pl) です。 anlgform.htmlanlgform.pl のどちらも、システムで動作させるためには必ず事前に設定を行なう必要があります。設定方法については、各々のファイルの冒頭の部分に説明があります。

プログラムと一緒に配布されているフォームは、あくまで一例だと考えてください。 英語以外の言語のフォームもlangディレクトリの中に幾つか入っていますし、独自のフォームを作成することもできます。そもそも、フォーム自体は必須ではありません。CGI プログラムに対して、URL 中の 「?」マークの後に CGI プログラムに引き渡す引数を適切に記述したリンクを張っておけばよいだけです。


Analog の設定コマンドのほとんどのものが、フォーム中にそのコマンドに関する記述を含めることで、フォームから指定できるようになります。例えば、ログファイルを選択できるようにしたい場合は、以下のような記述が可能です
Logfile name: <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>

セキュリティ、あるいはパフォーマンス上の問題により、フォームからは指定できないコマンドもあります。それらの一覧を以下に示します: *LOGFORMATLANGFILEDESCFILEHEADERFILEFOOTERFILEUNCOMPRESSOUTFILECACHEOUTFILEERRFILELOCALCHARTDIRDNS および SETTINGS フォームの設定を行なう際に、これ以外のコマンドも指定できないコマンドとして付け加えることができます。これらのコマンドを除外した理由や、これ以外にも除外した方がよいコマンドの一覧については、security notesを参照してください。 You can, if you prefer, specify the commands which are allowed, rather than those which are forbidden.


コマンドによっては、利用上の便宜を図るため、引数の指定を2分割して行なうことが可能になっています。 例えば、2つの引数をとるコマンド(例えば ALIAS 系コマンドLOGFILE コマンド) がそれに挙げられます。これらのコマンドについては、フォーム上で COMMAND1 および COMMAND2 のような名称を用いることで、各々の引数を扱うことができます。以下に一例を示します。
Alias this file: <input type=text name="FILEALIAS1">
To this one: <input type=text name="FILEALIAS2">
この対応づけを複数回記述することはできません。つまり、同じ ALIAS 系コマンドについては、複数の対応づけを指定することはできません。最後に記述された COMMAND1COMMAND2 のみが有効になります。

FLOOR コマンドについても同様です。 フォームのユーザがコマンドの文法(訳注: 引数の記述順序)を知らなくてもよいように、コマンドの引数を FLOORAFLOORB とに2分割して指定させ、and they will be stuck together. 例えば、プログラムに同梱して配布されているフォームでは、以下のような指定を行なっています。

<br>Include all domains with at least
<input type=TEXT name="DOMFLOORA" maxlength=6 size=6>
<select name="DOMFLOORB">
  <option value=r>requests
  <option value=p>requests for pages
  <option value=b selected>bytes
</select>
DOMFLOORA5% で、DOMFLOORBr の場合、 DOMFLOOR 5%r というコマンドがプログラムに対して送られます。 (DOMFLOORA=5 および DOMFLOORB=%r のように記述しても動作しますので、フォームをそのように記述しても構いません。)
フォームから送信可能なコマンドには、 Analog 自身のコマンドではないものもあります。 qv=1 オプションが設定されていると、Analog が実行される代わりに、Analog に送信される設定コマンドの一覧が表示されます。これは、CGI プログラムがきちんと動作していることを確認する際に役立ちますし、ユーザにフォームを使って設定ファイルを生成させるために使うこともできます。

オプション指定時に他の設定ファイルを読み込ませる指定を行なうこともできます。Analog が CGI プログラム経由で呼び出されると、直接実行した場合と同じく、最初に デフォルト設定ファイル が読み込まれます。さらに Analog は cg という名前のオプションで指定された設定ファイルを読み込み、続いて CGI プログラムによって指定されたその他のコマンドを処理してから、cm という名前のオプションで指定された設定ファイルを処理します。 最後に、直接実行した場合と同じく、Analog は 強制設定ファイル を読み込みます。(そのため、フォーム用とフォーム以外用とで、別々の環境設定ファイルを読み込むように指定したコンパイルを行なった 2つの Analog が必要な場合もあるかも知れません。 デフォルト設定ファイルや、強制設定ファイルに記述されたコマンドはその他の設定に影響を与える場合もありますので注意してください。コマンドによっては、フォームで指定された設定が上書きされてしまう場合もあります。 例えば、デフォルト設定ファイルに INCLUDE コマンドが含まれていた場合、フォームで指定した INCLUDEEXCLUDE コマンドに対して予期しない影響がでる場合があります。


基本的に、anlgform.pl では、コマンドをフォームから送信された順番に Analog に対して送ります。ただし、これには幾つかの例外があります。まず、同じ名前のコマンドはまとめて送られます。そのため、INCLUDEEXCLUDE 系コマンドを複数回記述しても、意図した動作をしません。次に、コマンドは基本的に大文字と小文字を区別しないのですが、複数の同じコマンドで大文字と小文字の組合せが異なっていると、不正な順番で処理されてしまうことがあります。そのため、大文字と小文字は一致させてください。さらに、WARNINGSLOGTIMEOFFSET は最初に送られます。(そのため、LOGTIMEOFFSET はフォーム経由で指定したすべてのログファイルに対して適用されます。)

フォーム経由で Analog を実行した際に、常に設定されるコマンドが幾つかあります。それらはフォームから送信された設定を上書きする場合もあります。まず、DNS READ (DNSFILE がフォームで設定された場合) もしくは DNS NONE (その他の場合) のどちらかが設定されます。これを上書きしないようにしてください。 タイムアウトが発生するという問題だけでなく、攻撃者が DNSFILE コマンドを設定することで、任意のファイルへの書き込みが可能になってしまうという問題が発生します。

次に、WARNINGS FL が常に設定されます。これはあまり重要でない警告でサーバのログファイルが埋め尽くされるのを避けるためです。この設定については、明示的に WARNINGS コマンドをフォームから設定することで変更することができます。 さらに、LOGFORMAT コマンドの指定を誤った時に、エラーログファイルが埋め尽くされてしまうのを避けるために、DEBUG -C コマンドも設定されます。これについてはフォームから設定を変更することはできません。設定を変更したい場合は、強制設定ファイル内に記述してください。

デフォルト設定ファイル中で、 CHARTDIRLOCALCHARTDIR コマンドを記述しないかぎり、 (セキュリティ上の理由で、フォーム経由での LOCALCHARTDIR コマンドの設定は無効になっています)、フォーム経由での実行で、円グラフを出力することができません。 また上記の設定を行なった場合でも、複数のユーザが同時にフォームインタフェースを実行させると、同じ名前のファイルに画像を書き込もうとしてしまうため、画像が不正になってしまうという問題が発生することがあります。

圧縮されたログファイルの扱いについても、1つ注意点があります。セキュリティ上の理由で、フォームインタフェースを使う場合は、UNCOMPRESS コマンドで展開コマンドのパスをフルパス名で指定する必要があります。

同じく、セキュリティ上の理由で、フォームインタフェースを使う際に、Analog は設定コマンド内の文字列についてのチェックをより厳しく行ないます。このため、JAPANESE-JIS 文字セットは正しく動作しません。その他の日本語の文字セットを使ってください。


フォームに関するトラブルシューティング

フォームインターフェースの設定の際に問題が起きた時の対処法について、以下で説明します。

まずは、フォームを使わずに、Analog 自身が正しく動作することを確認してください。

次に、anlgform.pl を (DOS や Unix の) コマンドラインから実行してみてください。これにより、大部分の問題の検証を行なうことができます。 オプションは以下のように指定してください:

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. Look in the server's error log for clues. デフォルトでは FL カテゴリの警告のみが表示されるため、エラーログの確認を行なう前に、WARNINGS ON の設定を行なった方がよいであろう。
  4. 場合によっては、Analog の設定ファイルに (このコマンドはフォームからは指定できない) ERRFILE を設定して、確認できていない可能性のあるエラーや警告を出力するようにすると良いかも知れない。特に IIS の場合はエラーをエラーログに出力せずに、ブラウザの画面に出力してしまうため、この設定が有用になります。 Internet Explorer を使っている場合、本来のエラーメッセージをみるためには、「friendly」 error messages を無効にすることが必要です。
  5. Analog に関連するファイル (Analog 自身、ログファイル、設定ファイル、ドメインファイルなどのファイル) がサーバ上で実行可能、もしくは読み込み可能になっているか?
  6. 一部のオプションが有効にならない時は、それが設定ファイル中のコマンドで上書きされていないことを確認すること。(フォームから SETTINGS コマンドを送信することはできないので、デフォルト設定ファイルでこのコマンドを記述してみるとよい。)
  7. 長時間待っても何のデータも返却されない場合は、おそらく Analog の処理が終わる前にリクエストがサーバ上でタイムアウトしたと考えられる。対策としては、タイムアウト値を伸ばすこと。
  8. 前述したように、フォーム経由の処理では、常に DNS READ もしくは DNS NONEWARNINGS FLDEBUG -C がデフォルト設定ファイルの設定を上書きする。
  9. これも 前述したように、円グラフは表示されなかったり、表示がおかしくなったりすることがある。
  10. これも 前述したように、圧縮されたログファイルの展開は、UNCOMPRESS コマンドをフルパス名で記述しないと動作しないことがある。
  11. これも 前述したようにJAPANESE-JIS 文字セットは、フォーム経由ではうまく動作しない。

セキュリティについて

前述したように、CGI プログラムにはセキュリティホールの含まれていることがよくあります。(詳細は、World Wide Web Security FAQ および CGI Security FAQ を参照してください) 。フォームインタフェースが安全であることを 保証することはできませんが、安全にするためにできる限りのことは行ないました。ここでは、わたしの設計方針を説明します。もちろん、コメントは大歓迎です。秘密にする必要がある場合は、わたし個人のメールアドレス analog-author@lists.isite.net までメールを送ってください。

まず、誰がフォームインタフェースを実行することができるかについて整理しておくことが必要です。パスワードをかけたり、anlgform.pl を実行可能なホストを制限したりしない限り、Web サイトでフォームインタフェースを使えるようにすることは、インターネット上の誰もが好きな時に Analog を実行してログファイルを解析することができてしまうということに他なりません。これは、システムのプライバシー侵害と負荷増大という観点からみて、好ましい状態ではないでしょう。各 Analog プロセスが使うことのできる CPU 数を制限しても、Analog を複数実行することで、サービス拒否攻撃を行なうことが簡単にできてしまいます。

anlgform.pl によって無視され、Analog に渡されないコマンドも幾つかあります。その一覧については、 anlgform.pl ファイルの先頭に記述されています。以下その理由を説明します。HEADERFILEFOOTERFILE コマンドにより、システムの任意のファイルを出力に含めることが可能です。 The *LOGFORMAT commands would also allow any file to be read, because someone could designate each line to be a single filename and then just list the filenames. OUTFILECACHEOUTFILEERRFILELOCALCHARTDIR により、任意のファイルへの書き込みが可能です。 ERRFILE は、警告をサーバ上のエラーログ以外のどこかに転送してしまうことが可能です。 UNCOMPRESS は、ユーザが任意のコマンドを実行してしまうことが可能です。 DNS については、READ 以上の設定にすると、大半の場合プロセスがタイムアウトしてしまうため、変更を禁止しています。また DNS WRITEDNSFILE については、読み込みだけでなく、任意のファイルへの書き込みが可能になります。 CGI では、ユーザが文法的に間違った出力を生成することが可能です。 PROGRESSFREQ は、エラーログを埋め尽くすというサービス拒否攻撃が一瞬の内にできてしまいます。(DEBUG C についても、同様の理由で 無効になっています。)

これらのコマンドを一覧から削除してはいけません (自分以外の人がanlgform.plを実行することは絶対にないと確信できる場合は別ですが)。デフォルトで禁止されているコマンドは、これ以外にも3つありますが、それらについては禁止リストから外しても構いません。SETTINGS は禁止リストに含まれていますが、これはシステム上の幾つかのファイルの位置が出力されるためです。とはいえ、この情報はトラブルシューティングには有益ですので、フォームの設定で問題が発生したさいに一時的にこのコマンドを禁止リストから除外してみるのもよいでしょう。他にも LANGFILEDESCFILE コマンドが禁止リストに含まれています。これは、他に言語ファイルと全く同じ行数のファイルがあった場合に、そのファイルが言語ファイルとして認識されてしまい、ファイルの内容の一部が出力されることもあるためです。もっとも、ファイルの行数が全く同一でない限り、こうした事態は起こりません。Analog が適切にインストールされていれば、LANGUAGE コマンドが適切なファイルに記述されている筈ですので、このコマンドが必要になることはないでしょう。しかし、このコマンドが必要で、説明したリスクを容認できる場合は、LANGFILEDESCFILE をリストから外しても構いません。

これ以外に、リストに追加した方がよいかも知れないコマンドもあります。 例えば、(現実的にはあり得ないと思いますが)論理的にはシステム上の無関係なファイルが、あらかじめ定義されたログ形式と類似しており、Analog による解析が可能になってしまった結果、ファイルの内容の一部が出力されてしまうといったこともあり得ます。 この危険性が問題となる場合や、それ以外の場合でもフォームから解析できるログファイルを特定のものだけに限定したいという場合は、LOGFILE コマンドを禁止リストの追加することも考えられます。DOMAINSFILE についての同じような場合が考えられます。 また、エラーログファイルに出力する警告の種類をフォーム利用者に制御させたくないという場合は、WARNINGS コマンドをリストに追加してもよいでしょう。( anlgform が検知したセキュリティ上の問題点については、常にログファイルに書き込まれます。)

もちろん、このリストには任意のコマンドを追加することができます。例えば、CONFIGFILE コマンドを追加することで、フォーム利用者がシステム上の任意の設定ファイルを読み込むことを禁止できます。 コマンドをリストに追加する際には、その別名についても同様に追加する必要があります。 globals.c というソースファイルをみると、コマンドの別名を確認できます。コマンドによっては、マニュアルに記載されていない古い名称が存在している場合があります。

利用可能なコマンドについて、より厳密な管理を行ないたいという場合は、anlgform で禁止するコマンドを指定するのではなく、許可されるコマンドを指定するようにすることもできます。この方法については、anlgform.pl の先頭を参照してください。


CGI のセキュリティ問題について詳しい方のために、設計に関してもう少し技術的な観点での説明を行なっておきます。anlgform.pl$PATH 環境変数を NULL にします。anlgform.pl は 、analog コマンドの標準入力に対して引数を送信するために、analog コマンドとパイプ経由で通信します。ユーザが指定したデータは、open() を使わず、パイプ経由でのみ送信されます。 UNIX の場合、anlgform.pl-T フラグをつけて実行されます (Windows で同じ動作をさせる方法を知りませんか?)

LOGFILECACHEFILE コマンドの引数は、許可された文字 (英数字、/\.:_*?、スペース、それに {英数字、アンダースコア} に挟まれた -) 以外が含まれていないことをチェックされます。 これは、これらの文字が UNCOMPRESS コマンドの引数に記述されていると、実際のコマンドが popen() 関数経由で実行される際に、これらの危険な文字がシェルに渡されてしまうためです。

さらに、コマンド名については、英文字と数字の1と2以外の文字が含まれていないことをチェックされます。またコマンドの引数は制御文字(0-32(10進数) と 127-159 のバイト、特に改行文字を禁止しています) が含まれていないことをチェックされます。 anlgform.pl ではコマンドの長さについてのチェックは特に行なっていません。ただし、設定コマンドの長さについては Analog 側でチェックされますので、バッファオーバーフローが発生したりする心配はありません。

なお、Analog 自身を CGI プログラムとして使うべきではないと力説している理由は、Web サーバによっては、特に Microsoft の IIS では、ユーザが CGI プログラムにコマンドラインから引数を渡すことが可能になってしまっているためです。しかも、プログラムが適切な CGI ヘッダを返却しなかった場合でも、出力がユーザに表示されてしまうこともあります。これでは、ここまで説明してきた引数のチェックが無意味になってしまいます。もちろん、CGI プログラムにコマンドラインから引数を渡すことがでいないサーバ上では、こうしたセキュリティ上の問題はありません。でも、引数を全く渡せないとすると、デフォルトの出力結果しか得ることができませんので、やはり Analog を直接 CGI プログラムとして起動するのは、止めた方がよいでしょう。


技術的な詳細

Perl 5.001 以降が実行されている環境が必要です (Windows を使っていて、helper applications ページからフォームインタフェースの実行環境をダウンロードしている場合は、無関係です)。Perl の最新バージョンについては、 www.perl.org (Windows の場合は http://www.activestate.com/Products/ActivePerl/) から無償でダウンロードすることができます。なお、CGI.pm モジュールも必要ですが、これは通常 Perl と一緒に配布されている筈です。

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

anlgform.plGETPOST いずれのメソッドによるフォームからの送信も受け付けます。 HTML spec によると、実行中のプログラムに問題が発生しない限りは、GET を使うべきであると書かれています。しかし、HTTP spec の 15.1.3 章をみると、オプションの一部を秘密にしたい場合は、POST を使うべきであるという記述があります。また、多数のオプションがついて非常に長大になった URL は、古い Web サーバで問題を発生させることもあります。 そのため、anlgform.html は、デフォルトで POST メソッドを使いますが、GET メソッドも問題なく動作します。例えば、GET メソッドの方式にしたがって、「?」マークの後に幾つかのオプションをつけた anlgform.pl へのリンクを作成することも可能です。


Analog ホームページ

Stephen Turner
23 August 2003

Analog についての質問はanalog-help メーリングリスト をお使いください。 (訳注: 日本では analog-jp メーリングリスト をご利用ください)

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