コード アクセス セキュリティ
複雑にリンクされた現在のコンピューター システムには、多種多様な、多くの場合は不明なソースからコードが送信されてきます。 このようなコードは、電子メールに添付されていたり、文書に含まれていたり、インターネットからダウンロードされたりします。 ウイルスやワームのような悪意のあるコードによってコンピューター上のデータを破損または破壊され、時間的にも金銭的にも直接の被害を受けた経験のあるユーザーは少なくはありません。
ほとんどのセキュリティ機構では、ログオン資格情報 (通常はパスワード) に基づいてユーザーに権限を与え、そのユーザーがアクセスできるリソース (多くの場合はディレクトリとファイル) を制限しています。 しかし、この方法では対処できない問題がいくつか存在します。ユーザーはさまざまなソースからコードを入手しますが、中には信頼できない入手先もあります。コードに悪意のあるコードからねらわれやすいバグがあったり脆弱性が潜んでいたりする可能性もあります。また、コードが予期しない動作をすることもあります。 そのため、ユーザーが慎重で信頼できるユーザーであっても、そのユーザーが実行したソフトウェアが悪意のあるソフトウェアやエラーを含むソフトウェアであれば、コンピューター システムが破損したり、機密データが漏洩したりする可能性があります。 多くのオペレーティング システムのセキュリティ機構では、Web ページ上のスクリプトなどの場合を除き、コードを実行するためには、その細部にわたるまで完全に信頼されていることが要求されます。 そのため、信頼関係のないコンピューター システム間でも、一方のシステムから送信されたコードをもう一方のシステムで安全に実行できるようにするための、幅広く適用できるセキュリティ機構が必要になります。
.NET Framework に用意されているコード アクセス セキュリティというセキュリティ機構により、コンピューター システムを悪意のあるモバイル コードから保護したり、発行元が不明なコードの安全な実行を確保したりできるほか、信頼されているコードのセキュリティが故意または過失によって侵害されることを防止できます。 コード アクセス セキュリティにより、コードの発行元や、コードの正体を示すその他の基準に基づいて、さまざまな信頼レベルをコードに対して設定できます。 また、コードに対してさまざまな信頼レベルを強制的に適用することにより、実行するために完全に信頼されていなければならないコードの数は少なくなります。 コード アクセス セキュリティを使用することで、作成したコードが悪意のあるコードやバグのあるコードによって誤用される可能性も低くなります。 さらに、コードによって実行できる一連の操作を指定できるため、開発者の責任を軽減できます。 コード アクセス セキュリティは、コードにセキュリティの脆弱性があった場合に、それによって被る可能性のある損害を最小限に抑えるためにも役立ちます。
メモ |
---|
.NET Framework Version 4 では、コード アクセス セキュリティ システムに大幅な変更が加えられています。最も重要な変更点は、透過的セキュリティの導入ですが、コード アクセス セキュリティに影響を及ぼす重要な変更は、このほかにもあります。これらの変更については、「.NET Framework 4 におけるセキュリティの変更点」を参照してください。 |
コード アクセス セキュリティは、主にライブラリ コードと部分的に信頼されたアプリケーションに影響します。 ライブラリ開発者は、部分的に信頼されたアプリケーションによる認証されていないアクセスからコードを保護する必要があります。 部分的に信頼されたアプリケーションは、インターネットなどの外部リソースから読み込まれるアプリケーションです。 デスクトップまたはローカル イントラネットにインストールされているアプリケーションは、完全に信頼されたアプリケーションとして実行されます。 完全に信頼されたアプリケーションは、完全に信頼されているため、透過的セキュリティとマークされている場合を除き、コード アクセス セキュリティの影響を受けません。 完全に信頼されたアプリケーションの唯一の制限事項は、SecurityTransparentAttribute 属性でマークされているアプリケーションは SecurityCriticalAttribute 属性でマークされているコードを呼び出すことができない点です。 部分的に信頼されたアプリケーションは、コード アクセス セキュリティを適用できるように、サンドボックス (Internet Explorer など) で実行する必要があります。 インターネットからアプリケーションをダウンロードし、デスクトップから実行しようとすると、NotSupportedException が返されます。このとき、"ネットワーク上の場所からアセンブリの読み込みを試みました。以前のバージョンの .NET Framework では、これによりアセンブリがサンドボックス化されました。 このリリースの .NET Framework では CAS ポリシーが既定で有効ではないため、この読み込みは危険な場合があります。" というメッセージが表示されます。 アプリケーションを確実に信頼できる場合、そのアプリケーションは、<loadFromRemoteSources> 要素を使用して、完全に信頼されたアプリケーションとして実行できます。 アプリケーションをサンドボックス内で実行する方法の詳細については、「方法 : サンドボックスで部分信頼コードを実行する」を参照してください。
共通言語ランタイムに対応したマネージ コードは、コード アクセス セキュリティ呼び出しを行わない場合でも、コード アクセス セキュリティの利点を享受することになります。 詳細については、「コード アクセス セキュリティの基礎」を参照してください。
コード アクセス セキュリティの主な機能
コード アクセス セキュリティにより、コードがアクセスする対象を保護されたリソースと保護された操作に制限できます。 .NET Framework では、コード アクセス セキュリティは次の機能を果たします。
さまざまなシステム リソースへのアクセス権を表すアクセス許可およびアクセス許可セットを定義します。
呼び出し元に特定のアクセス許可が与えられていることをコード自身が要求できるようにします。
呼び出し元にデジタル署名があることをコード自身が要求できるようにします。これにより、特定の組織またはサイトからの呼び出し元だけが、保護されたコードを呼び出すことができます。
コール スタック上のすべての呼び出し元に実際に与えられているアクセス許可と、それらの呼び出し元が持つ必要があるアクセス許可とを比較することによって、コードに対して実行時に制限を適用します。
呼び出し履歴のウォーク
コードがリソースにアクセスしたり、操作を実行したりすることを許可されているかどうかを判断するために、ランタイムのセキュリティ システムはスタック ウォークを行い、コール スタック内の各呼び出し元に与えられているアクセス許可と、要求されているアクセス許可とを比較します。 コール スタックに、要求されたアクセス許可を持っていない呼び出し元があった場合は、セキュリティ例外がスローされ、アクセスは拒否されます。 スタック ウォークは、信頼レベルの低いコードが信頼レベルの高いコードを呼び出して利用し、承認されていないアクションを実行しようとする攻撃を防止できるようにするために実行します。 コードの呼び出し元すべてに対して実行時にアクセス許可を要求することは、確かにパフォーマンスに影響しますが、信頼レベルの低いコードによる攻撃からコードを保護できるようにするためには必要です。 パフォーマンスを最適化するためにコードが実行するスタック ウォークを減らすこともできますが、その場合は、セキュリティの脆弱性を露呈しないように注意する必要があります。
アセンブリ A4 のメソッドが、その呼び出し元にアクセス許可 P が与えられていることを要求する場合に、結果として行われるスタック ウォークを次の図に示します。
セキュリティ スタック ウォーク
関連トピック
タイトル |
説明 |
---|---|
コード アクセス セキュリティとその最も一般的な使用方法について説明します。 |
|
.NET Framework 4 の透過的セキュリティ モデルについて説明します。 |
|
ライブラリを有効にしてアンマネージ コードと共に使用できるようにする方法と、アンマネージ コードからライブラリを使用する方法について説明します。 |
|
クラス ライブラリに関するセキュリティ上の考慮事項を説明します。 |
|
カスタム アクセス許可の作成方法について説明します。 |
|
.NET Framework セキュリティ システムで使用されるさまざまな重要用語および概念について概要を示します。 |
|
ロールに基づいて、セキュリティを組み込む方法について説明します。 |
|
アプリケーションに暗号を組み込む方法について説明します。 |
|
.NET Framework セキュリティ システムを実装および管理するために使用するツールについて説明します。 |