安全なマネージ コントロールの作成

更新 : 2007 年 11 月

マネージ コントロールは、ユーザーのコンピュータにダウンロードされ、必要に応じて実行される Web ページから参照されるアセンブリです。コード アクセス セキュリティの観点からすると、マネージ コントロールには、既定のセキュリティ ポリシーで実行されるマネージ コントロールと、より高いレベルの信頼を必要とするマネージ コントロールの 2 種類があります。

既定のセキュリティ ポリシーで実行するようにマネージ コントロールを作成するには、イントラネット ゾーンまたはインターネット ゾーンについて既定のセキュリティ ポリシーで許可されている操作を把握する必要があるだけです。マネージ コントロールは、その発生元のゾーンに応じて与えられる以上のアクセス許可を必要とせずに実行できる場合には、正常に実行できます。ただし、管理者またはユーザーが、インターネット ゾーンまたはイントラネット ゾーンからダウンロードされたコードに与えるアクセス許可を制限している場合もあります。より高いレベルの信頼を要求するマネージ コントロールを実行するには、管理者またはユーザーが、そのコードを実行するすべてのコンピュータのセキュリティ ポリシーを調整する必要があります。

マネージ コントロールは、インターネットまたはイントラネットのコードに既定では与えられないアクセス許可をできる限り要求しないように作成する必要があります。つまり、たとえばインターネット ゾーンの場合、コードが実行できる操作は、SafeTopLevelWindows および SafeSubWindows (システム ダイアログを偽装することを防ぐために、セキュリティ システムによって調整されたウィンドウ) の表示、その発生元のサイトへの通信、限定された分離ストレージの使用などに制限されます。

イントラネット上のコードには、インターネット コードよりも、やや多くのアクセス許可が与えられます。詳細については、「既定のセキュリティ ポリシー」を参照してください。コントロールがファイルにアクセスしたり、データベースを使用したり、クライアント コンピュータについての情報を収集したりする必要がある場合は、そのコントロールには、より高いレベルの信頼が必要です。

開発

信頼レベルの高いコントロールは、その発生元 (イントラネットまたはインターネット) に基づいて通常適用されるセキュリティ ポリシーよりも制限の少ないポリシーで実行されることが想定されています。.NET Framework クラスなどの安全なライブラリが実行する多くのアクセス許可の確認要求では、すべての呼び出し元をチェックするスタック ウォークが実行され、要求されたアクセス許可を各呼び出し元が持っていることや、マネージ コードではない Web ページがセキュリティ上の理由から呼び出し元として処理されることが確認されます。スタック ウォークは、信頼レベルの低いコードが信頼レベルの高いコードを利用して悪意のある操作を行うことを防止できるようにするために実行されます。

ブラウザがホストとなるマネージ コントロールは Web ページ上のアクティブ スクリプトによって操作できるため、その Web ページは呼び出し元と見なされ、セキュリティ スタック ウォーク時にチェックされます。これにより、悪意のある Web ページ作者がより高いレベルで信頼されたコードを利用することを防止できるようになります。Web ページが呼び出し元と見なされることにより、厳密な名前または発行元の証明書に基づいて高いレベルで信頼され、Web ページから実行されるコントロールは、その Web ページと同じゾーン (イントラネットまたはインターネット) を発生元とするコードに通常は許可されない操作を実行することができなくなります。配置に関する考慮事項の詳細については、次のセクションを参照してください。これにより、信頼レベルの高いコントロールを作成できなくなるようにも見えますが、コード アクセス セキュリティでは、セキュリティ スタック ウォークの動作を部分的にオーバーライドできるようにすることで、このシナリオに対応しています。

信頼レベルの高いコントロールで、その呼び出し元 (そのコントロールが実行された Web ページ) には通常は与えられないアクセス許可に関するスタック ウォークを短縮する場合は、Assert を慎重に使用する必要があります。Assert を使用する場合は、悪意のある Web ページが不適切な操作を実行できるようにする可能性のある危険な API を公開しないようにする必要があります。そのため、信頼レベルの高いコントロールを作成する場合は、安全なクラス ライブラリを作成する場合と同じくらい慎重に、セキュリティを意識する必要があります。

安全なマネージ コントロールを作成するためのいくつかのヒントを次に示します。

  • 可能な場合には、高いレベルの信頼を要求する操作は、コントロールによって公開されないようにカプセル化します。これによって、これらの操作によって要求されるアクセス許可をアサートできるようになり、作成したコントロールを使用する Web ページでは、そのコントロールの機能を悪用できなくなります。

  • デザイン上、作成したコントロールが実行する信頼レベルの高い操作を公開する必要がある場合には、所定の Web ページだけがそのコントロールを呼び出して実行できるように、サイトまたは URL の ID アクセス許可の確認要求を行うことを検討してください。

配置

信頼レベルの高いコントロールには、必ず厳密な名前または発行元の証明書 (X.509) 付きの署名が必要です。これにより、ポリシー管理者は、他のイントラネット コードやインターネット コードに関してセキュリティを緩和することなく、これらのコントロールにより高い信頼を与えることができます。アセンブリが署名された後、必要なアクセス許可に関連付けられた新しいコード グループを作成し、特定の企業または組織によって署名されたコードだけがそのコード グループのメンバになることができるように指定する必要があります。この方法でセキュリティ ポリシーを変更すると、信頼レベルの高いコントロールには、そのコントロールを実行するために十分なアクセス許可が与えられます。

信頼レベルの高い、ダウンロードされたコントロールが機能するにはセキュリティ ポリシーを変更する必要があるため、この種類のコントロールの配置は、企業内イントラネットで行う方がはるかに簡単です。イントラネットには、通常はエンタープライズ管理者が配属されていて、このようなセキュリティの変更を管理者が複数のクライアント コンピュータに配置できます。信頼レベルの高いコントロールを、企業や組織に所属していない一般ユーザーがインターネット経由で使用するには、コントロールの発行元とユーザーとの間に信頼関係が必要です。最終的には、ユーザーが発行者の指示に従ってポリシーを変更し、信頼レベルの高いコントロールを実行できるようにする必要があります。信頼関係が確立されない場合は、コントロールを実行することはできません。

参照

概念

コード アクセス セキュリティの概要

安全なクラス ライブラリの作成

既定のセキュリティ ポリシー

その他の技術情報

厳密な名前付きアセンブリの作成と使用

セキュリティ ポリシーの管理