サンドボックス ソリューションのアーキテクチャ

このトピックは、SharePoint でのサンドボックス ソリューション システムのアーキテクチャについて説明します。

最終更新日: 2011年4月14日

適用対象: SharePoint Foundation 2010

この記事の内容
概要
サンドボックス ソリューションのパッケージ化およびインストール システム
サンドボックス ソリューションのプロセス モデル
セキュリティで保護されたワーカー プロセス内でのコード実行とリソース アクセス
サンドボックス ソリューションでのリソース使用率制限
分割ページのレンダリング システム
サンドボックス制限の回避
ソリューション検証フレームワーク

SharePoint Online で使用可能

パッケージ化システムの詳細、処理モデル、スプリット ページ レンダリング システム、リソース使用率制限、コード実施とアクセス制限、およびソリューション検証フレームワークが含まれます。これらすべての事項の詳細については、SDK の「サンドボックス ソリューション」ノードのその他のトピックを参照してください。

概要

サンドボックス ソリューションを使用すれば、ファーム ソリューションとは異なり、サイト コレクション管理者が、高位の管理者の関与を必要とせずに Microsoft SharePoint Foundation にカスタム ソリューションをインストールできます。しかし、この利点と引き替えに、サンドボックス ソリューションでは、展開する対象、実行できるコード、アクセスできるリソースについての制限が必要となります。

注意

"サンドボックス" の代わりに、"ユーザー" という表現が使用されることがあります。特に、サンドボックス ソリューション システムのオブジェクト モデルについてはそうです。たとえば、システムの主要な API の名前空間は Microsoft.SharePoint.UserCode であり、サンドボックス ソリューションの実行を管理するサービスは、フロントエンド Web サーバーの Windows [Services] ダイアログ ボックスで [SharePoint 2010 ユーザー コード ホスト] と呼ばれます (サーバーの全体管理アプリケーションでは、SharePoint Foundation Sandboxed Code Service と呼ばれます)。これは、"サンドボックス ソリューション" と呼ばれるようになる前の名前を反映しています。

サンドボックス ソリューションのパッケージ化およびインストール システム

ファーム ソリューション同様に、サンドボックス ソリューションは、インストールの際、ソリューション パッケージ (.wsp) ファイルとしてパッケージ化されます。しかし、サンドボックス ソリューションは、ファームのソリューション ストアに展開される代わりに、サイト コレクション管理者によって特定のサイト コレクションのソリューション ギャラリーに展開されます。このギャラリーは特殊な SharePoint リストで、コンテンツ データベース内にあります。ギャラリーへのソリューション展開は、サイト コレクションの [サイトの操作] UI、あるいは SharePoint 管理シェルで行います。サンドボックス ソリューションのインストール過程の詳細については、「サンドボックス ソリューションをインストール、アンインストール、およびアップグレードする」を参照してください。

どの種類の要素をサンドボックス ソリューションに含め、どこに展開できるかについては、制限があります。最も重要な点は、サンドボックス ソリューションからサーバーのファイル システムには何も展開できないということです。この制限により、以下のようないくつかの影響が発生します。

  • アプリケーション ページ、ユーザー コントロール (.ascx ファイル)、およびローカライゼーションリソース (.resx) ファイルは、サンドボックス ソリューションにより展開できません (しかし、サンドボックス ソリューションをローカライズするには、その他の方法があります。詳細については、「サンドボックス ソリューションのローカライゼーション」を参照してください)。

  • サンドボックス ソリューション内の画像、スクリプトファイル、およびフィーチャーは、フロントエンド サーバーのファイル システムではなく、コンテンツ データベースに展開されます。

  • サイト定義は、サンドボックス ソリューションに展開できません (しかし、機能上は同等である Web テンプレートは展開できます。詳細については、「How to: Deploy a Web Template in a Sandboxed Solution」を参照してください)。

  • サンドボックス ソリューション内のアセンブリもコンテンツ データベースに展開されますが、これらのアセンブリが使用中の場合、要求を処理するサーバーのファイル システムに一時的にキャッシュされます。詳細については、「サンドボックス ソリューション内のアセンブリが展開される場所」を参照してください。

サンドボックス ソリューションに何が展開できるかの詳細な説明については、「サンドボックス ソリューションで実装できるコンポーネント」を参照してください。

また、サンドボックス ソリューションは、それが展開されるサイト コレクションの外部にはアクセスできません。これは、サンドボックス ソリューションに展開されるフィーチャーは、サイト コレクションあるいは Web サイトにのみスコープ指定されるということです。

サンドボックス ソリューションのプロセス モデル

SharePoint は ASP.NET アプリケーションであり、他の ASP.NET アプリケーションと同様に、HTTP 要求がフロントエンド Web サーバーで受信されたとき、特殊なドライバー HTTP.SYS が要求を検出して、対象の IIS Web サイトへの要求を処理するアプリケーション プール (つまり、対象の SharePoint Web アプリケーション) に送ります。すべてのアプリケーション プールは、各要求についての要求パイプラインが実行される IIS ワーカー プロセス (w3wp.exe) を持っています (IIS 7.0 ワーカー プロセスとアプリケーション プールの詳細については、「Introduction to IIS 7 Architecture (英語)」を参照してください)。SharePoint サーバーでは、IIS ワーカー プロセスはアプリケーション プール アカウントで実行されます。これは、通常、ファーム アカウントであり、その結果、プロセスは SharePoint リソースに対する読み取りおよび書き込み権限を持っています。マルチサーバー ファームでは、ファーム アカウントは、通常、ドメイン ユーザーです。これは、コンテンツ データベースにアクセスするアカウントと同じアカウントです。SharePoint 2010 Timer Service は、同じコンテキストのアカウントで実行されます。

ファーム ソリューションは、他の ASP.NET アプリケーションと同様に IIS ワーカー プロセス内で実行されます。しかし、サンドボックス ソリューションは、制限された特別な実行環境で実行されます。これは、悪質な、あるいは速度が遅いコードが、アプリケーション プールを遅くしたり停止させたりすることを防ぐ目的で必要です。したがって、SharePoint は、コードがサンドボックス ソリューション内でできることに制限を課します。このシステムの実装の重要な部分として、サンドボックス ソリューションは、特殊なセキュリティで保護されたワーカー プロセス (SPUCWorkerProcess.exe) で実行される必要があります。

要求がサンドボックス ソリューションにアクセスしようとするとき、IIS ワーカー プロセスで実行中の SharePoint 実行マネージャーが、サンドボックス ソリューションのコードが実行されるサンドボックス ワーカー プロセスを見つけます (プロセスが実行していない場合は、開始します)。基本的には、このセキュリティで保護されたワーカー プロセスは、ファーム内の SharePoint Foundation Sandboxed Code Service (SPUCHostService.exe) を実行中のどのサーバーでも開始することができます。Windows [Services] ダイアログ ボックスでは、これは [SharePoint 2010 ユーザーコード ホスト] サービスと呼ばれます。

SharePoint Foundation Sandboxed Code Service を実行中のサーバーは、IIS ワーカー プロセスが実行中のフロントエンド Web サーバーであっても、そうでなくてもかまいません。どのサーバーが使用されるかは、サーバーの全体管理アプリケーションで構成できます。管理者は、"ローカルモード" で、各セキュリティで保護されたプロセスを実行することができます。これは、サンドボックス ソリューションの各要求が、IIS ワーカー プロセスが実行中の同じフロントエンド Web サーバーで処理されることを意味します。あるいは、実行マネージャーに、"リモートモード" ("アフィニティ モード" と呼ばれることもある) で、各セキュリティで保護されたプロセスを開かせることができます。このモードでは、実行マネージャーは、SharePoint Foundation Sandboxed Code Service を実行中で、その同じサンドボックス ソリューションについて、SPUCWorkerProcess.exe プロセス内にアプリケーション ドメインを作成済みのサーバーを探します (その同じサンドボックス ソリューションが、おそらく別のサイト コレクションの別のユーザーによって以前に要求された場合は、このようになります)。一致するアプリケーション ドメインがある場合、その要求は処理がされるようにその同じアプリケーション ドメインに送信されます。SharePoint Foundation Sandboxed Code Service を実行中のサーバーが 1 つもサンドボックス ソリューションのアプリケーション ドメインを持っていない場合は、実行マネージャーは、それらのサーバーの中で、利用率が最も少ないサーバーに要求を割り当てます。次に、そのサーバーは、必要なアプリケーション ドメインを作成し、サンドボックス ソリューションの要求を処理します。ローカルあるいはアフィニティ モードが使用されているかにかかわらず、要求が処理された後、アプリケーション ドメインは、セキュリティで保護されたワーカー プロセスで有効のままになり、同じサンドボックス ソリューションの別の要求があった場合は、再利用されます。

特定のサーバーで処理されているすべてのサンドボックス ソリューションは、同じサンドボックス ワーカー プロセス内で実行されます。各サンドボックス ソリューションは、共通のプロセス内でそれ自身のアプリケーション ドメインを取得します。SharePoint Foundation Sandboxed Code Service は、ファーム アカウントで実行されます。

セキュリティで保護されたワーカー プロセス内でのコード実行とリソース アクセス

このサンドボックス ワーカー プロセスで実行されるすべてのコードは、実行およびアクセス制約の対象となります。制約には、2 つのシステムがあります。1 つは、サンドボックス ソリューション内のコードが、主要な SharePoint Foundation アセンブリである Microsoft.SharePoint.dll に対して行う呼び出しに適用されます。もう 1 つは、その他のすべての SharePoint アセンブリと .NET Framework アセンブリへの呼び出しを含む、その他のすべての呼び出しに適用されます。このトピックでは、最初のシステムはサーバー側オブジェクト モデル制約と呼ばれ、2 番目のシステムは全般制約と呼ばれます (サンドボックス ソリューションで使用される分割ページ レンダリング システムからの、いくつかのその他の制約があります。詳細については、以下の「分割ページのレンダリング システム」セクションを参照してください)。

注意

2 つのシステムは、相互に排他的です。全般制約は、Microsoft.SharePoint.dll アセンブリに行われた呼び出しには適用されません。

全般制約は、2 つのメカニズムで課されます。

  1. 制限の厳しい CA ポリシーは、セキュリティで保護されたワーカー プロセス内のコードができることを大きく制限します。このポリシーは %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\CONFIG 内の wss_usercode.config ファイルで定義されており、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\UserCode 内の web.config ファイル内で参照されています (このファイルを変更することはサポートされません)。CAS ポリシーにより課される制限には、以下のものがあります。

    注意

    CAS ポリシーでは、厳密な名前を持つ Microsoft Office アセンブリを例外とします。これらのアセンブリには完全信頼が付与されます。

    この CAS ポリシーとその影響の詳細については、「サンドボックス ソリューションに対する制限」を参照してください。

  2. 第 2 に、セキュリティで保護されたワーカー プロセスは、低権限のセキュリティ トークンを持っています。

    • このトークンは、プロセスがファイル システムに読み取りあるいは書き込みをする権限を拒否します。

    • このトークンは、プロセスがネットワークを呼び出す権限を拒否します。つまり、セキュリティで保護されたワーカー プロセスを実行中のサーバーで使用可能なリソースだけにアクセスすることができます。たとえば、外部データベースにはアクセスできません。

    • このトークンは、プロセスがレジストリに書き込む権限を拒否します。

    • このトークンは、たとえ AllowPartiallyTrustedCallersAttribute 属性を持っていて、セキュリティで保護されたワーカー プロセスから呼び出される資格がある場合でも、全般アセンブリ キャッシュにないすべてのアセンブリを呼び出す権限を拒否します。

これらの制限は、Microsoft.SharePoint.dll アセンブリ内の API に行われる呼び出しには適用されない点に注意してください。つまり、たとえば、GetLocalizedString への呼び出しは、ファイル システム内のリソース ファイルから読み取ることができ、SPList オブジェクトへの呼び出しは、コンテンツ データベースがどのサーバーにあっても、そのデータベースに対して読み取りおよび書き込みできます (しかし、サンドボックス ソリューション内のディスクにファイルは展開できないので、.resx はファーム ソリューションとして個別にインストールする必要があります)。

サーバー側オブジェクト モデル制約システムの主要な制限は、サンドボックス ソリューションからは Microsoft.SharePoint.dll アセンブリ内の API のサブセットだけを呼び出せるということです。禁止された API への呼び出しは、例外を発生させます (この例外は、検出され、エラーとしてユーザーに報告されます)。

以下は、アクセスできる SharePoint オブジェクト モデルへの制限の例です。

  • SPWebApplication クラスは使用できません。これは、特に、サンドボックス ソリューションがそのホスティング サイト コレクション外の何にもアクセスできないことを意味します。

  • Microsoft.SharePoint.WebControls 名前空間内のほとんどすべてのクラスは使用できません。これは、主に、サンドボックス ソリューション内の ASP.NET コントロールに制限されることを意味します。

サンドボックス ソリューションで使用できる Microsoft.SharePoint.dll クラスの完全なリストについては、「サンドボックス ソリューションから使用可能な Microsoft.SharePoint.dll API」を参照してください。

この制限の実装は、shim アセンブリと呼ばれる、特別に制限されたバージョンの Microsoft.SharePoint.dll アセンブリのペアにより行われます。これらは、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\UserCode\assemblies にあります。これらのバージョンは、主に、標準的なバージョンのクラスおよびサブセットのメンバーのみを含むという点で、一般的な Microsoft.SharePoint.dll アセンブリとは異なります。

2 つの shim アセンブリの 1 つは、セキュリティで保護されたワーカー プロセスによって読み込まれます。もう 1 つは、完全信頼で実行され、また SharePoint Foundation Sandboxed Code Service によって管理される、特殊なプロキシ プロセス (SPUCWorkerProcessProxy.exe) に読み込まれます。また、標準の Microsoft.SharePoint.dll アセンブリも、このプロキシ プロセスに読み込まれます。

2 つの shim アセンブリの主な機能は、禁止された SharePoint クラスおよびメンバーをフィルター処理して除外することです。セキュリティで保護されたワーカー プロセス内のコードから Microsoft.SharePoint.dll に呼び出しが行われたとき、shim バージョンのアセンブリにリダイレクトされます。呼び出されている API が shim アセンブリにない場合は、例外がスローされます (この例外は、検出され、ユーザーにエラーとして報告されます)。

shim アセンブリ内に含まれるサンドボックス ソリューションが、承認された API を呼び出すとき、最初の shim アセンブリは、完全信頼プロキシ プロセス内の、第 2 の shim アセンブリにそれを渡します。次に、後者は、標準の Microsoft.SharePoint.dll にそれを渡します。返されたすべての結果は、呼び出した元のコードに戻されます。このプロセスを横断するやり取りは、".NET Remoting" によって行われます。セキュリティで保護されたワーカー プロセスと完全信頼プロキシ プロセスは、常に同時に開始され、相互にペアになります。どちらかが停止した場合は、もう 1 つも停止します。

サーバー側オブジェクト モデル制約システムには、shim アセンブリによっても課せられる 2 次的な制限があります。いくつかの SharePoint API はサンドボックス ソリューションから呼び出すことができますが、それらに渡されるパラメーターに特殊な制約があります。shim アセンブリは、これらの入力制限を義務付け、違反があるときに例外をスローします。これが、SharePoint Foundation 2010 で、唯一、当てはまるのは、SPSite(String) および SPSite(Guid) コンストラクターです。これらはサンドボックス ソリューションで使用できますが、サンドボックス ソリューションがインストールされたサイトコレクションを参照する URL あるいは GUID だけをそれらに渡すことができます。

注意

これは、2 番目の shim アセンブリと標準の Microsoft.SharePoint.dll は、全般制約が適用されない完全信頼プロセス内で実行されることによります。これらの制約は、セキュリティで保護されたワーカー プロセスが対象です。

重要重要

サンドボックス ソリューション自体の展開ステージは、セキュリティで保護されたワーカー プロセス内で実行され、同じ実行制約の対象となります。たとえば、サンドボックス ソリューションを展開するとき、ディスクにファイルを展開することはできません。これは、ユーザー コントロール (ASCX ファイル) が、サンドボックス ソリューションにあってはならない主な理由です。

図 1 は、HTTP 要求がサンドボックス ソリューションにアクセスするとき、どのように処理されるかについて説明します。

図 1: サンドボックス ソリューションの要求処理モデル

セキュリティで保護されたソリューションの要求処理モデル

SPUCHostService.exe、SPUCWorkerProcess.exe、および SPUCWorkerProcessProxy.exe ファイルは、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\UserCode にあります。

サンドボックス ソリューションでのリソース使用率制限

また、サンドボックス ソリューションは、3 種類のリソース使用率制限の対象となります。これらの制限は、(1) 制限が適用されるエンティティの種類と、(2) 制限を超えるとペナルティが課されるエンティティの種類の 2 つに分けられます。

  • 要求ごとに、要求に対してペナルティを課す: サンドボックス ソリューションが完了するまでにかかる時間に、ハード制限をかけます。既定では、30 秒です。サンドボックス ソリューションが制限を超えた場合、要求 (セキュリティで保護されたワーカー プロセスは除く) は終了させられます (この制限は構成できますが、ユーザー設定コードを使用してオブジェクト モデルに対して行う場合のみです。オブジェクト モデルの関連する要素は、サンドボックス ソリューションがアクセスできないので、サンドボックス ソリューションは制限を変更できません)。

  • 要求ごとに、プロセスに対してペナルティを課す: 要求に適用される、15 の追加のリソース制限をかけます。要求がこれらの 1 つを超えた場合は、そのプロセス (そして、制限を超えていないプロセスを含めて、実行中のすべてのサンドボックス ソリューション) が終了させられます。

  • 日ごと/サイト コレクションごとに、サイト コレクションにペナルティを課す: 各サイト コレクションは、日単位での、構成可能な最大の "リソース ポイント" の対象となります。これらのポイントは、サイト コレクションにインストールされたサンドボックス ソリューションによる 15 のリソース カテゴリ内のリソース使用を考慮して、アルゴリズムに基づいて蓄積されます。サイト コレクションが許可された最大のポイントを超えたとき、サイト コレクション内のすべてのサンドボックス ソリューションは終了させられ、日付が変わるまで実行できません。

サンドボックス制限に課されるリソース制限の詳細については、「SharePoint 2010 のサンドボックス ソリューションのリソース使用率制限」を参照してください。

分割ページのレンダリング システム

クライアント コンピューターが、サンドボックス ソリューションのコンポーネント (サンドボックス ソリューション内に展開された Web パーツなど) を含む SharePoint ページを要求すると、SharePoint では複数のページ オブジェクトがレンダリングされます。1 つは Microsoft ASP.NET のワーカー プロセス (w3wp.exe) でレンダリングされ、その他はセキュリティで保護されたワーカー プロセスでレンダリングされます。セキュリティで保護されていないコンポーネントはすべて、ASP.NET ワーカー プロセスのページでレンダリングされ、セキュリティで保護された最初のコンポーネントは、セキュリティで保護されたワーカー プロセスのページ オブジェクトでレンダリングされます。セキュリティで保護されたワーカー プロセスのページは、完全にレンダリングされるときに ASP.NET プロセスのページ オブジェクトに結合されます。ユーザーが要求したページにセキュリティで保護されたコンポーネントが複数ある場合は、セキュリティで保護されたワーカー プロセスのユーザー独自のページ オブジェクトでそれぞれが個別にレンダリングされます。そして、各ページ オブジェクトが ASP.NET プロセスのページ オブジェクトに結合されます。

副作用として、このシステムは、サンドボックス ソリューション内で行うことができる処理にいくつかの追加の制限を課します。これらの制限の詳細については、「サンドボックス ソリューションに対する制限」を参照してください。

サンドボックス制限の回避

サンドボックス ソリューションの制限を回避するには、主に 2 つの方法があります。最も重要な方法は、サンドボックス ソリューション内のサーバー側コードからアクセスできないリソースに、クライアント側コードを使用してアクセスすることです。たとえば、サンドボックス ソリューションには SharePoint の JavaScript クライアント オブジェクト モデルを呼び出す JavaScript を伴う、カスタム サイト ページを含めることができます。また、サンドボックス ソリューションには、Microsoft Silverlight アプリケーションをホストする Web パーツを含めることができます。後者のアプリケーションは、SharePoint の Silverlight クライアント オブジェクト モデルを呼び出すことができます。サンドボックス ソリューションへの制限は、クライアント側コードには適用されません。コード実行の制限、リソース アクセスの制限、リソース使用率の制限はいずれもありません。詳細については、「How to: Extend the Power of a Sandboxed Solution with the SharePoint Client Object Model」を参照してください。

また、サンドボックス ソリューション アーキテクチャにより、サンドボックス ソリューションが完全信頼で実行するカスタム操作を呼び出すことができます。この方法では、SPProxyOperation から派生した 1 つあるいは複数のクラスを含むファーム ソリューションを開発する必要があります。これらのそれぞれが完全信頼で実行される操作を定義し、ExecuteRegisteredProxyOperation メソッドによってサンドボックス ソリューションから呼び出すことができます。具体的には、これらの完全信頼プロキシ操作は、標準の Microsoft.SharePoint.dll アセンブリが実行されるプロキシ プロセス (SPUCWorkerProcessProxy.exe) と同じプロキシ プロセス内で実行されます。プロキシ操作は、サンドボックス ソリューションにデータを返すことができます。

図 2 は、サンドボックス ソリューションが完全信頼プロキシを呼び出すとき、サンドボックス ソリューションにアクセスする要求が処理される方法について説明します。

図 2: サンドボックス ソリューションが完全信頼プロキシを呼び出すときの要求処理モデル

サンドボックスおよび完全信頼プロキシ プロセス モデル

これまでの説明では、この方法を使うと、ファーム ソリューションとサンドボックス ソリューションが、常に同じ開発チームによって同時に作成されるという印象を与える可能性があります。実際には、プロキシ操作クラスを含むファーム ソリューションは、その他のチームによって開発されるサンドボックス ソリューションを含めて、それらのサービスを必要とするすべての、あらゆるサンドボックス ソリューションに特定の操作を実現する目的で、明示的に開発することができます。たとえば、サンドボックス ソリューションは SharePoint ULS ログに書き込めないので、サンドボックス ソリューションにプロキシ ログ記録操作を開くファーム ソリューションは非常に役立つでしょう。

完全信頼プロキシ操作を作成して、呼び出すことの詳細については、「Sandboxed Solutions in Partnership with Full-Trust Proxies in SharePoint 2010」と同じノード内のその他のトピックを参照してください。

ソリューション検証フレームワーク

SharePoint では、たとえば、ソリューションが特定の証明書で署名されているかを確認する検証機能のような、カスタムのソリューション検証機能の作成に使用できる、ソリューション検証機能のフレームワークが用意されています。サンドボックス ソリューションがアクティブ化されるとき、検証機能はサイト コレクション内で実行されます。無効なソリューションのアクティブ化はブロックされます。検証機能が更新されるか、新しい検証機能が追加された場合は、それが次回に実行されるとき、アクティブ化された各ソリューションは、検証機能によって、再度、確認されます。無効なソリューションは、非アクティブにされます。カスタム検証機能の作成の詳細については、「Solution Validation System」を参照してください。