Adobe Flex 3 ヘルプ

宣言型セキュリティとプログラム型セキュリティの比較

セキュリティに対する 2 つの一般的なアプローチとして、宣言型セキュリティとプログラム型セキュリティがあります。多くの場合、宣言型セキュリティはサーバーベースです。サーバーの設定を使用して、リソースまたはリソースのセットを保護します。コンテナの認証および承認スキームを使用して、そのリソースを不正なアクセスから保護します。

宣言型セキュリティのアプローチでは、大略的なセキュリティ設定が可能になります。宣言型セキュリティは、そのセキュリティの対象となる Web コンポーネントとは個別の層として実装されます。セキュリティシステム(ファイルのアクセス許可、またはユーザー、グループ、ロールなどのセット)を設定し、アプリケーションの認証メカニズムをこのセキュリティシステム層に適用します。

宣言型セキュリティを使用した場合は、ユーザーがリソースにアクセスできるか、できないか、のいずれかになります。通常は、コンテンツをロールに応じてカスタマイズすることはできません。その結果、HTML ベースのアプリケーションでは、ユーザーは特定のページへのアクセスを拒否されます。ただし、Flex 環境で宣言型セキュリティを使用すると、通常はアプリケーション全体へのアクセスが拒否されるようになります。これは、コンテナからは、アプリケーションが 1 つのリソースとして認識されるからです。

宣言型セキュリティを使用すると、Web アプリケーションを作成するプログラマは、アプリケーションの作成環境を無視することができます。宣言型セキュリティの設定と保守は、通常はアプリケーションの開発者ではなく、展開担当者が行います。また、Web アプリケーションを更新しても、通常はセキュリティモデルのリファクタリングは必要ありません。

プログラム型セキュリティでは、アプリケーションの開発者は、アプリケーションとそのリソースへのアクセスを詳細に制限できます。プログラム型セキュリティでは、宣言型のセキュリティよりも詳細な設定が可能です。例えば、プログラム型セキュリティを使用している開発者は、アプリケーション内の特定のコンポーネントに対するユーザーアクセスを許可または拒否することができます。

プログラム型セキュリティは、多くの場合、アプリケーションの開発者によって設定されます。ただし、通常は宣言型セキュリティと同じシステムとやり取りするので、プログラム型セキュリティを実装する際にアプリケーションの開発者と展開担当者との関係が協力的である必要があります。

ほとんどのアプリケーションでは、プログラム型セキュリティよりも宣言型セキュリティをお勧めします。これは、このデザインではコードの再利用性が向上し、保守が簡単になるからです。さらに、宣言型セキュリティでは、実装の専門家がセキュリティの責任者になるので、アプリケーションプログラマはアプリケーションの作成に集中でき、アプリケーションを特定の環境に展開する担当者は、セキュリティポリシーの適用に集中して、そのコンテキストを活用できるようになります。

クライアントセキュリティの概要

セキュリティの問題を考慮する場合、Flex アプリケーションを従来の Web アプリケーションとは見なさないでください。Flex アプリケーションは通常、クライアントによって一度だけロードされるモノシリック(一体型)SWF ファイルであるか、あるいはモジュールまたは RSL としてロードされる SWF ファイルのセットです。一方、標準的な Web アプリケーションは、一斉にロードされる多数の個別ページから構成されます。

ほとんどの Web アプリケーションは、クライアント外部の Web サービスなどのリソースにアクセスします。Flex アプリケーションが外部のリソースにアクセスする場合は、次の 2 つの要素が考慮されます。

  • このリソースに対するアクセスをユーザーが許可されているかどうか。
  • クライアントがリソースをロードできるかどうか。または、サンドボックスの制限によりリソースのロードが禁止されているかどうか。

デフォルトでは、次の基本的なセキュリティルールが常に適用されます。

  • 同じセキュリティサンドボックス内のリソースは、常に互いにアクセスできます。
  • リモートサンドボックス内の SWF ファイルは、ローカルファイルおよびデータにはアクセスできません。

次に示すクライアントアーキテクチャに関連するセキュリティ上の問題は、Flex アプリケーションに影響するので考慮が必要です。

Flash Player のセキュリティ機能

Flash Player のセキュリティの大部分は、ロードされた SWF ファイル、メディア、およびその他のアセットの元のドメインに基づいて決まります。例えば、www.example.com などの特定のインターネットドメインの SWF ファイルは、そのドメイン内のすべてのデータに常にアクセスできます。これらのアセットは、セキュリティサンドボックスと呼ばれる同じセキュリティグループに配置されます。例えば、SWF ファイルは、ドメイン内の SWF ファイル、ビッドマップ、オーディオ、テキストファイル、およびその他のアセットをダウンロードできます。また、同じドメインの 2 つの SWF 間のクロススクリプトも、両方のファイルが ActionScript 3.0 を使用して記述されていれば可能です。クロススクリプトは、SWF ファイルが ActionScript を使用して別の SWF ファイルのプロパティ、メソッド、およびオブジェクトにアクセスする機能です。ただし、ActionScript 3.0 で記述された SWF ファイルと旧バージョンの ActionScript で記述された SWF ファイル間のクロススクリプトはサポートされません。この場合は、LocalConnection クラスを使用してやり取りできます。

メモリ使用量とディスクストレージの保護

Flash Player には、クライアントコンピュータのディスクデータとメモリ使用量のセキュリティ保護機能があります。

唯一のタイプの永続ストレージは、SharedObject クラスを通じて使用できます。これは、所有する SWF ファイルと関連する名前を持つディレクトリ内のファイルとして実装されます。通常、Flex アプリケーションは、SharedObject データファイル以外のクライアントコンピュータ上のファイルの作成、編集、または削除はできません。また、ドメインごとに指定された設定の下でのみ SharedObject データファイルにアクセスできます。

Flash Player は、SharedObject クラスの使用量を監視することにより、ディスク記憶領域(およびシステムメモリ)を対象としたサービス拒否攻撃のリスクを軽減します。Flash Player は、ディスク記憶領域を節約するために自動的に制限を設定します(デフォルトは、ドメインごとに 100 KB のディスク記憶領域)。Flash アプリケーションの作成者は、ユーザーが制限を超えるデータを格納しようとしたときに、ディスク記憶領域を増やすように求めるメッセージを表示するか、または Flash Player が自動的に警告を表示するようにアプリケーションを設定できます。いずれの場合でも、ユーザーがそのドメインに対する割り当ての増加を明示的に許可しない限り、ディスク記憶領域の制限が Flash Player によって適用されます。

Flash Player には、メモリとプロセッサのための安全対策が講じられており、アプリケーションが無期限に大量のシステムリソースを占有しないよう防止します。例えば、Flash Player は無限ループに陥ったアプリケーションを検出し、ユーザーにそのアプリケーションを終了するようプロンプトを表示することによって、そのアプリケーションを終了させることができます。そのアプリケーションが終了すると、アプリケーションで使用していたリソースが直ちに解放されます。

Flash Player はガベージコレクタエンジンを使用します。新規の割り当て要求を処理する場合は、メモリがクリアされていることを最初に必ず確認し、新しい割り当てには常に未使用のメモリだけが取得され、前のデータが表示されないようにします。

プライバシー

プライバシーは、セキュリティ全体の重要な側面です。Flash Player を含む Adobe 製品は、ユーザー(またはそのコンピュータ)を明らかにする可能性のある情報はほとんど提供しません。Flash Player は、ユーザーの個人情報(名前、電子メールアドレス、電話番号など)を提供することや、他の機密情報(クレジットカード番号やアカウント情報)へのアクセスを提供することはありません。

Flash Player は、原則として、標準化されたハードウェアおよびソリューション設定に関する基本情報を提供します。作成者はこの情報を使用して、使用する環境でのユーザー体験の向上を図ります。多くの場合、同じ情報は、オペレーティングシステムや Web ブラウザからも入手できます。

Flex アプリケーションで入手できる、クライアント環境に関する情報には次のようなものがあります。

  • ユーザーエージェント文字列。通常は、組み込みブラウザのタイプとクライアントのオペレーティングシステムを識別します。
  • 言語や MP3 デコーダの有無などのシステム機能(Capabilities クラスを参照)。
  • カメラとマイクの有無。
  • キーボードおよびマウス入力。

ActionScript には、System クラスの setClipboard() メソッドを使用して、クライアントのクリップボードの内容を置換する機能があります。このメソッドには対応する getClipboard() メソッドがないため、クリップボードに既に格納された保護データには Flash Player からはアクセスできません。

サンドボックスについて

サンドボックスのタイプは、SWF ファイルが使用されているセキュリティゾーンのタイプを示します。Flash Player では、すべての SWF ファイル(および SWF から HTML へのスクリプト作成を目的とした HTML ファイル)が、次に挙げる 4 つのサンドボックスタイプのいずれかに配置されます。

リモート 

ローカル URL 以外のすべてのファイルは、リモートサンドボックスに配置されます。このようなサンドボックスは多数あり、ファイルのロード元のインターネット(またはイントラネット)ドメインごとに 1 つずつ存在します。



local-with-filesystem 

ローカルファイルのデフォルトのサンドボックス。このサンドボックス内の SWF ファイルは、どのような方法でもインターネット(または任意のサーバー)とは接続できません。HTTP URL などのアドレスを使用してネットワークエンドポイントにアクセスすることはできません。



local-with-networking 

このサンドボックス内の SWF ファイルはネットワークを通じてのやり取りはできますが、ローカルファイルシステムから読み取ることはできません。



local-trusted 

このサンドボックスは制限されていません。ローカルファイルは、エンドユーザーによって認証されると、このサンドボックス内に置くことができます。この認証には 2 つの形式があり、設定マネージャを通じてインタラクティブに行われるか、ユーザーのコンピュータで Flash Player 設定ファイルを作成する実行可能インストーラを通じて非インタラクティブに行われます。



次の例に示すように、Security クラスの sandboxType プロパティを使用して、現在のサンドボックスタイプを指定できます。

<?xml version="1.0" encoding="utf-8"?>
<!-- security/DetectCurrentSandbox.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()">
    <mx:Script><![CDATA[
        [Bindable]
        private var l_sandboxType:String;

        private function initApp():void {
            l_sandboxType = String(Security.sandboxType);
        }
    ]]></mx:Script>

    <mx:Form>
        <mx:FormItem id="fi1" label="Security.sandboxType">
            <mx:Label id="l1" text="{l_sandboxType}"/>
        </mx:FormItem>
    </mx:Form>

</mx:Application>

前の例で実行する SWF ファイルは以下のとおりです。

Flex アプリケーションをコンパイルするときに、そのアプリケーションが属するサンドボックスを制御できます。サンドボックスのタイプは、use-network コンパイラオプションの値(デフォルトは true)と、SWF ファイルのロード方法(クライアントによってネットワーク接続を通じてロードされるのか、ローカルファイルとしてロードされるのか)の組み合わせによって決まります。

次の表に、サンドボックスのタイプを指定する方法を示します。

use-network の値

ロードの方法

サンドボックスのタイプ

false

ローカル

local-with-filesystem

true

ローカル

local-with-network

true

ネットワーク

リモート

false

ネットワーク

該当なし(エラーが発生する)

ブラウザのセキュリティ

Flash Player クライアントは、次の 4 つのタイプのいずれかです。

  • 埋め込み Flash Player
  • デバッガ版の埋め込み Flash Player
  • スタンドアロン Flash Player
  • デバッガ版のスタンドアロン Flash Player

スタンドアロン Flash Player はデスクトップで実行されます。通常、このタイプのクライアントを使用するのは、アプリケーションを実行するユーザーです。アプリケーションは、アプリケーションを実行するデスクトップへのアクセス権を持つ IT 部門によってインストールされ、保守されます。

埋め込み Flash Player はブラウザ内部で実行されます。インターネットへのアクセス権を持つ誰もが、この Flash Player を使用して、どこからでもアプリケーションを実行できます。Internet Explorer では、埋め込みプレーヤーはブラウザ内部に ActiveX コントロールとしてロードされます。Netscape べースのブラウザ(Firefox を含む)では、ブラウザ内部のプラグインとしてロードされます。埋め込みプレーヤーを使用すると、開発者は FORM および BASIC 認証や SSL などのブラウザベースのテクノロジを使用できます。

ブラウザ API

Flash Player ActiveX コントロールまたは Flash Player プラグインをホストするアプリケーションは、EnforceLocalSecurity および DisableLocalSecurity API 呼び出しを使用して、セキュリティ設定を制御できます。DisableLocalSecurity が開いている場合は、アプリケーションには、local-with-networking サンドボックスおよび local-with-filesystem サンドボックスによるメリットはありません。ローカルファイルシステムからロードされたすべてのファイルは、local-trusted サンドボックスに配置されます。クライアントアプリケーションでホストされている ActiveX コントロールのデフォルトの動作は DisableLocalSecurity です。

EnforceLocalSecurity が開いている場合は、アプリケーションは 3 つのすべてのローカルサンドボックスを使用できます。ブラウザプラグインのデフォルトの動作は EnforceLocalSecurity です。

クロススクリプト

クロススクリプトは、SWF ファイルが別の SWF ファイルと直接やり取りする場合に行われます。このやり取りには、他の SWF ファイルのメソッドの呼び出しとプロパティの設定が含まれます。

SWF ファイルのロードとクロススクリプトは、同じサンドボックスに常駐する SWF ファイル間で常に許可されています。例えば、すべての local-with-filesystem SWF ファイルは、他のすべての local-with-filesystem SWF ファイルをロードし、クロススクリプトすることができます。すべての local-with-networking SWF ファイルは、他のすべての local-with-networking SWF ファイルをロードし、クロススクリプトすることができます。異なるサンドボックスの 2 つの SWF ファイル、または異なるドメインの 2 つのリモート SWF ファイルが連携して動作する場合には制限があります。

リモートサンドボックスの SWF ファイルでは、2 つの SWF ファイルが同じドメインからロードされた場合、制限なしにクロススクリプトができます。両方の SWF ファイルをネットワークからロードしたときに、ドメインが異なる場合は、これらのファイルでクロススクリプトを可能にするには、許可を与える必要があります。

SWF ファイル間のクロススクリプトを可能にするには、Security クラスの allowDomain() および allowInsecureDomain() メソッドを使用します。

呼び出し対象の SWF ファイルからこれらのメソッドを呼び出し、呼び出し元の SWF ファイルのドメインを指定します。例えば、domainA.com の SWF1 が domainB の SWF2 のメソッドを呼び出す場合は、SWF2 が allowDomain() メソッドを呼び出し、domainA.com からの SWF ファイルがメソッドをクロススクリプトできるように具体的に示して許可する必要があります。次に例を示します。

import flash.system.Security;
Security.allowDomain("domainA.com");

SWF ファイルが異なるサンドボックスにある場合は(1 つの SWF ファイルがローカルファイルシステムからロードされ、もう 1 つがネットワークからロードされるなど)、次の規則セットに従う必要があります。

  • リモート SWF ファイル(HTTP やその他の非ローカルプロトコルを通じて提供されるもの)は、ローカル SWF ファイルをロードできません。
  • local-with-networking SWF ファイルは local-with-filesystem SWF ファイルをロードできず、local-with-filesystem SWF ファイルは local-with-networking SWF ファイルをロードできません。
  • local-with-filesystem SWF ファイルは、リモート SWF ファイルをロードできません。
  • local-trusted SWF ファイルは、どのサンドボックスの SWF ファイルもロードできます。

SWF 対 SWF のやり取りを簡単にするために、LocalConnection クラスを使用することもできます。詳細については、LocalConnection クラスの使用を参照してください。

ExternalInterface

ExternalInterface API を使用すると、Flex アプリケーションからラッパー内のスクリプトを呼び出したり、反対にラッパーから Flex アプリケーションの関数を呼び出したりできます。ExternalInterface API は、主として flash.net パッケージの call() メソッドと addCallback() メソッドで構成されます。

このやり取りは、allowScriptAccess および allowNetworking プロパティが定義するドメインベースのセキュリティ制限に依存します。allowScriptAccess および allowNetworking プロパティの値は、SWF ファイルのラッパーで設定します。詳細については、object タグと embed タグについてを参照してください。

call() メソッドを正しく実行するためには、デフォルトで、Flex アプリケーションと、そのアプリケーションが呼び出している HTML ページが同じドメインになければなりません。詳細については、『Adobe Flex 3 開発ガイド』のラッパーとの通信を参照してください。

navigateToURL() メソッド

navigateToURL() メソッドは、Flash Player のコンテナアプリケーションでウィンドウを開いたり、置換したりします。通常は、このメソッドは新しいブラウザウィンドウを開くために使用しますが、スクリプトをメソッドの呼び出しに埋め込み、他の操作を実行することもできます。

この navigateToURL() メソッドは、allowScriptAccess および allowNetworking パラメータが定義するドメインベースのセキュリティの制限に依存します。allowScriptAccess および allowNetworking プロパティの値は、SWF ファイルのラッパーで設定します。詳細については、object タグと embed タグについてを参照してください。

キャッシュ

Flex アプリケーションは、完全にクライアント上に置かれます。ブラウザがアプリケーションをロードすると、アプリケーション SWF ファイルと、外部でロードされたイメージとその他のメディアファイルが、クライアントのブラウザのキャッシュにローカルに格納されます。これらのファイルは、クリアされるまでキャッシュに置かれます。

SWF ファイルをブラウザのキャッシュに格納すると、キャッシュに格納されていない場合は表示できないユーザーがファイルを表示する可能性があります。次の表に、ブラウザのキャッシュファイルの格納場所の例を示します。

ブラウザまたはオペレーティングシステム

キャッシュの場所

Windows XP 上の Internet Explorer

C:¥Documents and Settings¥username¥Local Settings¥Temporary Internet Files

Windows XP 上の Firefox

C:¥Documents and Settings¥username¥Application Data¥Mozilla¥Firefox¥Profiles¥username.default¥Cache

UNIX

$HOME/.mozilla/firefox/username.default/Cache/

これらのキャッシュファイルは、ブラウザを閉じた後もキャッシュに残されます。

クライアントブラウザで SWF ファイルがキャッシュされないようにするには、Flex アプリケーションの SWF ファイルを返すラッパーの HTTP ヘッダーを、次のように設定します。

Cache-control: no-cache, no-store, must-revalidate, max-age=-1
Pragma: no-cache, no-store
Expires: -1

信頼できるサイトおよびディレクトリ

ブラウザのセキュリティモデルには、特定の Web サイトに適用される信頼のレベルが含まれます。Flash Player は、このモデルと対話し、ブラウザが SWF ファイルの元のサイトを信頼できるサイトと宣言したかどうかに基づいてサンドボックスを割り当てます。

Flash Player が信頼できる Web サイトから SWF ファイルをロードすると、その SWF ファイルは local-trusted サンドボックスに置かれます。SWF ファイルは、ローカルのデータソースから読み取ることも、インターネットでやり取りすることもできます。

SWF ファイルをローカルファイルシステムからロードするときに、SWF ファイルが local-trusted サンドボックスに格納されるように割り当てることもできます。これを行うには、そのディレクトリを信頼するように指定する FlashPlayerTrust 設定ファイルを追加することにより、ディレクトリが Flash Player に信頼されるように設定します(この結果、その SWF ファイルは local-trusted サンドボックスに置かれます)。これには、管理者がクライアントシステムへのアクセス権限を持っている必要があるので、通常は制御された環境で行われます。ユーザーは、Flash Player ユーザー設定マネージャを使用して、信頼できるディレクトリを定義することもできます。詳細については、Flash Player のマニュアルを参照してください。

保護されたアプリケーションの展開

アプリケーションの展開とは、ユーザーがそのアプリケーションを利用できるようにすることです。アプリケーションの展開プロセスは、アプリケーション、アプリケーションの要件、および展開環境によって異なります。いくつかの戦略を導入することで、展開するアプリケーションのセキュリティを確実に確保できます。

ローカル SWF ファイルとネットワーク SWF ファイルの展開の比較

クライアントコンピュータは、外部 Web サイトやローカルファイルシステムなどの多数のソースから個々の SWF ファイルを取得できます。SWF ファイルが Flash Player にロードされると、ファイルのロード元に基づいて、ファイルはそれぞれセキュリティサンドボックスに割り当てられます。

Flash Player は、ネットワーク(外部 Web サイトなど)からダウンロードされた SWF ファイルを、Web サイトの元のドメインに対応する個別のサンドボックスに分類します。デフォルトでは、これらのファイルは、特定の(ドメイン完全一致)サイトにあるその他のネットワークリソースに対するアクセスを許可されます。ネットワーク SWF ファイルは、明示的な Web サイトと作成者の許可により、他のドメインからの追加データにアクセスできます。

ローカル SWF ファイルは、IP アドレスや修飾ドメインを含まない file:¥¥ プロトコルまたは UNC パスを使用するファイル参照として記述されます。例えば、¥¥test¥test.swf と file:¥¥test.swf はローカルファイルと見なされますが、¥¥test.com¥test.swf と ¥¥192.168.0.1¥test.swf はローカルファイルとは見なされません。

ローカルファイルシステムや UNC ネットワークパスなどのローカル SWF ファイルは、local-with-networking、local-with-filesystem、local-trusted の 3 種類のサンドボックスのいずれか 1 つに配置されます。

Flex アプリケーションのコンパイル時に、use-network コンパイラオプションを false に設定すると、ローカル SWF ファイルが local-with-filesystem サンドボックスに配置されます。use-network コンパイラオプションを true に設定すると、ローカル SWF ファイルが local-with-networking サンドボックスに配置されます。

(ユーザーまたはインストーラプログラムによって)信頼できるファイルとして登録されたローカル SWF ファイルは、local-trusted サンドボックスに配置されます。セキュリティ上の考慮事項に基づいて、local-trusted サンドボックスに対してローカル SWF ファイルを再割り当て(移動)することもできます。

展開チェックリスト

アプリケーションを展開する前に、プロキシサーバー、ファイアウォール、およびアセットが正しく設定されていることを確認します。Adobe では、展開チェックリストを用意しています。詳細については、展開チェックリストを参照してください。

ワイルドカードの削除

使用しているアプリケーションが別のドメインからロードされたアセットに依存し、そのドメインに crossdomain.xml ファイルがある場合は、可能であればそのファイルからワイルドカードを削除します。例えば、次を変更するとします。

<cross-domain-policy>
    <allow-access-from domain="*" to-ports="*"/>
</cross-domain-policy>

これを次のように変更します。

<cross-domain-policy>
    <allow-access-from domain="*.myserver.com" to-ports="80,443,8100,8080" />
</cross-domain-policy>

また、to-ports タグの allow-access-from 属性の値を設定し、リソースへのアクセスを確実に必要なポートだけに許可するようにします。

アプリケーションで、allowDomain() および allowInsecureDomain() メソッドへの呼び出しを確認します。開発時に、これらのメソッドにワイルドカード文字(*)を渡すこともありますが、この時点では、必要なドメインからの要求だけを許可するように制限します。

WEB-INF へのアセットの展開

展開時に、データファイルなどのアセットを、アプリケーションからはアクセス可能であるが、このデータファイルを要求するユーザーからはアクセスできないようにした方がよい場合があります。J2EE ベースのサーバーを使用している場合は、これらのデータファイルを WEB-INF ディレクトリ内部のサブディレクトリに展開できます。J2EE セキュリティの制約に基づいて、どの J2EE サーバーも、クライアント要求に対して WEB-INF ディレクトリからリソースを返すことはできません。このディレクトリにあるファイルには、サーバーサイドのコードを使用しない限りアクセスできません。

ソースコードのプリコンパイル

Apache および IIS 用の Flex モジュールを使用している場合、MXML ファイル、JSP ファイル、およびクラスファイルをプリコンパイルしてください。MXML および JSP ファイルをプリコンパイルしたら、一般公開されたサーバーからソースファイルを削除します。運用環境で使用する MXML ファイルのコンパイルには、Apache および IIS 用の Flex モジュールを使用しないでください。

MXML ファイルをプリコンパイルするには、bin ディレクトリにある mxmlc コンパイラユーティリティを使用します。このユーティリティの使用の詳細については、コマンドラインコンパイラについてを参照してください。

例えば JRun の JSP ファイルをプリコンパイルする場合は、JRun の bin ディレクトリにある jspc プリコンパイラユーティリティを使用します。アプリケーションサーバー上の JSP ファイルのプリコンパイルに関する詳細については、該当するアプリケーションサーバーのマニュアルを参照してください。

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート