Moai+Easter 上級マニュアル

Moai Manual Advanced Manual Annoucement FAQ
ご案内 Moaiエンジン CustomBoyエンジン HowToコンパイル Moai CGI Developers
エンジンの詳細 フィルターの詳細 ローカルプロキシとしての使い方 プラグイン開発のためのヒント

はじめに

Moaiはポータブルウェブサーバシステムです.
moaiが起動中は、あなたのマシンはローカルなプロキシサーバとウェブサーバとして同時に機能します.
これにより様々なWebアプリケーションをあなたのマシンだけで完結した形で、ブラウザ上にて利用できるようになります.

デフォルトの設定では安全のため、あなたのマシン以外からのMoaiへの接続はすべて遮断されるようになっています.

この記事ではMoaiエンジン本体に関する全機能を詳細に解説します.
尚、この記事はエキスパートな方向けであり、通常のユーザーは読む必要はありません.


目次



Moaiの起動

Moaiはサーバプログラムの一種ですから、これを機能させるためにはMoaiを起動しておかなければなりません.
moai(Windowsならmoai.exe)を実行しましょう.
もしインストールがまだならインストールガイドを参照してください.
これでこのプログラムが実行している間、Moaiはサーバとして機能します.

Moaiが使用(リッスン)するポート番号はデフォルトで8124となります.
お使いのOSでなんらかのFirewall機能が存在する場合、このポートへの接続が行えるよう設定しておく必要があるかもしれません.

目次に戻る

MoaiをWebサーバとして使う

Moaiを起動したら、あなたが普段使っているブラウザから普通にhttp://127.0.0.1:8124 へアクセスしてみましょう.
Welcome to Moai+Easter Worldと書かれたページが表示されたでしょうか?
表示されたならばMoaiはWebサーバとして機能しています.
以降、これをMoaiトップページと呼ぶことにします.
毎回このURLを打ち込むのも面倒ですので、このURLをブックマークしておくとよいでしょう.

Webサーバといってもデフォルトではあなたのマシン以外からの接続は安全のため遮断されています.
Moaiはいわばローカルウェブサーバとしての使い方をメインに想定されたものです.
この場合、Webサーバとしてできることは以下の二つと考えてよいでしょう.

  1. ブラウザからURL指定を行うことにより、アクセス先のサーバ内に置かれたHTMLや画像などを閲覧できるようにする.
    Moaiの場合、ブラウザから例えば http://127.0.0.1:8124/*.html や http://127.0.0.1:8124/*.jpg といったURL指定によりmoaiディレクトリ配下のdoc_rootに置かれたHTMLや画像などを閲覧することができます(他にもいくつか規則があります).

  2. ブラウザからURL指定を行うことにより、アクセス先のサーバ内に置かれたCGIスクリプトなどを実行させ、その結果をブラウザへ送信する.
    Moaiの場合でもこれが可能で、これを Moai CGI と呼び、Moaiとは独立した単独のWebアプリケーションとして機能します.
    Moaiでデフォルトで付属しているアプリケーションは、Moaiトップページにも紹介されていますが、Easter, VirtualUSERS, CustomBoy, ProxyFinderといったものがあります.
    また、今現在広くネット上に配布されているほかのCGIをMoai上で実行させることもできますし、その気になればあなたがCGIスクリプトを独自に開発し、それをMoai CGI上で実行させることもできます.
    これについてはMoai CGI Developersを参照してください.


目次に戻る

Moaiをローカルプロキシとして使う

Moaiの極初期の古いバージョン(1.1.8 より以前)では Moai はローカルプロキシと呼ばれるツールでした.
そして Moai のフィルタリング機能によりネット掲示板などで仮想環境を実現するには、ブラウザにて「プロキシの設定」を行っておく必要がありました.

Moai Ver2.0以降、Moai はポータブルウェブサーバシステムへと進化しています.
これによりブラウザにて特別な設定をすることなく、普通にネットを見る操作のみで仮想環境を利用することができます.
言い換えれば、ブラウザにて「プロキシの設定」を行っておく必要がなくなりました.

しかし実はMoai Ver2.0でも旧来通りMoaiをローカルプロキシとして使うこともできます.
ローカルプロキシの場合は基本的にどのようなサイトにでも常に機能するという強力さがあります.
一方、バージョン2.0で導入されたEasterを使って仮想環境を実現する場合、その適用範囲はEasterがサポートするサイトに限られます.

ローカルプロキシとして使う方法の詳細についてはローカルプロキシを参照してください.

目次に戻る

Moaiエンジンの設定

Moaiトップページで「Moaiエンジンの設定」を選ぶと、Moaiの基本的な設定ができる画面を表示させることができます.
あるいはブラウザのURL指定欄に http://127.0.0.1:8124/config と指定しても表示できます.

Moai Ver1.1.8までにあった「Moai Web Configuration」という画面は廃止されています.
特に旧バージョンから移行された方は「Virtual USERS Initiation」ボタンが廃止されていることに注意してください.
その機能はすべてCGIアプリケーション「VirtualUSERS」へ後継されています.


Moai基本設定
ここではMoaiの基本的な機能に関する設定を行います.
  • parent_proxy:
    このメニューでは parent_proxy.txt の内容が表示されます.
    ここから現在使用するプロキシを選んで「更新」を押せば使用する外部プロキシの瞬時切り替えができます.

  • filter_dir:
    Moai Ver2.0では、filterが格納されたディレクトリのパスをここからユーザが変更することができます.
    新しいパスを入力した上で「更新」を押せば設定が反映されます.

    filterディレクトリは、デフォルトではMoaiディレクトリの直下に(もし存在しなければ)作成されます.
    しかし場合によっては、その位置を変更したいと思われることがあるかもしれません.
    たとえば将来Moaiがバージョンアップされて新しいバージョンへ移行しようとした場合を考えてみてください.
    新しいMoaiのzipをダウンロードして、それを(旧バージョンとは別の)ディレクトリに展開することになりますが、そのような状況が発生するたびにfilterディレクトリだけを新しいディレクトリ配下にコピーするのは面倒です.
    ならばfilterだけをMoaiディレクトリとは別の外部(例えば1階層上)へと出し、そのパスを指定しておけばその手間が省けます.

  • profile_dir:
    Moai Ver2.0では、moai_profileというディレクトリが新たに導入されました.
    これはMoai CGI上で実行されるWebアプリケーションのためにMoaiが用意したデータ格納用の場所であり、Webアプリケーションはこのフォルダを自由に利用することができます.
    このディレクトリのパスもまたユーザが変更することができ、それを可能としている理由もまたfilter_dirの場合と同じく、バージョンアップの際の手間を出来るだけ最小とするためです.
    新しいパスを入力した上で「更新」を押せば設定が反映されます.

    ただしprofile_dirの場合はそのような状況を見込んで、そのパスはデフォルトで ../moai_profile となっています.
    これはMoaiディレクトリを出た一つ上の階層にmoai_profileディレクトリが(もし存在しなければ)作成され、以降profile_dirとしてそのディレクトリが参照されるということを意味します.
    よって、特にそれで不都合がなければユーザがこれを変更する必要はないでしょう.

  • post_confirm:
    POST時の確認画面表示モードのon/offを切り替えます.
    チェックボックスをクリックして値を切り替えた上で「更新」を押せば設定が反映されます.

  • enable_log_file:
    moai_log.logへ全Log情報を書き出すか否かを切り替えます.
    チェックボックスをクリックして値を切り替えた上で「更新」を押せば設定が反映されます.

  • enable_log_verbose:
    Log情報をさらに詳細に書き出すか否かを切り替えます.
    チェックボックスをクリックして値を切り替えた上で「更新」を押せば設定が反映されます.




Moaiセキュリティ設定
このパネルはエキスパート向けのもので通常は利用する必要はありません.
またここでの設定は、セキュリティー上の理由でlocalhostからのみ可能となります.
(外部マシンからリモートでは行えないということです).
Moaiを再起動するよう促すメッセージが表示されることもあります.
この場合一番下にある「Moaiを再起動」ボタンを押すことでMoaiサーバが再起動され、設定が反映される形となります.

  • acceptable_host:
    この値がLOOPBACKの場合、ローカルマシン以外からの接続を完全に門前払いします.
    このときacceptそのものが行われないため、DOS攻撃に対する防御力は増します.
    (まあ外部サーバでもないMoaiがDOS攻撃に晒されるなんて状況はまずあり得ないとは思いますが…)

    ANYの場合、ローカルマシン以外からの接続もとりあえず受け付け、そこから先の更なる細かい受理の判定をhosts.myfの内容に委ねます.

    仮にこのさらなる判定がなければ、極端な話、ルータなどのファイアウォール機構がない環境では、WANからの接続も認めてしまうことになります.
    「LAN からの接続のみ許可」といった意味を持つ特別な設定値を提供したいところではありますが、残念ながら、OSのネットワークAPIにそのような値が提供されていないため、それができません.

    Moaiでは、これに対処するため hosts.myf内に access_allow_ips, access_deny_ips 変数を導入し、接続を許可/不許とするIP群を指定できるようにしてあります.
    この設定については現状Moaiセキュリティ画面からは行えず、hosts.myfをテキストエディタで開いて直接編集する必要があります.

    デフォルトでは access_allow_ips に192.168.* が指定されているのみとなっており、これは典型的な「LAN からの接続のみ許可」といった意味になります.
    通常はこれで特に問題ないでしょう.

  • server_name:
    サーバ名またはLANから見た場合のIPアドレス(Private IP)です.
    XhrDMZのhostnameとしても使われます.
    acceptable_hostの値をLOOPBACK/ANYに変更した場合、この値が自動的に変更される場合もあります.

  • moai_port:
    Moai本体が使用する(リッスンする)ポート番号です.
    デフォルトでは8124となっています.

  • xhr_dmz_port:
    XhrDMZが使用する(リッスンする)ポート番号です.
    デフォルトでは8125となっています.
    XhrDMZは、Moai Ver2.0より新たに導入された防衛機構が提供するXMLHttpRequestに関する隔離領域です.
    詳細についてはMoaiの新防御システムXhrDMZについてを参照してください.


目次に戻る

ターゲット

ターゲットとは、一つの短いキーワード(ターゲット名)により、いくつかのホストの集合を示すためのものです.
一つのターゲットにはいくつかのホスト名を列挙して、そのターゲット名によりグループ分けする形になります.
以下に例を示しましょう.

【例】
target.myf 内で以下のように5chとfutabaいうtarget名を定義し(このtarget名はユーザが自由に決めることができる)、それぞれにホスト名を列挙しておきます.

@@L 5ch
*.5ch.net
*.bbspink.com
@@.

@@L futaba
*.2chan.net
@@.

これにより、その他の箇所では単に "5ch" と "futaba" というキーワードで、上記のホストの集合を示すことができます.
ちなみにここでのパターンの記述においては一行につき一箇所のみにワイルドカードを使うこともできます.
例えば以下の記述はOKであり、アスタリスクの部分は任意の文字列と考えてください.
may.2chan.net、jun.2chan.net などがこれにマッチします.

*.2chan.net

一方、例えば以下のように一行につきアスタリスクが2箇所以上ある記述は意図した通りのものとはなりません.

*.2chan.*

この場合、一番目に現れたアスタリスクのみがワイルドカードとして扱われ、二番目に現れたアスタリスクは、文字通りアスタリスクそのものとして扱われます.

myfというファイルはこのプロジェクト全般において設定ファイルなどを記述するのに用いる汎用のフォーマットです.
これの仕様について知りたい方はmyf_specを参照してください.

目次に戻る

受信フィルタについて

Moaiでは、HTTPにおけるGETにて受信されるHTMLやJavascriptやCSSにおいてその受信文字列を自由に置換(replace)したり、加工できるフィルター機能を備えています.
これを指定しているのが、filters/TARGET_NAME_recv.myf ファイルになります.
TARGET_NAMEの部分にはtarget.myfにおいて定義したターゲット名となる必要があります.

TARGET_NAME_recv.myfの詳細についてはフィルターの詳細を参照してください.

目次に戻る

送信フィルタについて

Moaiでは、HTTPにおけるPOSTにて送信されるヘッダやPOST変数、クッキーの値においてその値の内容をある程度自由に置換(replace)できるフィルター機能を備えています.
これを指定しているのが、filters/TARGET_NAME_send.myf になります.
TARGET_NAMEの部分にはtarget.myfにおいて定義したターゲット名となる必要があります.

このファイル内の header_vars、post_vars、cookie_vars、cookie_forceという部分でそれぞれHTTPヘッダ、POST変数、Cookieにおける値の置換を行うことができます.
これらには以下の変数代入形式を記述します.

varname = ['置換後の値']

このようにMoaiでは、特にPOST変数のフィルタリングを比較的簡易に実現できます.
これに関しては同種のツールであるProxomitronなどに比べて有利な点の一つです.

これらにおいて指定されていない変数に関しては何も加工修正はされず、ブラウザにおいて設定された状態が単にそのまま送られます.
また右辺の置換後の値が空値のときは、文字通り空値へと置換されます.
(ただしcookie_vars および cookie_force における変数が空値の場合は、そのクッキー変数が存在しないことと等価です)

また中間処理のため、実際に送信されるPOST変数に存在しない変数などを記述しておくこともできます.
この場合、フィルタ処理においてその変数は単に無視されます.

TARGET_NAME_send.myfの詳細についてはフィルターの詳細を参照してください.

目次に戻る

Moai認証

万一ユーザの意図しない何らかのスクリプトが裏で実行された場合、CGIの仕様上、正規のUIを介さなくてもリクエストを発行することができてしまいます.
リクエストに含まれるMoai_AuthenticKeyの値を調べることで、このリクエストが確かにこのCGIアプリケーションの正規のUIを介してユーザ自らが発行したものであることを実証することができます.

Moai CGIを使ったWebアプリケーションを開発する場合は、特にファイルを読み書きしたり何らかのシステムのリソースへアクセスするなどセキュリティをより堅固な状態で実行したい処理に関しては、この実証に合格した場合のみ実行を許可する方がよいでしょう.

まず正規のUIにのみMoai_AuthenticKeyの値を埋め込みます.
そのUIのHTMLの中身は、例えば以下のようにして form から post した際にこのMoai_AuthenticKeyがPOST変数に含まれるようにしておきます.
以下で #[Moai_AuthenticKey]# の部分は実際には16桁の16進数記号列になります. この値は Moaiを起動するたびにランダムに変わります.

<input type=hidden name=Moai_AuthenticKey value="#[Moai_AuthenticKey]#">

あるいはURLにQueryStringの形で指定する方法もあります.
例えば command がsaveの場合はMoai_AuthenticKeyを正しく設定する必要があり、それ以外の command ではMoai_AuthenticKeyは別に必要ないといった柔軟性のある指定ができます.

http://127.0.0.1:8124/cgis/my_tool/my_cgi.cgi?command=save&Moai_AuthenticKey=#[Moai_AuthenticKey]#

あるいはURLに次の形で指定する方法もあります. これをMoaiではprefixing Moai_AuthenticKeyと呼んでいます.
外サイトから拾ってきたCGIスクリプト等をMoai_AuthenticKey下で安全に実行させるのに便利です.
CGIスクリプトの実体は Moaiディレクトリ直下の cgis/protected ディレクトリ配下に置きます.

http://127.0.0.1:8124/authentic/#[Moai_AuthenticKey]#/cgis/protected/my_tool/my_cgi.cgi

後述するXhrDMZ側でブラウザにて実行されるJavascriptは、このUIのHTMLに対してXHtmlRequestを発行することができず、従ってMoai_AuthenticKeyの値をユーザ以外が自動的には読むことができないという仕組みになっています.

目次に戻る

XhrDMZ

ユーザにとって秘匿性の高いファイルにアクセスするなど重要なCGIを実行する場合、確かに正規のUIからの要求であることを保証するために正規のUI内にMoai_AuthenticKeyを埋め込み、その値で認証を行うべきです.
これをMoai認証と呼ぶことは前述しました.

しかし仮に他のサイトにこの正規のUIのHTML本文全体を取得するようなJavascriptコードが埋め込まれていたとしたら、Moai_AuthenticKeyの内容を奪取される恐れがあります.
そしてXMLHttpRequestを使えばそれをJavascript上で実現できてしまいます.

このようにXMLHttpRequestは強力な機能ですが、仮にこの機能に全く歯止めを設けなかった場合、上記のような認証を使った処理や世界中にあるログイン認証を使った処理等において重大なセキュリティー上での干渉となる恐れがあります.
よって、XMLHttpRequestが発行できるのは以下の3つすべてが同一であるURL内同士に限るという制限が設けられており、一般にすべてのブラウザはその制限を厳守しなければなりません.
  • スキーム(http、httpsなどの区分)
  • ホスト(127.0.0.1、www.google.comなどいったサーバを示す部分)
  • ポート番号(Moaiなら8124や8125といった部分がこれに相当します.
    これが省略されている場合、この番号はhttpなら暗黙のうちに80を意味します)
この3つをまとめた単位をオリジンと呼ぶこともあり、上記の制限を一般にSame-Origin Policyと呼びます.
しかしオリジンはあまりわかりやすい表現ではないので、ここではある程度正確さは犠牲にしてわかりやすくURLという表現として説明しましょう.

MoaiはこのSame-Origin Policyに基づき、XMLHttpRequestが適用できる範囲を分離するために、Moai本体(Moai CGI実行)用のポート番号とは別に異なるポート番号を持ったURL領域を導入しました.
この隔離領域を我々はXhrDMZと呼んでいます.

実例を示しましょう.
Moai本体が http://127.0.0.1:8124 内で動作していたとします. Moai CGIもこのURL内で動作します.
一方、XhrDMZは http://127.0.0.1:8125 というURLになります.
ポート番号が 8124ではなく8125となっていますが、上記Same-Origin Policyの第3項によって、この違いだけでもMoai本体のURLとは異なるものとみなされます.

XhrDMZのURLはMoai内のアルゴリズムによって妥当なものが自動的に決定されます.
設定によっては 127.0.0.1 の部分は 192.168.1.50 といったLAN上からみたあなたのマシンのIP(Private IP)になる場合もあります.
いずれによ実質的には 127.0.0.1 と同じマシンを示すことになりますが、その表現さえ異なっていればSame-Origin Policyにおいては別のURL(オリジン)とみなされます.

XhrDMZ内の隔離されたURLでブラウザ上に表示されたJavascript(XMLHttpRequest)は、Moai本体のURL内で表示されたHTML本文の内容を取得できなくなり、
従ってそこに埋め込まれた Moai_AuthenticKeyなどの認証に関する値が奪取される可能性を排除できます.

どのようなXMLHttpRequest(JavascriptからHTTPを発行する機能)が含まれているか一般に予測不能な危険性のあるファイルをブラウザで表示する際は、まずそれをXhrDMZに置いてから表示するのが安全です.
Moai本体用のURL下では不用意に表示させるべきではありません.

では具体的にはこれがどのように役に立つのでしょう?
例えば、あなたがWebクライアントとしての能力を持つCGIを開発したとします.
このクライアントは、一般のブラウザが行うような外部サイトへのアクセスとキャッシュ管理システムを完備しているものとします.
そして最終的にはキャッシュされたファイルがあなたのブラウザ上に表示される仕組みとなっているものとします.
そのとき表示されるものの中身は一般には予測不能であるため、別途XhrDMZ上で表示させた方がセキュリティー上よいわけです.

このようにやや特殊な用途ではこのような状況が発生し得るため、XhrDMZがその効力を発揮することでしょう.
Easterはこの種のタイプのツールの一例となっています.
実のところ、MoaiでXhrDMZという機構を開発導入した背景もEasterからの要請を受けてのものです.

目次に戻る

config_cgi.myfについて


interpreter_{platform}セクション
Moaiはこのセクションで宣言された拡張子を持つファイルのみCGIスクリプトとみなします.
それ以外のファイルはCGIスクリプトとはみなされません.
左辺値が拡張子の文字列そのものとなっています.
右辺値が空でない場合、その値はそのCGIスクリプトを実行するためのインタープリタのパスとみなされます.
この時、インタープリタにコマンドラインオプション等がある場合はそれも含めて記述しておきます.
右辺値が空である場合、その拡張子のCGIスクリプトはインタープリタなしで自立して実行可能であることを示します.

{platform}の部分には windows, linux, android, cygwin の4つの識別子が付加され、それぞれのプラットフォーム毎にパスを指定します.

例. Windowsの場合
@@V interpreter_windows
php = ['C:\my_interpreters\php\php-4.4.6-Win32\php.exe']
rb = ['C:\my_interpreters\ruby-1.8.4\bin\ruby.exe']
go = ['C:\my_interpreters\go\bin\go.exe run']
cgi = ['']
@@.

例. Linuxの場合
@@V interpreter_linux
php = ['/usr/bin/php-cgi -q']
rb = ['']
go = ['/usr/local/bin/go run']
cgi = ['']
@@.

例. Androidの場合
@@V interpreter_android
php = ['/usr/bin/php-cgi -q']
rb = ['']
go = ['/usr/local/bin/go run']
cgi = ['']
@@.

例. Cygwinの場合
@@V interpreter_cygwin
php = ['/cygdrive/c/my_interpreters/php/php-4.4.6-Win32/php.exe']
rb = ['']
go = ['/usr/local/bin/go run']
cgi = ['']
@@.

しかしLinuxなど、シェル上でテキストなスクリプトファイルが起動可能な環境では最初の行に #! 指定(これをshebangと呼びます)が使えるので、そのようにした上で右の値は空値にして自立実行させることも勿論可能です.



urp_alias_listセクション
MoaiはURLの第1番目の / から第2番目の / までに続く部分の文字列を別の文字列へ置換することができます(複数指定可能).
これをMoaiではURPAliasと呼びます.

これは長いURPを単に簡略化するだけのために導入された機能です.
easterのCGIスクリプト本体の本来の位置は /cgis/easter/easter.cgi です.
それにも関わらず /easter とだけ指定してもこれが実行されます.
そのからくりはMoaiの提供するこのURPAlias機能により、/easter の部分が /cgis/easter/easter.cgi へと置換されるためです.

例. easterのalias
@@V urp_alias_list
easter = ['cgis/easter/easter.cgi']
@@.

/easter だけの場合は /cgis/easter/easter.cgi
/easter/... と続く場合は /cgis/easter/easter.cgi/...
/easter?... と続く場合は /cgis/easter/easter.cgi?...
/easter#... と続く場合は /cgis/easter/easter.cgi#...
と展開されます.

/easter の後ろに上記以外の文字が続く場合は何も展開されずそのままとなります.



cgi_exec_deny_urpセクション
MoaiはCGIへのパスとして cgis/<一つ以上のディレクトリ>/CGIスクリプト というパターンが与えられた場合のみその実行が許可されます.
その他のパターンでは(aliasを除いては)実行は一切許可されません.

しかし上記を満たすディレクトリ配下であっても、一部のパターンで例外的にCGIスクリプトの実行を許可しないようにしたいことがあります.
このセクションではそのようなディレクトリのパターンを指定できます(複数指定可能).

例. 以下のパターンでは例外的にCGIの実行を不可とします.
/cgis/easter/cachebox/*
/cgis/custom_boy/cachebox/*
/cgis/easter/tmp/*
/cgis/custom_boy/tmp/*

例えば、あなたがWebクライアントとしての能力を持つCGIを開発したとします.
またそれがWebにアクセスした際のキャッシュファイルなどを保存しておくためのディレクトリをcgis配下に用意するものとします.
(easterはまさにこの例の一つです)
このようなやや特殊な状況で、この指定が必要になります.
キャッシュファイルの中にcgiスクリプトが含まれている可能性もあり、それがどんな内容であるかは一般的には予測不能です.
従ってそれをローカルで不用意に実行させるのを認めるべきではありません.



xhrdmz_only_urpセクション
Moaiは このセクションで指定されたパターンについてはXhrDMZからのアクセスに限りファイル取得を認めるものとします(複数指定可能).

ここで指定したフォルダ内には、ネット上から取得したファイルのキャッシュなどを格納しておくとよいです.
このようなファイルは隔離された仮想ホストであるXhrDMZから表示させる方が安全であるためです.
また逆に(XhrDMZではない)通常のMoai WebServerを介しては、これらを参照することは不可能であるものとします.

これはつまり、通常のMoai WebServerではそのようなファイルを不用意に表示すべきでないことを意味します.
そのようなファイルには未知のXMLHttpRequest(JavascriptからHTTPを発行する機能)が含まれている可能性があるためです.
これを不用意に正規のMoai WebServerの方で表示させては、(Moai WebServer上の)他のCGI群への危険因子となる恐れがあります.

XhrDMZからファイル取得できるのは、このxhrdmz_only_urpセクションで指定されたものとpublic_urp セクションで指定されたものの二つに限ります.
それ以外はファイル取得要求は拒否されます.

このセクションで指定されたパターンについては、CGIの実行は認められません.
指定されたURPの拡張子がCGIスクリプトのものであってもファイル取得要求とみなされます.

例. easter用の設定.
@@L xhrdmz_only_urp
/cgis/easter/cachebox/*
/cgis/easter/dustbox/*
/cgis/easter/favorite/*
/cgis/easter/stockbox/*
/cgis/easter/userbox/*
@@.



xhrdmz_cgi_urpセクション
Moaiは このセクションで指定されたパターンについてはXhrDMZからのCGI実行許可します(複数指定可能).

このセクションは非常に特殊なもので、安全上差障りのない用途に限りますが、XhrDMZ内からある種の特別なCGI処理を実行させたいことがあります.
このセクションで指定するCGIスクリプトは、それがXhrDMZからの実行要求であることを内部で正しく認識する機構を備えていなければなりません.
また、XhrDMZからの要求に対して越権的な処理が行使されることのないよう適切な防御機構を備えておく必要があります.
(例えばeasterの場合、それ自体がそのような防御機構を備えています)

XhrDMZからのCGI実行は、ここで指定されたパターン以外では一切許可されません.

例. easter用の設定.
@@L xhrdmz_cgi_urp
/cgis/easter/easter.cgi
@@.

この指定は、xhrdmz_only_urp セクションの指定より優先されます.
即ち、このセクションで指定したCGIスクリプトが、xhrdmz_only_urp セクションで指定されていたパターンにマッチした場合は、このCGIスクリプトの実行に限り許可するものとします.



public_urpセクション
Moaiはこのセクションで指定されたURPのパターンにマッチした場合、いかなる場合もそのURPの中身のファイル取得を認めます.
すなわち Moai WebServerやXhrDMZからのファイル取得アクセスも可能であり、そのときMoai_AuthenticKeyも必要としません.
ここで指定したフォルダ内にはネットワーク上の他マシンに公開しても全く問題ないようなファイルのみを格納すべきです.

例.
@@L public_urp
/moai.png
/msty.css
/cgis/easter/publicbox/*
/cgis/cgi_developers/publicbox/*
@@.



protected_urpセクション
Moaiはこのセクションで指定されたURPのパターンにマッチした場合、Moai_AuthenticKeyが正しく指定されている場合のみURPの中身のファイル取得を認めます.
URPが意味するものがCGIスクリプトの場合は、Moai_AuthenticKeyが正しく指定されている場合のみその実行を認めます.

例.
@@L protected_urp
/protected/*
/doc_root/protected/*
/cgis/protected/*
@@.

この例では、/protected/file や protected/dir/file といったファイルを参照するためにMoai_AuthenticKeyを正しく付加する必要があります.
また/cgis/protected/cgi_script.cgi のようなCGIを実行するために同様にMoai_AuthenticKeyを正しく付加する必要があります.



fsys_map_listセクション
Moaiはこのセクションの右辺の文字列リストにおいて、第1番目で指定された「URL上のパスへのアクセス」を第2番目で指定された「ファイルシステム上の実ディレクトリへアクセス」と等価とみなします.
Moaiではこれを「第1番目が第2番目にマッピングされている」などと呼びます. UNIXシステムなどにおけるマウントと形式的には同じ概念です.
第2番目の文字列には#[profile_dir]#を含めることができ、これはMoai config.myfにおけるprofile_dirの値に変換されます.

さらに文字列リストにおいて第3番目の文字列が存在する場合、それを環境変数とみなします.
そしてその環境変数がOSにおいて定義されている場合、Moaiは第2番目の替わりに第3番目の環境変数の値を実ディレクトリとしてマッピングします.
定義されていない場合は、第2番目を実ディレクトリとしてマッピングします.

@@V fsys_map_list
favorite = { ['/cgis/easter/favorite'] ['#[profile_dir]#/favorite'] ['EST_FAVORITE_DIR'] }
stockbox = { ['/cgis/easter/stockbox'] ['#[profile_dir]#/stockbox'] ['EST_STOCKBOX_DIR'] }
userbox = { ['/cgis/easter/userbox'] ['#[profile_dir]#/userbox'] ['EST_USERBOX_DIR'] }
@@.

= より左の左辺値はMapping識別子と呼ばれ、それぞれの行について一意な文字列でなければなりません.
Mapping識別子は現バージョンのMoaiでは実際には使われていませんが、fsys_map_list セクションの仕様では一応これの付加は必須としてあります.


目次に戻る

無用なホストへの接続をブロックする(ignore_hosts機能)

hosts.myf 内の ignore_hosts に記載されているホストへブラウザが接続しようとした場合Moaiはその通信そのものをブロックします.

例えばあなたがいつも見ているサイト内に大量の広告があり、それらのバナーなどが外部サイトにある場合このままではそれらの外部サイトすべてに対して「TCPコネクションの確立」を行わなければなりません.
「TCPコネクションの確立」という処理は非常に重い(時間がかかる)ので、本当に表示の高速化を図りたいなら無駄な接続を未然に防ぐのが一番効果的です.

以下に例を示します.
ちなみにここでのパターンの記述においてはtargetでの指定と同様の形でワイルドカードを使うこともできます.

@@L ignore_hosts
free2.jp
api.digiket.com
js.ad-stir.com
aladdin.genieesspv.jp
*.socdm.com
j.microad.net
www.assoc-amazon.jp
@@.

hosts.myfファイル中に例えばこのように記述しておくと、あなたがいつも見ているサイトのページ中に上記の外部サイトへアクセスしようとする部分がある場合、それらの外部サイトへの接続を未然に防止します.
そして替わりにその部分には以下のようなメッセージが表示されます.

Moai : Ignored Host Blocking[blocked_hostname] sock=[1234].

blocked_hostnameの部分には、どのホストへのアクセスをブロックしたかが表示されます.
つまり上記で指定したホストのいずれかが表示されるはずです.
sockの部分は気にする必要はありませんが、接続の際に使ったソケットの番号を示しています.

目次に戻る

POST時の確認メッセージ表示(post_confirm機能)

POSTとは掲示板などへスレ立てやレス投稿をする際に行われるHTTPリクエストのことです.
そしてこのときHTTPヘッダやサーバが定義した変数(POST変数と呼ぶ)、クッキーの値などが送信されます.

config.myf内のpost_confirmの値が on のとき、これらの値をすべて確認表示する画面を出すことができます.
テキストだけの非常に地味な画面ですが、これからそのサイトに何が送られるかが余すことなく表示され、状況を把握や分析をするには十分役に立つでしょう.
この画面が出ている段階では、まだ投稿は行われていません. 一番下にある「Send」ボタンを押すことで、この内容で実際に投稿されます.

ただし、この画面が表示されるのはhosts.myf内にあるpost_confirm_hostsに記載されたホストに対してPOSTする場合のみです.
そこに記載されていないホストに対してはpost_confirmがonであってもこの画面は表示されません.
ちなみにここでのパターンの記述においてはtargetでの指定と同様の形でワイルドカードを使うこともできます.

なぜpost_confirm_hostsでわざわざ対象となるサイトの範囲を絞るのかと思われる方もいるかもしれません.
理由はNico動画など一部のサイトでは、スクリプトなどで自動的なPOSTが内部で行われている場合があり、そのような場合これを有効にしておくと問題が発生するためです.

post_confirm の値が off のとき、すべてのサイトに対してこの確認画面は表示は無効となります.

ブラウザの掲示板用アドオンなどとこのモードが内部処理で競合し、レス送信などがうまく行えない場合があります.
この場合もやはりpost_confirmそのものを無効にしておく必要があります.
もっともこの確認画面表示は今となっては解析用に使用するくらいであり普通は必要ないものであるため、バージョン1.0よりこの指定はデフォルトではoffとしてあります.
どうしても確認画面を出したい場合はアドオンの方を一時的に無効にしてレス投稿しましょう.

目次に戻る

他のマシンからの接続を許可/制限する

Moaiは他のマシンからの接続の受付もサポートします.

これはご家庭にある2台目3代目のマシン等から、Moaiの起動している1台目のマシンへ接続してMoaiの提供する機能を利用するといったような用途を想定しています.
概念的には以下のような接続になります.

他のマシン上にあるブラウザMoaiの起動しているマシン上にあるMoai送信先のサイト

この接続の許可/不許の防衛機構としてMoaiは2段階設けてあり、あるIPからの接続を通過させるには、
この双方を許可する必要があります.
  • 第1の段階 : hosts.myf内のacceptable_hostにおける指定
    この値でANYを指定することにより他のマシンからの接続が可能となり、LOOPBACKを指定することにより、
    自マシン以外は問答無用で遮断するようになります.
    デフォルトでは安全のため、一応LOOPBACKとしてあります.

  • 第2の段階 : hosts.myf内のaccess_allow_ips と access_deny_ips の指定
    access_allow_ips において接続を許可するIP群を指定します(ホスト名ではなく必ずIPでなければならない).
    access_allow_ipsに何も記述しない場合は、localhostを除くすべてのマシンからの接続は不許となります
    (この場合、接続元にはForbiddenメッセージを返す形になる).

このaccess_allow_ipsの指定だけでも通常十分ですが、ここからさらに例外的に接続を不可とするIP群をaccess_deny_ipsにおいて指定することができます.

例えばLAN内からのみの接続を許可するには、典型的には以下の記述でよいでしょう.
ちなみにパターンの記述においては一行につき一箇所のみにワイルドカードを使うことができます.

@@L access_allow_ips
192.168.*
@@.

さらに例えばLAN内の192.168.1.66のマシンのみ理由あって接続を不許としたい場合は、access_allow_ipsに以下を記述しておくとよいでしょう.

@@L access_deny_ips
192.168.1.66
@@.

勿論、ルータやOSなどにあるファイアウォール機能でWAN(外部インターネット)からのポート8124への不要な接続を防止するのもセキュリティ上基本的な対策となります.

目次に戻る

外部プロキシを使いたい場合どうするのか?

Moaiでは次の接続仲介先として外部プロキシ(parent proxy, 親プロキシなどとも呼ばれる)を設定することができます.
MoaiをローカルウェブサーバとしてEasterを使用している場合は、概念的に次のような接続になります.

あなたのブラウザローカルウェブサーバMoaiEaster(Moai CGI)外部プロキシ 送信先のサイト

一方、Moaiをローカルプロキシとして使用している場合は、概念的に次のような接続になります.

あなたのブラウザローカルプロキシMoai外部プロキシ 送信先のサイト

これを実現するためには config.myf の parent_proxy の値を以下の形式で与えます.

外部プロキシのホスト名またはIP:外部プロキシのポート

例えば以下のように記述することで外部プロキシproxy.example.net:3128を経由して目的のサイトへアクセスすることができます(proxy.example.net:3128が有効であればですが).

parent_proxy = ['proxy.example.net:3128']

外部プロキシを使わない場合(目的のサイトへ直接アクセスする場合)は値として以下のようにNONEを指定します.
(あるいは空値または :0 でもよい)

parent_proxy = ['NONE']

以下の手順により、現在使用するプロキシを簡単かつ瞬時に切り替え可能に設定することができます.

  1. moaiと同フォルダ内にparent_proxy.txtというファイルを作る.
  2. そのファイル内に使用したいプロキシの候補を行単位で複数列挙しておく.
  3. 「Moaiエンジン設定」の画面のparent_proxyという項目で、これらのプロキシがメニュー表示されるので好きなものを選択する.


ところでIPアドレスを変えるだけなら通常はルータリセットで十分ですし、有効な外部プロキシを見つけるのもそう簡単ではありません.
というわけでルータリセット等が使える状況ならばそちらの使用をお勧めします.

目次に戻る

外部プロキシの適用を一部のサイトのみに限定する

例えば、あるサイトdanger.netを見る場合だけ外部プロキシを使用するものとします.
そしてその他すべてのサイトでは外部プロキシを使用しないものとします.
外部プロキシを介すると表示が遅くなったりするので、使う必要がないサイトならば使わない方が快適です.

その場合、hosts.myf内のproxy_applyに外部プロキシを使用したいサイトを記述しておきます.
また、反対にhosts.myf内のproxy_exceptに例外的に外部proxyを使用しないサイトを記述しておきます.
尚、proxy_applyと被るものについてはproxy_exceptの指定が優先されます.

以下に例を示します.

@@L proxy_apply
*.2chan.net
taruo.net
@@.

@@L proxy_except
jun.2chan.net
@@.

上記の例では proxy_applyに *.2chan.net というパターンがあります.
最終的にアクセスする目的のサイトが例えば may.2chan.net や img.2chan.net の場合はこのパターンに一致するので、このときこれらのサイトに対しては外部プロキシを中継して接続が行われることになります.

しかし一方、proxy_exceptに jun.2chan.net という指定があることに注意してください.
これは *.2chan.net というパターンに一致しますが、proxy_exceptで指定されているため、jun.2chan.net に対してだけは例外的に外部プロキシを使わない形になるということです.
たとえばjun.2chan.netに対してだけは、レス投稿などせずお宝画像を手っ取り早く収集するために閲覧しているとします.
その場合は処理が遅くなるproxyを挟むのは無駄でしょう.
上記の記述に存在しないその他の一般サイトにアクセスする場合は外部プロキシは使われません.

また、この考え方を逆にした指定もできます.
例えば、あるサイトを見る場合のみ外部プロキシを使用しないとしましょう.
その他すべてのサイトでは外部プロキシを使用したいとします.
その場合は以下のようにすればよいでしょう.

@@L proxy_apply
*
@@.

@@L proxy_except
safe.net
127.0.0.1
localhost
192.168.*
@@.

上記のように記述した場合、まずproxy_applyにおいて全てのサイトが外部プロキシの適用対象となります.
次にproxy_exceptにより、そこから例外的に使用が除外されるサイトが指定される形になります.
この例では、最終的にアクセスする目的のサイトがsafe.netまたはlocalhostや127.0.0.1、あるいはIPが 192.168.* のLAN上のマシンの場合、外部プロキシは使われません.
その他の一般サイトにアクセスする場合は現在の外部プロキシが使われることになります.

目次に戻る

その他のローカルプロキシにチェーンする場合

Moaiはその他のローカルプロキシと直列に繋げることもできます. 例えばPolipoとのコラボも可能であることを確認しています.
これによってPolipoとMoaiの恩恵を同時に享受できます. 概念的に次のような接続になります.

あなたのブラウザローカルプロキシMoaiローカルプロキシPolipo送信先のサイト

設定手順は外部プロキシを指定する場合と全く同様に行えます.
おそらくデフォルトではPolipoは8123ポートを使っているので、parent_proxyに直接localhost:8123を指定するかあるいは parent_proxy.txt に localhost:8123 を追加しておき、必要になったら「Moaiエンジン設定」の画面においてparent_proxyからそれを選べばよいでしょう.

あるいは以下のように順番が逆でも可能です.

あなたのブラウザローカルプロキシPolipoローカルプロキシMoai送信先のサイト

この場合はPolipo側の設定ファイルを変更し、Moai(ポート8124)へ接続するようにしなければなりません.
すなわちPolipoのconfig.cfgにおいて parentProxyをlocalhost:8124とする形になるでしょう.

目次に戻る

プラグイン機能について

Moaiのプラグインでは現バージョンでは次のような拡張処理を実現できます.
  • initiate :
    Moai Serverが起動した際の初期化処理の一環としてこの関数が呼び出される.
    フィルター処理に特別な初期化が必要な場合などに利用できる.

  • on_post :
    POST時(レス投稿時など)に呼び出されて追加で実行される処理の実現.
    これはさらなる高度なsend_filter処理をプログラミングで実現するための機構でもある.

  • on_response :
    リクエストに対する応答(例えば単純にHTMLにアクセスしてその内容を受信する場合など)に呼び出されて
    追加で実行される処理の実現.
    これはさらなる高度なrecv_filter処理をプログラミングで実現するための機構でもある.
pluginの実体はpluginsフォルダ内のTARGET_NAME.dll(Linuxなどの場合TARGET_NAME.so)というファイルです.
これらの独自に作ってみたいというC言語プログラマの方はこちらにそのヒントを記述しておいたので
興味があれば参照してください.

目次に戻る

This article was written by:
none image

Mr.Moai

@znk project