68

警告:

この質問が出されてから、.Net および .Net コアの新しいバージョンでは、「コード アクセス セキュリティ」(CAS) が削除または変更されています。

元の質問:

私は70-536 .NET Framework - Application Development Foundation Examの勉強をしている最中です。長年 .net をプログラミングしてきたので、これは難しいことではありません。

ただし、「コード アクセス セキュリティ」(CAS) について学習する必要があります。使用したり構成したりする必要がなかったので、他の誰かが実際の使用方法を見つけたのではないかと思っていました。

CAS を使用したことがあり、それが問題ではなく解決策の一部となった例を挙げてください。

(これまでのところ、他のすべてのことは、私が長年の .NET プログラミングでやらなければならなかったタスクと関係があります)


関連する質問:


これまでの結果。

  • CAS は、サード パーティのコードをホストしている場合に役立ちます。たとえば、Web ホスティング会社はこれを使用して、顧客の Asp.net コードがサーバーに損害を与えるのを防ぐことができます。(VBA の代わりに .NET を使用する場合、Office でも使用されます)

  • これまでのところ、Microsoft アプリケーション以外で使用されている唯一の詳細な例は次のとおりです。

    私が最近行ったプロジェクトには、似たようなものがありました。ユーザーがライブラリをアップロードし、パフォーマンスをテストできるようにします (「誰が最高のアルゴリズムを作成するか」)。言うまでもなく、そこには CAS が大いに必要でした。

  • CAS は、米国国防総省のような JITDC 認定を取得するのに役立つようですが、CAS に実際の価値があるかどうか、または単にボックス ティックであったかどうかはわかりません。

(CAS を使用するホストをバイパスする必要があり、それらのマシンの管理者権限を持っている場合は、アセンブリを GAC に配置するだけです。)

今後の展望として、.net 4 では CAS は少し複雑ではありません


少なくとも新しい Microsoft 試験には、CAS を含む「基礎」試験はないようです。それが新しい Winforms/WPF 試験に採用されるかどうかはわかりません。

4

8 に答える 8

35

「現実世界」でコード アクセス セキュリティに遭遇することはよくありますが、それは思いも寄らないことがよくあります。そして、ある意味では、SilverLight がCAS を最終的にまったく採用しないことを選択しなければ、SilverLight は優れた現実世界のアプリケーションになるでしょう。

ホスティング プロバイダー

ASP.NET 自体はもちろんですが、ASP.NET ホスティング プロバイダーは、貴重なシステムへの侵入を防ぐために、変更されたセキュリティ モデルを使用しています。私は Webhost4Life がこれを使用していることを知っています (彼らのサイトにはそれに関する情報はありませんが、私は彼らと協力してきました。本当にそこにあります)。さらに見てみると、他の ASP.NET ホスティング プロバイダーも同じことを行っていますが、どちらも明確ではありませ . 一部のクラウド ホスティング サイト (rackspacecloud) はそれをさらに進め、「変更された完全な信頼レベルのために Microsoft と協力」しました

つまり、ASP.NET ホストを見つけた場合、そのホストは CAS を使用して、ユーザーが望んでいないことを実行できないようにしている可能性があります。彼らはそれを使用して、「基本的な」(制限が多い)ホスティングと「エンタープライズ」(制限が少ない)ホスティングの違いを生み、CASにまったく別の意味を与えることさえできます.

CASのその他の応用

私自身が遭遇したいくつかの現実世界の状況については以上です。私が最近行ったプロジェクトには、似たようなものがありました。ユーザーがライブラリをアップロードし、パフォーマンスをテストできるようにします (「誰が最高のアルゴリズムを作成するか」)。言うまでもなく、そこには CAS が大いに必要でした。その他の例または興味深いリソース:

  • NAR ローダー(codeproject アプリケーション) は独自の CAS を使用します
  • LR Evaluator (codeproject アプリも) は CAS を使用します
  • ClickOnce (下記参照) は CAS を使用します
  • CAS デザイン パターン: CAS が使用されていることを「前提」として人気があります
  • CAS を理解する: さらに人気が高まり、いくつかのコメントはアプリケーションを暗示しています
  • Microsoft SharePoint は CAS をずっと使用しているようです (申し訳ありませんが、私は SP の専門家ではありません)。

単に自分で完全に制御でき、独自のアプリとコードを構築し (または構築してもらい)、システムを完全に制御できる状況では、CAS が頻繁に必要になることはないと思います。信頼性の低いソースからコードを実行するためにすぐに使用するものです (基本的に、完全に制御できないすべてのものです)。

CAS と ClickOnce

デフォルトの CAS 設定は、ネットワーク共有またはその他の非ローカル ソースから実行されるコードの機能を制限します。これは理にかなっていますが、制限が厳しいため、分散アプリケーションの中央リポジトリを持つことが難しくなっています。.NET 2.0 では ClickOnce が導入されました。これにより、セキュリティが向上するはずでした (議論はこちら)。

ClickOnce 自体は CASを使用して、インストーラーがシステム関数を呼び出さないようにします。そのため、おそらくCAS に依存する最もよく知られているアプリケーションであると私は信じています。

ポイントは、共有から直接実行できるものを作成できるように CAS を理解する必要があるか、すべてを無視して ClickOnce を使用することです。

Microsoft の CAS に関する調査

2005 年、Microsoftは CAS があまり人気がない理由を明らかにするためにアンケートを実施しました。残念ながら、実際の調査結果を見つけることができませんでした。CAS が十分に活用されていない理由を詳しく説明しているこの投稿以外にはありません。

異世界のCAS

ただし、その投稿は、興味深いニッチを指しています: CAS は別の世界に適用されます: Unix / Linux. 彼らはそれを CAS とは呼ばず、代わりにBitFrostと呼んでいます。実世界のアプリケーションではどうですか:従来の Unix セキュリティ モデルの代わりとして BitFrost に依存している"One Laptop Per Child" プロジェクトです。

更新: BitFrost としての Unix/Linux の CAS に関するセクションと調査に関するセクション。
更新: CAS と ClickOnce のセクションを追加
更新: CAS を使用するリソースのリストを追加

于 2009-10-14T16:22:13.633 に答える
10

技術的には、非常にきめ細かい許可指定が可能になるため、非常に便利です。これは、あなたにとっても(理論的には、セキュリティの脆弱性を悪用するのが非常に難しくなるため、攻撃者がアプリを完全に制御できるようになったとしても、CASサンドボックスにロックされたままになります)、顧客にとっても(彼らはあなたのアプリケーションは独自のセキュリティ監査を実行できます)。

実際の使用では、ほとんど意味がありません。複雑すぎて、利用可能な開発ツールでサポートされているものが少なすぎて、ほとんどのユーザーはとにかく気にしないと思います。

もちろん例外もあり(政府や.net / CASを本当に知っている顧客)、CASは絶対に便利で必須ですが、現実には明確な言葉が使われています。

于 2009-10-14T16:37:27.557 に答える
5

読者への注意: 以下の 2 つのコメントを参照してください。RBS を (誤って) 含めるために、誤って CAS の定義を膨らませているように思えます。参考までに回答をここに残しておきますが、違いに注意してください。


CAS には 2 つの問題があります。その試験で最もよく見られるのは、他のコードを呼び出すコードのすべてのニュアンスです。これは、部分的な信頼には役立つかもしれませんが、ほとんどの場合、それは単なる苦痛であり、さらに悪いことに、コードが完全に信頼されている場合 (ほとんど/多すぎます)実際には実行されません(完全にスキップされます)。

CAS RBSの有用な部分は使用されるプリンシパル許可です。もちろん、UI は機能へのアクセスを確認する必要がありますが、(ローダウン ロジックに) 次のように記述できます。

[PrincipalPermission(SecurityAction.Demand, Role = "ADMIN")]
static void DeleteOrder(int id) { ... }

これは、完全な信頼でも適用されます。IPrincipal(参照) を実装することで、(ユーザーに関連付けられた) 独自のプリンシパルを定義できますIsInRole()。また、プリンシパルはほとんどの環境 (winforms、webforms、mvc、wcf など) でサポートされているため、特定のセキュリティ モデルを参照することなく、ビジネス レイヤーでセキュリティを再確認する非常に柔軟な方法を実現できます。上記のチェックはどの環境でも機能することに注意してください。

おそらくこれを使用して、UI を駆動することもできます。プリンシパルに基づいてwinformsコントロールを有効/無効にするusenet投稿がありました(ランタイムプロパティを使用して、コントロールごとの役割を指定するToolTipなど)-ただし、その分は見つかりません(編集:おそらくこれ)。

于 2009-10-18T08:49:44.040 に答える
2

The thing to understand about Code Access Security is that it is of very little use to an application developer beyond understanding how it is being used and at what permission level for API's that you may be calling. The only exception to this, that I have really found useful is a CAS called PrincipalPermission, it basically doesn't allow certain code to be executed if the right Role isn't defined for the current Principal. See this post on it:

http://www.coderjournal.com/2008/03/securing-mvc-controller-actions/

The developers that really need to pay attention to CAS and how it should be implemented in their application is the framework and code library developers. Because there is certain levels of trust that you need to demand inorder for your application to work especially when dealing with unmanaged resources such as files, network streams, serial ports, etc. Or if you are creating the code for that unmanaged resource like some speicalized server, or any kind of low level access in to your assemblies you will want to create some code access security around it so that people aren't allowed to execute something that has been strictly denied to them.

It doesn't help that Microsoft hasn't really done that great of a job explaining how CAS should be used in every day application. So that is really the reason for lack of use. However CAS is one of the many reasons that .NET is such a secure language and suffers from a lot fewer problems than its competitors.

于 2009-10-14T16:06:23.057 に答える
2

私は、.NET ベースのソリューションのJITC 認定(米国国防総省) を取得するプロジェクトの開発リーダーであり、認定テスト中に CAS 設定が非常に綿密に精査されました。

他のほとんどの認定要件と同様に、コードは機能するために必要な特権のみを使用でき、それ以上は使用できませんでした。

セキュリティ認定の取得を計画している場合、CAS は間違いなく重要です。

于 2009-10-14T16:31:22.897 に答える
1

使用したことはありませんが、CAS についての私の理解では、オブジェクト指向の設計メカニズムを拡張するためにも使用できるということでした。たとえば、データベース アクセスとキャッシュを実装する必要がある銀行向けの大規模なデータ アクセス パッケージを開発しているとします。それらは同じ展開パッケージの一部ですが、プロジェクトの仮想的なサイズを考えると、ロジックは別々のアセンブリに実装する必要があります。これは、さまざまな外力 (データベース インフラストラクチャと消費者の使用) に左右される十分に異なる問題セットであるためです。

ただし、キャッシュ コードは、パッケージ全体のコンシューマーがアクセスできないデータ アクセス アセンブリ内の機密性の高いクラスまたはメソッドにアクセスする必要がある場合があります。したがって、これらのデータ アクセス クラスとメソッドは単純にはできませんpublic。キャッシング アセンブリ内のサブクラスを持つデータ アクセス アセンブリ内の保護されたメソッドは、いくつかのケースを回避できますが、多くの場合、それは継承の悪用です。管理者がキャッシュ アセンブリにのみ付与するpublicカスタム アクセス許可 (例: ) の呼び出し元に配置された LinkDemandsをそのままにしておく方が単純な場合があります。DataPackagePermisson

于 2009-10-22T23:38:48.550 に答える
1

知っておくべきことの 1 つは、コード アクセス セキュリティは、改ざん防止の方法としてはほとんど壊れているということです。見る:

CAS の改ざん防止機能が壊れている: ソフトウェア ライセンスへの影響

...

出荷された製品で改ざんされたアセンブリの使用を防止するために、コード アクセス セキュリティに依存することはできなくなりました。これは、アプリケーションがコード アクセス セキュリティに依存してライセンス チェックを実行している場合、攻撃者がライセンス アセンブリを別のアセンブリに置き換えて、アプリケーションに自由にアクセスできるようにすることは簡単なことです。

...

于 2009-10-21T23:14:42.283 に答える
0

アプリケーションに CAS を使用することはそれほど難しくありませんでした。これは、認証されていないコードの実行を停止しようとしただけだったからです。ローカル ネットワーク共有からソフトウェアを使用すると問題が発生しましたが、cas-policy によって問題が解消されました。

  1. 厳密な名前を使用して、すべてのアセンブリを保護しました。
  2. 厳密な名前ですべてのアセンブリの cas-policy を作成し、厳密な名前で署名されたコードがローカル エリア ネットワークとローカルに配置されたコードから開始できるようにしました。
  3. ローカル ファイル アクセスを必要とするローカル エリア ネットワークから読み込まれたアセンブリ (データ CD を書き込むためのコンポーネント) は、すべてのパブリック クラスでリンク要求属性を取得する必要がありました。

.NET3.5 の更新以降、ローカル エリア ネットワーク上のコードがローカル コードのように処理されるようになったため、問題はなくなりました。

于 2009-10-18T09:04:50.557 に答える