Analog 5.91beta1: フォームインタフェースと CGI プログラム重要: セキュリティ上の理由により、 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 FAQ や CGI 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.html と anlgform.pl のどちらも、システムで動作させるためには必ず事前に設定を行なう必要があります。設定方法については、各々のファイルの冒頭の部分に説明があります。
プログラムと一緒に配布されているフォームは、あくまで一例だと考えてください。 英語以外の言語のフォームもlangディレクトリの中に幾つか入っていますし、独自のフォームを作成することもできます。そもそも、フォーム自体は必須ではありません。CGI プログラムに対して、URL 中の 「?」マークの後に CGI プログラムに引き渡す引数を適切に記述したリンクを張っておけばよいだけです。
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>
セキュリティ、あるいはパフォーマンス上の問題により、フォームからは指定できないコマンドもあります。それらの一覧を以下に示します: *LOGFORMAT、LANGFILE、DESCFILE、HEADERFILE、FOOTERFILE、UNCOMPRESS、OUTFILE、CACHEOUTFILE、ERRFILE、LOCALCHARTDIR、DNS および SETTINGS フォームの設定を行なう際に、これ以外のコマンドも指定できないコマンドとして付け加えることができます。これらのコマンドを除外した理由や、これ以外にも除外した方がよいコマンドの一覧については、security notesを参照してください。 You can, if you prefer, specify the commands which are allowed, rather than those which are forbidden.
Alias this file: <input type=text name="FILEALIAS1"> To this one: <input type=text name="FILEALIAS2">この対応づけを複数回記述することはできません。つまり、同じ ALIAS 系コマンドについては、複数の対応づけを指定することはできません。最後に記述された COMMAND1 と COMMAND2 のみが有効になります。
FLOOR コマンドについても同様です。 フォームのユーザがコマンドの文法(訳注: 引数の記述順序)を知らなくてもよいように、コマンドの引数を FLOORA と FLOORB とに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>DOMFLOORA が 5% で、DOMFLOORB が r の場合、 DOMFLOOR 5%r というコマンドがプログラムに対して送られます。 (DOMFLOORA=5 および DOMFLOORB=%r のように記述しても動作しますので、フォームをそのように記述しても構いません。)
オプション指定時に他の設定ファイルを読み込ませる指定を行なうこともできます。Analog が CGI プログラム経由で呼び出されると、直接実行した場合と同じく、最初に デフォルト設定ファイル が読み込まれます。さらに Analog は cg という名前のオプションで指定された設定ファイルを読み込み、続いて CGI プログラムによって指定されたその他のコマンドを処理してから、cm という名前のオプションで指定された設定ファイルを処理します。 最後に、直接実行した場合と同じく、Analog は 強制設定ファイル を読み込みます。(そのため、フォーム用とフォーム以外用とで、別々の環境設定ファイルを読み込むように指定したコンパイルを行なった 2つの Analog が必要な場合もあるかも知れません。 デフォルト設定ファイルや、強制設定ファイルに記述されたコマンドはその他の設定に影響を与える場合もありますので注意してください。コマンドによっては、フォームで指定された設定が上書きされてしまう場合もあります。 例えば、デフォルト設定ファイルに INCLUDE コマンドが含まれていた場合、フォームで指定した INCLUDE や EXCLUDE コマンドに対して予期しない影響がでる場合があります。
フォーム経由で Analog を実行した際に、常に設定されるコマンドが幾つかあります。それらはフォームから送信された設定を上書きする場合もあります。まず、DNS READ (DNSFILE がフォームで設定された場合) もしくは DNS NONE (その他の場合) のどちらかが設定されます。これを上書きしないようにしてください。 タイムアウトが発生するという問題だけでなく、攻撃者が DNSFILE コマンドを設定することで、任意のファイルへの書き込みが可能になってしまうという問題が発生します。
次に、WARNINGS FL が常に設定されます。これはあまり重要でない警告でサーバのログファイルが埋め尽くされるのを避けるためです。この設定については、明示的に WARNINGS コマンドをフォームから設定することで変更することができます。 さらに、LOGFORMAT コマンドの指定を誤った時に、エラーログファイルが埋め尽くされてしまうのを避けるために、DEBUG -C コマンドも設定されます。これについてはフォームから設定を変更することはできません。設定を変更したい場合は、強制設定ファイル内に記述してください。
デフォルト設定ファイル中で、 CHARTDIR や LOCALCHARTDIR コマンドを記述しないかぎり、 (セキュリティ上の理由で、フォーム経由での 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 を実行しようとします。
これでもまだ動かない場合、以下の点を確認してください:
まず、誰がフォームインタフェースを実行することができるかについて整理しておくことが必要です。パスワードをかけたり、anlgform.pl を実行可能なホストを制限したりしない限り、Web サイトでフォームインタフェースを使えるようにすることは、インターネット上の誰もが好きな時に Analog を実行してログファイルを解析することができてしまうということに他なりません。これは、システムのプライバシー侵害と負荷増大という観点からみて、好ましい状態ではないでしょう。各 Analog プロセスが使うことのできる CPU 数を制限しても、Analog を複数実行することで、サービス拒否攻撃を行なうことが簡単にできてしまいます。
anlgform.pl によって無視され、Analog に渡されないコマンドも幾つかあります。その一覧については、 anlgform.pl ファイルの先頭に記述されています。以下その理由を説明します。HEADERFILE と FOOTERFILE コマンドにより、システムの任意のファイルを出力に含めることが可能です。 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. OUTFILE、CACHEOUTFILE、ERRFILE、LOCALCHARTDIR により、任意のファイルへの書き込みが可能です。 ERRFILE は、警告をサーバ上のエラーログ以外のどこかに転送してしまうことが可能です。 UNCOMPRESS は、ユーザが任意のコマンドを実行してしまうことが可能です。 DNS については、READ 以上の設定にすると、大半の場合プロセスがタイムアウトしてしまうため、変更を禁止しています。また DNS WRITEやDNSFILE については、読み込みだけでなく、任意のファイルへの書き込みが可能になります。 CGI では、ユーザが文法的に間違った出力を生成することが可能です。 PROGRESSFREQ は、エラーログを埋め尽くすというサービス拒否攻撃が一瞬の内にできてしまいます。(DEBUG C についても、同様の理由で 無効になっています。)
これらのコマンドを一覧から削除してはいけません (自分以外の人がanlgform.plを実行することは絶対にないと確信できる場合は別ですが)。デフォルトで禁止されているコマンドは、これ以外にも3つありますが、それらについては禁止リストから外しても構いません。SETTINGS は禁止リストに含まれていますが、これはシステム上の幾つかのファイルの位置が出力されるためです。とはいえ、この情報はトラブルシューティングには有益ですので、フォームの設定で問題が発生したさいに一時的にこのコマンドを禁止リストから除外してみるのもよいでしょう。他にも LANGFILE と DESCFILE コマンドが禁止リストに含まれています。これは、他に言語ファイルと全く同じ行数のファイルがあった場合に、そのファイルが言語ファイルとして認識されてしまい、ファイルの内容の一部が出力されることもあるためです。もっとも、ファイルの行数が全く同一でない限り、こうした事態は起こりません。Analog が適切にインストールされていれば、LANGUAGE コマンドが適切なファイルに記述されている筈ですので、このコマンドが必要になることはないでしょう。しかし、このコマンドが必要で、説明したリスクを容認できる場合は、LANGFILE や DESCFILE をリストから外しても構いません。
これ以外に、リストに追加した方がよいかも知れないコマンドもあります。 例えば、(現実的にはあり得ないと思いますが)論理的にはシステム上の無関係なファイルが、あらかじめ定義されたログ形式と類似しており、Analog による解析が可能になってしまった結果、ファイルの内容の一部が出力されてしまうといったこともあり得ます。 この危険性が問題となる場合や、それ以外の場合でもフォームから解析できるログファイルを特定のものだけに限定したいという場合は、LOGFILE コマンドを禁止リストの追加することも考えられます。DOMAINSFILE についての同じような場合が考えられます。 また、エラーログファイルに出力する警告の種類をフォーム利用者に制御させたくないという場合は、WARNINGS コマンドをリストに追加してもよいでしょう。( anlgform が検知したセキュリティ上の問題点については、常にログファイルに書き込まれます。)
もちろん、このリストには任意のコマンドを追加することができます。例えば、CONFIGFILE コマンドを追加することで、フォーム利用者がシステム上の任意の設定ファイルを読み込むことを禁止できます。 コマンドをリストに追加する際には、その別名についても同様に追加する必要があります。 globals.c というソースファイルをみると、コマンドの別名を確認できます。コマンドによっては、マニュアルに記載されていない古い名称が存在している場合があります。
利用可能なコマンドについて、より厳密な管理を行ないたいという場合は、anlgform で禁止するコマンドを指定するのではなく、許可されるコマンドを指定するようにすることもできます。この方法については、anlgform.pl の先頭を参照してください。
LOGFILE と CACHEFILE コマンドの引数は、許可された文字 (英数字、/\.:_*?、スペース、それに {英数字、アンダースコア} に挟まれた -) 以外が含まれていないことをチェックされます。 これは、これらの文字が UNCOMPRESS コマンドの引数に記述されていると、実際のコマンドが popen() 関数経由で実行される際に、これらの危険な文字がシェルに渡されてしまうためです。
さらに、コマンド名については、英文字と数字の1と2以外の文字が含まれていないことをチェックされます。またコマンドの引数は制御文字(0-32(10進数) と 127-159 のバイト、特に改行文字を禁止しています) が含まれていないことをチェックされます。 anlgform.pl ではコマンドの長さについてのチェックは特に行なっていません。ただし、設定コマンドの長さについては Analog 側でチェックされますので、バッファオーバーフローが発生したりする心配はありません。
なお、Analog 自身を CGI プログラムとして使うべきではないと力説している理由は、Web サーバによっては、特に Microsoft の IIS では、ユーザが CGI プログラムにコマンドラインから引数を渡すことが可能になってしまっているためです。しかも、プログラムが適切な CGI ヘッダを返却しなかった場合でも、出力がユーザに表示されてしまうこともあります。これでは、ここまで説明してきた引数のチェックが無意味になってしまいます。もちろん、CGI プログラムにコマンドラインから引数を渡すことがでいないサーバ上では、こうしたセキュリティ上の問題はありません。でも、引数を全く渡せないとすると、デフォルトの出力結果しか得ることができませんので、やはり Analog を直接 CGI プログラムとして起動するのは、止めた方がよいでしょう。
Windows 上では、Perl スクリプトが perl によって実行されるようにするため、拡張子 .pl を Perl の実行ファイルに関連付けする必要があります。
anlgform.pl は GET と POST いずれのメソッドによるフォームからの送信も受け付けます。 HTML spec によると、実行中のプログラムに問題が発生しない限りは、GET を使うべきであると書かれています。しかし、HTTP spec の 15.1.3 章をみると、オプションの一部を秘密にしたい場合は、POST を使うべきであるという記述があります。また、多数のオプションがついて非常に長大になった URL は、古い Web サーバで問題を発生させることもあります。 そのため、anlgform.html は、デフォルトで POST メソッドを使いますが、GET メソッドも問題なく動作します。例えば、GET メソッドの方式にしたがって、「?」マークの後に幾つかのオプションをつけた anlgform.pl へのリンクを作成することも可能です。
Stephen Turner
Analog についての質問はanalog-help メーリングリスト をお使いください。 (訳注: 日本では analog-jp メーリングリスト をご利用ください)