IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Web development | Sample IT projects  >

Active Content Filtering で強化する Project Zero および WebSphere sMash アプリケーションのセキュリティー

アクティブ・コンテンツを管理してアプリケーションのセキュリティーを強化する

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

サンプルコード

原文はこちら

原文はこちら


レベル: 中級

Todd Kaplinger, Project Zero Architecture & Development, IBM 
Masayoshi Teraguchi (teraguti@jp.ibm.com), Researcherr, IBM
Gang Chen (gangchen@us.ibm.com), Consulting I/T Specialist, IBM 

2007年 11月 06日
2008年 6月 23日 更新

ACF (Active Content Filtering) を使用して、クロスサイト・スクリプティングをはじめとする一般的な Web 2.0 ベースのアプリケーションに対する攻撃をかわし、Project Zero アプリケーションのセキュリティーを劇的に向上させてください。ACF は Project Zero に含まれる分解可能なコンポーネントで、このコンポーネントが提供するライブラリーでは要求データ (要求パラメーターなど) とクライアントに送信される応答出力からアクティブ・コンテンツを取り除くことができます。この記事を読んで、アクティブ・コンテンツが存在する可能性のある Project Zero の環境に ACF を適用するという強力な手段を身につけてください。

編集者からの注記: IBM® WebSphere® sMash および IBM WebSphere sMash Developer Edition は、非常に高い評価を受けた Project Zero のインキュベーター・プロジェクトをベースにしています。Project Zero は WebSphere sMash の開発コミュニティーであり、最新のビルドや、最新の機能、そしてコミュニティーのサポートを利用したアプリケーションを開発するための無料のプラットフォームを今後も提供していきます。

ACF の概要

ACF の概要の一環としてまず理解しておかなければならないのは、Project Zero とは何であるかです。以下の説明は、Project Zero の Web サイトから引用しています。

「Project Zero は IBM® 内で始まったインキュベーター・プロジェクトで、その焦点は次世代の動的 Web アプリケーションのアジャイル開発に置かれています。Project Zero は、代表的な Web 技術をベースにアプリケーションを作成し、組み立て、実行するための単純な環境を導入します。Project Zero の環境には、Groovy および PHP のスクリプティング・ランタイムが組み込まれ、REST スタイルのサービス、統合マッシュアップ、そしてリッチ Web インターフェースを作り出すことを目的に最適化されたアプリケーション・プログラミング・インターフェースが備わっています」。

Project Zero が主に対象としているのは次世代の動的 Web アプリケーション (一般に Web 2.0 の傘下に分類されるアプリケーション) なので、この記事ではマッシュアップ、ウィキ、ブログといったユーザー提供のコンテンツが含まれる対話型 Web アプリケーションに焦点を絞ります。このようなアプリケーションをサポートするために Project Zero がライブラリーとして用意しているのが ACF です。アプリケーション開発者が Zero アプリケーションの一部として組み込める ACF は、この類の対話型アプリケーションで発生する可能性のあるクロスサイト・スクリプティングなどの問題にアプリケーションがさらされる危険を抑える方法を開発者に提供します (クロスサイト・スクリプティングについての説明は、「参考文献」に記載したリンクを参照してください)。

この記事で使用する例について

著者からの注記: この記事を最初に執筆した時点では、アプリケーション開発者が ACF の威力を活用するには、(アプリケーションの zero.config の中で明示的なルールを定義する) 宣言型の手法か、(提供されている API を利用する) プログラムによる手法のいずれかを使う必要がありました。しかし開発チームでは、Project Zero コミュニティーやこの記事の読者からのフィードバックを基にして、以下のシナリオでの ACF による保護のデフォルト設定を提供できるようになりました (zero.acf を依存関係として追加する必要があります)。

  • 要求パラメーター: 任意の URI 宛てに送られていくすべての要求パラメーターから、アクティブ・コンテンツ (JavaScript、Applet、ActiveX などのオブジェクト) を取り除きます。これらのパラメーターは HTML フラグメントとして扱われます。
  • JSON コンテンツ要求: 任意の URI 宛てに送られていく JSON オブジェクトに含まれるすべてのストリング値からアクティブ・コンテンツを取り除きます。この場合、すべてのコンテンツ・タイプが対象になります。
  • JSON コンテンツ応答: 任意の URI から送られてくる JSON オブジェクトに含まれるすべてのストリング値からアクティブ・コンテンツを取り除きます。この場合、text/html を除くすべてのコンテンツ・タイプが対象になります。

サンプル・アプリケーションの ACF をデフォルトで無効にするには、zero.config ファイルに /config/acf/enableByDefault=false という構成オプションを含めるようにします。デフォルトで ACF を有効にすると、アプリケーションの要求を満たさなくなる場合もあるので、この記事では宣言型の手法とプログラムによる手法を使って ACF を活用するようにします。この記事のセクションで、デフォルトで ACF を有効にするフラグを活用できるセクションでは、その旨を記してあります。

この記事に記載する例は、単純で基本的な使用事例から徐々に複雑さを増した使用事例に沿って ACF を説明することを目的としています。これらの例は、前の例で説明した内容を土台に展開していきます。それぞれの例については以降のセクションで詳しく説明しますが、要約すると以下のようになります。

  • 例 1 は基本的な Ajax 対応ページで、このページではユーザーが外部のロケーションから受信した記事に対してコメントを投稿することができます。この例では、ユーザーのコメントや記事にアクティブ・コンテンツ (JavaScript など) が含まれている場合に発生する事態について説明します。
  • 例 2 では、例 1 のページに ACF ライブラリーのサポートを追加します。この例では、記事にアクティブ・コンテンツ (JavaScript など) が含まれる場合に ACF フィルタリングがどのように機能するかを説明します。
  • 例 3 では、例 2 のページにさらに要求パラメーターの ACF フィルタリングのサポートを追加します。 この例では、ユーザーのコメントにアクティブ・コンテンツ (JavaScript など) が含まれる場合に ACF フィルタリングがどのように機能するかを説明します。
Project Zero コミュニティー
Project Zero の Web サイトをざっと見て、Project Zero が最近の Web アプリケーションに強力な (しかも極めて単純な) 開発および実行プラットフォームをどのように提供するかを確かめてください。コミュニティーではプロジェクト開発についての議論、開発者の支援を活発に行っています。あなたの意見もぜひお聞かせください。

この記事の「ダウンロード」セクションからサンプル・アプリケーションをダウンロードして、実際に ACF の機能を有効にしてみてください。Web ニュース・アグリゲーション兼ブログ・アプリケーションを模したこのサンプル・アプリケーションでは、今日のニュースに関するコメントをサーバーに投稿すると、そのコメントが他の閲覧者に表示されるようになっています。図 1 に示すようにページの先頭にはニュース・アグリゲーションの結果が表示され、この表示から、悪意の疑いがあるコンテンツ (点滅する赤いテキスト) が注入されていることがわかります。Original source of the news というタイトルのペインをクリックすると、ニュース・アグリゲーションの元の HTML コンテンツが表示されます。画面の一番下にある Enter your comments here. のテキスト域には、コメントを書き込むことができます。書き込んだコメントは、Post your comment ボタンをクリックすると同時に All comments 域に表示されます。


図 1. ACF のサンプル

サーバー・サイドのコンポーネントは IBM の最新 Web 2.0 プラットフォーム、Project Zero でビルドされています。サンプル・アプリケーションのフロント・エンドで使用しているのは 2 つの新興技術、Dojo と Ajax です。

Project Zero は、zero.acf ライブラリーによって ACF サポートを提供します。このライブラリーは、アプリケーション依存関係の 1 つとして ivy.xml ファイルにあらかじめ構成されています。この記事には、サンプル・アプリケーションを含んだ zip ファイル (ACFSampleApp-1.0.0.zip) が用意されています。任意の zip ユーティリティーを使って、このリソースをお望みの場所に解凍してください。

コマンドラインを使用する場合:

  • WebSphere sMash Web サイトの指示に従って、IBM WebSphere sMash コマンドライン・ユーティリティーをインストールしてください (「参考文献」参照)。
  • カレント・ディレクトリーを、サンプル・アプリケーションを解凍したディレクトリーに変更します。
  • zero start と入力してアプリケーションを起動します。

アプリケーション・ビルダーを使用する場合

  • WebSphere sMash Web サイトの指示に従って、IBM WebSphere sMash コマンドライン・ユーティリティーをインストールしてください (「参考文献」参照)。
  • CLI がインストールされている zerodirectory までナビゲートして startAppBuilder スクリプトを実行することで、アプリケーション・ビルダーを起動します。
  • パネルの左側にある、Browse Applications リンクを利用して WebSphere sMash リポジトリーから OpenID デモ・アプリケーションをインストールします。
  • ACFSampleApp アプリケーション (「ダウンロード」参照) に関連付けられている実行ボタンをクリックすることで、アプリケーションを起動します。

アプリケーションが起動したら、ブラウザーで http://localhost:8080 にアクセスしてサンプル・アプリケーションのテストを開始します。

シナリオ 1: ACF 応答フィルタリング

最初のシナリオは、ACF 応答フィルタリングを使って悪質なコンテンツを防ぐというものです。ACF 応答フィルタリングは一連のフィルタリング・ルール (後で説明) に基づいて、応答メッセージから JavaScript などのアクティブ・コンテンツを取り除きます。サンプル・アプリケーションを実行すると、ページ先頭のニュース見出しに MALICIOUS というテキストが注入されて点滅するはずです。これは、最初のニュース・フィードにアクティブ・コンテンツ (JavaScript コード) が含まれているためです。Original source of the news というタイトルのペインをクリックすると、このニュース・フィードのソースを確認することができます (図 2 を参照)。


図 2. ニュース見出しに示された悪意のあるテキスト

ここで、ACF 応答フィルタリングを使用して、この悪意のあるテキストがアプリケーションにダメージを与えないようにする方法を見てみましょう。ACF 応答フィルタリングは zero.config 構成ファイルで制御されます。ACF 応答フィルタリングを有効にするには、この構成ファイルに以下のエントリーが必要です (リスト 1 を参照)。


リスト 1. ACF 応答フィルタリングの構成
                
[@include ${zero.acf}/config/acf.config]
uri=/resources/newsViewer

サンプル・アプリケーションには上記の構成が用意されているので、zero.config ファイルでこのセクションのコメントを外してから Project Zero サーバーを再起動するだけで、ACF は有効になります。図 3 に示されたこの 2 行の構成プロパティーが ACF エンジンに指示している内容は、ACF に事前定義されたフィルタリング・ルールのデフォルト・セットを使用して URI /resources/newsViewer から送信された応答からアクティブ・コンテンツを取り除くという単純なものです。


図 3. ACF 応答フィルタリングの構成

これでアプリケーションを再度実行すると、煩わしい点滅テキストは表示されなくなります。

シナリオ 2: ACF 要求フィルタリング

Web 2.0 をテーマとしたアプリケーションとの連携や、そのようなアプリケーションへの参加においては大抵、ユーザーにホスティング・サーバーに対するコンテンツの入力または投稿を許可しています。これによってもたらされるのが、サーバーが悪質なコンテンツ (JavaScript など) をレンダリングした場合のセキュリティー問題です。サンプル・アプリケーションでは、ユーザーがサーバーにコメントを投稿できるようになっています。悪意のあるスクリプトによる脅威の実例として、リスト 2 のテキストを Enter your comment here. 域に入力してください。


リスト 2. 悪意のあるスクリプトの例
                
<script>alert("You are under attack!")</script>

Post your comment ボタンをクリックしても All comments 結果域には何も表示されず、代わりに煩わしい JavaScript ポップアップが表示されるはずです。

では、どのようにして HTTP 要求をフィルタリングして悪意のある JavaScript の攻撃を防げばよいのでしょう。そのために、ACF では強力な一連の API を用意しています。これらの API は、フィルタリング・ルールのセットに基づき、JavaScript などのアクティブ・コンテンツが HTTP 要求パラメーターに含まれているかどうかを通知します。アクティブ・コンテンツが検出された場合には、適切な例外をスローすることも、あるいは XMLEncoder という Project Zero の別のライブラリーを使用してアクティブ・コンテンツをエンコードし、実行中にそのコンテンツが実行されないようにすることもできます。この例では、着信コメントの POST 要求を処理するサーバー・サイドのコンポーネントは commentHandler.groovy クラスなので、このクラスに ACF 要求フィルタリング・コードを追加することになります。それには、サンプル・アプリケーションに用意された ACF 要求フィルタリング・コードのコメントを外して、この機能を有効にするだけです (図 4 を参照)。


図 4. ACF 要求フィルタリングの有効化

この機能をテストするために Zero サーバーを再起動する必要はありません。アプリケーションのページをリロードして、コメント域に前と同じ JavaScript を入力してください。当然、害のあるコンテンツを投稿することはできなくなっています (図 5 を参照)。


図 5. ACF 要求フィルタリングの例

クライアント・サイドでのフィルタリング

これまではサーバー・サイドに焦点を当てて、悪意のある攻撃を防ぐ上で ACF が発揮する威力を説明してきましたが、さらにアプリケーションのセキュリティーを強化するには、最近の JavaScript ライブラリーで導入しているクライアント・サイドでのエンコーディング機能を使用するという手段も検討できます。その一例は Dojo フレームワークです。例えば Dojo のリッチ・テキスト・エディターはユーザー入力を比較的安全に使用できる HTML コードに自動的にエンコードします。
注: クライアント・サイドでのエンコーディングは非常に効果的ですが、サーバー・サイドでの ACF フィルタリングの代わりにはなりません。ユーザーがクライアント・サイドでの対策の裏をかくのは、それほど大変なことではないためです。

サンプル・アプリケーションには Dojo ベースのリッチ・テキスト・エディターが用意されています。アプリケーションをテストするにはブラウザーで http://localhost:8080/clientfilter.gt にアクセスしてください。図 6 に示すように、Dojo エディターで書き込んだ JavaScript はサーバーに送信される前にエンコードされるため、ブラウザーが投稿されたコンテンツをアクティブな JavaScript として解釈することはありません。


図 6. Dojo エディターの実装

著者からの注記: 上で説明したシナリオは、デフォルトで ACF を有効にする理想的な使用事例です。このシナリオでは、ユーザーは上で説明した要求パラメーターのシナリオに相当する、URL エンコードされたメッセージを使って、アクティブ・コンテンツを POST しています。また、要求パラメーター値に含まれる悪意のある部分は、アプリケーションが要求パラメーターにアクセスできるようになる前に、要求パラメーターから取り除かれます。




上に戻る


まとめ

この記事では、開発者による大々的なアプリケーションの変更を必要とせずにアプリケーションでのアクティブ・コンテンツのフィルタリングを可能にすることによって、ACF がアプリケーションのデプロイメントに一層の柔軟性をもたらす仕組みを説明しました。残念ながら多くの Web 2.0 アプリケーションではクロスサイト・スクリプティング (XSS) といったアクティブ・コンテンツの攻撃が一般的になっていますが、ACF がもたらす優れた柔軟性により、このような懸念からアプリケーションを一層確実に切り離せるようになります。みなさんもサンプル・アプリケーションを試してみて、Project Zero フォーラム (「参考文献」を参照) にフィードバックをお寄せください。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
Sample application for this articleACFSampleApp-1.0.0.zip32KBHTTP
ダウンロード形式について


参考文献

学ぶために

製品や技術を入手するために
  • Project Zero Eclipse プラグインを入手してください。インストール後に Zero パッケージ・リポジトリーから Zero ランタイム・ライブラリーを追加でダウンロードするには、このプラグインに含まれるインストーラーを使用します。

  • Project Zero をダウンロードして、この記事で学んだスキルを早速実践してください。


議論するために


著者について

Todd Kaplinger

Todd Kaplinger は IBM Software Group のシニア・ソフトウェア・エンジニアで、現在 Project Zero のセキュリティー・チームでアーキテクト兼チーム・リーダーを務めています。JSP、Servlet、PHP などの Web ベースの技術を専門する彼は、最近では新たな Web 2.0 技術と企業におけるその影響に注目しています。現在 JSR 223: Scripting for the Java Platform のエクスパート・グループのメンバーであり、さらに Open AJAX Alliance のメンバーとして各種 Ajax フレームワーク実装でのセキュリティーにおけるインターオペラビリティーにも取り組んでいます。過去に IBM WebSphere Webcontainer and RRD (Remote Request Dispatcher) プロジェクトのチーム・リーダー兼アーキテクトとして活躍し、Servlet Expert グループの IBM 代表として JSR 154 Servlet 2.5 仕様に関わった経験もあります。


Masayoshi Teraguchi

寺口 正義は、IBM Tokyo Research Laboratory のリサーチ・スタッフの一員です。これまで 5 年間、XML、Web Services、および WSS (Web Services Security) を研究してきました。現在の研究対象には、Web 2.0 のセキュリティーおよびパフォーマンスなどが含まれます。


Photo: Gang Chen

Gang Chen は、ISSW (IBM Software Services for WebSphere) の認証コンサルタント I/T スペシャリストです。企業の顧客が e-business アプリケーションを設計、実装する際の支援を専門とする彼は、最近では企業顧客に利益をもたらす新たな Web 2.0 技術に注目しています。IBM Redbook「IBM WebSphere Application Server V6 Scalability and Performance Handbook」の共著者でもあります。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


WebSphere は、International Business Machines Corporation の米国およびその他の国における商標です。 Java およびすべての Java 関連の商標およびロゴは、Sun Microsystems, Inc. の米国およびその他の国における商標です。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。

    日本IBMについて プライバシー お問い合わせ