概要
本連載では、ウィジェット関連の技術動向についてご紹介していきます。第2回となる本稿ではOpenAjax Alliance で仕様が策定されたOpenAjax Hub 2.0の機能と使い方についてご紹介します。特にOpenAjax Hub 2.0では複数のウィジェットを組み合わせたコンポジット・アプリケーションを安全に実現するためのセキュア・マッシュアップ機能が大きな特徴です。マッシュアップによるセキュリティ的な問題と、OpenAjax Hub 2.0の実現するセキュリティの仕組みについて解説します。
なお、一般にアプリケーション開発の世界では、こうした単体である程度の機能を提供するミニアプリという意味だけではなく、GUI(グラフィカルユーザー・インターフェース)を構成するボタンや入力フィールドといった粒度の小さな部品という意味でも“ウィジェット”という言葉が使われます。本稿ではことわりがない限り、“ウィジェット”といえば前者を総称する言葉として使うこととします。
OpenAjax Hub 2.0
OpenAjax Allianceとは、Ajax技術の推進と標準化を行っている業界団体で、主要なベンダやオープンソースプロジェクトなどが参加しています。OpenAjax Allianceでは標準化された仕様を公開するとともに、そのリファレンス実装をオープンソースとして公開しています。
OpenAjax Hub は、ひとつのWebページの中で複数のウィジェットが共存し、お互いに通信を行うためのJavaScript上のフレームワークです。OpenAjax Hubの中核をなすのは、ウィジェット間でメッセージ通信を行うためのPublish/Subscribe API です。
図1はウィジェットを組み合わせた典型的なマッシュアップの一例です。画面の左側にあるウィジェットはデータベースから取得した顧客リストをテーブル上に表示するウィジェットです。顧客リストには個々の顧客の名前や住所、電話番号などが表示されています。画面の右側は地図表示を行うウィジェットです。異なる機能を持つウィジェットを連携させることで、たとえば顧客リストのそれぞれの行をクリックするたびに、その顧客の住所を地図上で表示させるというように、個別に使うよりも便利なアプリケーションを構築することができます。
ここで、ウィジェットを組み合わせている側のアプリケーション(ウィジェットの外側)を、ホストアプリケーションと呼ぶことにします。
OpenAjax Hub仕様では、ホストアプリケーションが「通信ハブ」という機能を提供し、そのハブを通じてホストアプリケーションとウィジェット間、またウィジェット同士の間でメッセージ通信を行うための仕組みを提供します。各ウィジェットはトピック名で識別される名前つきのチャネルを使用し、publish / subscribe (発行・購読)という非同期のメッセージ通信方式を利用します。
メッセージを受信したいとき、ウィジェットはJavaScriptのコールバック関数を登録することにより,特定のトピックを購読します。また、メッセージを送信したいときは、トピック名を指定してハブに対してメッセージを発行します。ハブを介した通信は一対一である必要はなく、一対多、多対多の通信でもかまいません。不特定数のウィジェット間で、ハブを介した通信機能を提供するのがOpenAjax Hub の publish/subscribe APIです。
OpenAjax Hub仕様では、異なるセキュリティ機能を持つ2種類のハブ機能が定義されています。
- 管理されないハブ (Unmanaged Hub) は、ブラウザ上の同一のフレーム内のウィジェット間でメッセージ通信を行うための単純な機能で、セキュリティの仕組みは持ちません。
- 管理されたハブ (Managed Hub) は OpenAjax Hub 2.0で新しく導入された機能で、悪意を持ったウィジェットによる攻撃を防ぐセキュリティ機能を実現します。
マッシュアップによるセキュリティ上の問題とは
ところで、複数のウィジェットを組み合わせてマッシュアップを行った場合に、どんなセキュリティ上の問題が発生するのでしょうか。
セキュリティ機能を使わずにウィジェットのマッシュアップを行った場合、異なるサービス提供者から提供されたウィジェットが同じWebページ上で統合されるため、悪意を持ったウィジェットが紛れ込んでいた場合に、その中に含まれるJavaScriptによって他のウィジェットやホストアプリケーションを攻撃することが可能になります。
例えば前述のマッシュアップされたウィジェットの例で、地図表示ウィジェットの中にもしも悪意のあるスクリプトが含まれていると、
- 顧客リストウィジェットから顧客名や住所、電話番号などを盗む
- 顧客リストに表示されている情報を改ざんする。たとえば住所や電話番号を偽のものに書き換えてユーザを混乱させる。
- 顧客リストウィジェットがバックエンドのサーバにアクセスするための認証されたセッション情報を盗み、セッション乗っ取る
といった攻撃が可能になります。
現在のブラウザのアーキテクチャは、同一起源ポリシー (Same-Origin Policy) と呼ばれるセキュリティモデルを取り入れており、異なるWebサーバからダウンロードされたコンテンツがそれぞれブラウザのウィンドウやフレーム内に表示されたとき、ウィンドウやフレームがサンドボックスの役割を果たして、サンドボックスをまたがったコンテンツ間のアクセスを制限します。しかしひとつのフレーム内にウィジェットがマッシュアップされると、すべてのウィジェットが同じサイトからダウンロードされたとみなされ、ひとつのサンドボックスの中で実行されます。個々のブラウザウィンドウやフレーム上で表示されているコンテンツはブラウザの内部で Document Object Model (DOM)というツリー型のデータ構造で表現され、ブラウザの提供するAPIによってJavaScriptから自由にアクセスすることができます。そのためJavaScriptによって、マッシュアップされた他のウィジェットに属するデータを読み取ったり上書きしたりすることができてしまいます。(図 2(a))
OpenAjax Hub 2.0の管理されたハブ機能を使うと、個々のウィジェットを別のIFRAM(インラインフレーム)内に表示します(図2(b))。このときにウィジェットが別のサーバからダウンロードされるようにすることで、ブラウザの持つサンドボックス機能により、ウィジェット間、ウィジェットとホストアプリケーション間の実行環境が分離され、お互いのDOMやJavaScriptオブジェクトにアクセスできなくなります。ブラウザの同一起源ポリシーは、コンテンツの起源を判定するのにURL内のサーバ名を文字列として比較します。そのため、実体が同じサーバであっても、仮想ホストなどの仕組みにより異なるサーバ名で参照している限り、サンドボックスが機能します。
管理されたハブ(ManagedHub)のセキュリティ機能
管理されたハブによるセキュリティ機能の概要は以下のようなものです。
- 個々のウィジェットをサンドボックス内で実行することにより、DOMやJavaScriptのオブジェクトなどのデータがウィジェットごとに分離されます。つまり、ウィジェット内に悪意を持ったスクリプトが含まれていたとしても、親となるホストアプリケーションや他のウィジェットの持つDOMや JavaScript上のデータやCookieなどにはアクセスできないため、 攻撃を防ぐことができます。
- 個々のウィジェットは、OpenAjax Hubの提供する Publish/Subscribe APIを通じてのみ外部と通信を行うことができます。
- ホストアプリケーションのセキュリティ・マネージャにより、どのウィジェットがどのウィジェットに対してpublish/subscribe通信できるかというセキュリティポリシーを定義することができます。
また、仕様上では実現方法について詳しく定めていませんが、OpenAjax Hub 2.0 の実装は安全性のために次のような機能を実現することが求められています。公開されているOpenAjax Hub 2.0のリファレンス実装ではこれらの機能が実装されています。
- 正しいウィジェットがロードされることを保証するための仕組み
- ウィジェット間での安全な秘匿通信を実現するための仕組み
- メッセージの改ざんや成りすましを防ぐための仕組み