次の方法で共有


セキュリティで保護されたコーディングガイドライン

ほとんどのアプリケーション コードでは、.NET によって実装されたインフラストラクチャを使用できます。 場合によっては、追加のアプリケーション固有のセキュリティが必要になります。セキュリティ システムを拡張するか、新しいアドホック メソッドを使用して構築します。

コードで .NET によって適用されるアクセス許可やその他の強制を使用して、悪意のあるコードが不要な情報にアクセスしたり、その他の望ましくないアクションを実行したりするのを防ぐために、障壁を設ける必要があります。 さらに、信頼できるコードを使用して、予想されるすべてのシナリオでセキュリティと使いやすさのバランスを取る必要があります。

この概要では、セキュリティ システムを使用するようにコードを設計するさまざまな方法について説明します。

リソース アクセスのセキュリティ保護

コードを設計して記述するときは、特に不明な元のコードを使用または呼び出す場合に、そのコードがリソースに対して持つアクセスを保護して制限する必要があります。 そのため、コードのセキュリティを確保するには、次の手法に注意してください。

  • コード アクセス セキュリティ (CAS) を使用しないでください。

  • 部分信頼コードは使用しないでください。

  • AllowPartiallyTrustedCaller 属性 (APTCA) を使用しないでください。

  • .NET リモート処理は使用しないでください。

  • 分散コンポーネント オブジェクト モデル (DCOM) は使用しないでください。

  • バイナリ フォーマッタは使用しないでください。

コード アクセス セキュリティと Security-Transparent コードは、部分的に信頼されたコードのセキュリティ境界としてサポートされていません。 代替のセキュリティ対策を実施せずに、不明なオリジンのコードを読み込んで実行することはお勧めします。 別のセキュリティ対策は次のとおりです。

  • 仮想化

  • AppContainers

  • オペレーティング システム (OS) のユーザーとアクセス許可

  • Hyper-V コンテナー

セキュリティに依存しないコード

セキュリティに依存しないコードは、セキュリティ システムでは明示的には何も行いません。 これは、受信したアクセス許可で実行されます。 保護された操作 (ファイルの使用、ネットワークなど) に関連付けられているセキュリティ例外をキャッチできないアプリケーションでは、ハンドルされない例外が発生する可能性がありますが、セキュリティに依存しないコードでは、.NET のセキュリティ テクノロジが引き続き利用されます。

セキュリティに依存しないライブラリには、理解しておく必要がある特別な特性があります。 ライブラリに、ファイルを使用する API 要素やアンマネージ コードを呼び出す API 要素があるとします。 コードに対応するアクセス許可がない場合は、説明どおりに実行されません。 ただし、コードにアクセス許可がある場合でも、それを呼び出すアプリケーション コードが機能するためには、同じアクセス許可が必要です。 呼び出し元のコードに適切なアクセス許可がない場合は、コード アクセス セキュリティ スタックウォークの結果として SecurityException が表示されます。

再利用可能なコンポーネントではないアプリケーション コード

コードが他のコードによって呼び出されないアプリケーションの一部である場合、セキュリティは単純であり、特別なコーディングは必要ない場合があります。 ただし、悪意のあるコードがコードを呼び出す可能性があることを覚えておいてください。 コード アクセス セキュリティによって、悪意のあるコードがリソースにアクセスできなくなる可能性はありますが、そのようなコードでは、機密情報を含む可能性のあるフィールドまたはプロパティの値を読み取る可能性があります。

さらに、コードがインターネットやその他の信頼できないソースからのユーザー入力を受け入れる場合は、悪意のある入力に注意する必要があります。

ネイティブ コード実装へのマネージド ラッパー

通常、このシナリオでは、マネージド コードで使用できるようにするネイティブ コードに便利な機能が実装されています。 マネージド ラッパーは、プラットフォーム呼び出しまたは COM 相互運用のいずれかを使用して簡単に記述できます。 ただし、これを行う場合、ラッパーの呼び出し元は、成功するためにアンマネージ コード権限を持っている必要があります。 既定のポリシーでは、イントラネットまたはインターネットからダウンロードしたコードがラッパーで機能しないことを意味します。

これらのラッパーを使用するすべてのアプリケーションにアンマネージ コード権限を付与する代わりに、ラッパー コードにのみこれらの権限を付与することをお勧めします。 基になる機能がリソースを公開せず、実装も同様に安全な場合、ラッパーは権限をアサートするだけで済み、コードで呼び出すことができます。 リソースが関係する場合、セキュリティ コーディングは、次のセクションで説明するライブラリ コード ケースと同じである必要があります。 ラッパーは呼び出し元をこれらのリソースに公開する可能性があるため、ネイティブ コードの安全性を慎重に検証する必要があり、ラッパーの責任です。

保護されたリソースを公開するライブラリ コード

次のアプローチは最も強力であるため、セキュリティ コーディングに対して (正しく行わない場合に) 危険になる可能性があります。ライブラリは、使用するリソースに対するアクセス許可を .NET クラスが適用するのと同様に、他のコードが使用できない特定のリソースにアクセスするためのインターフェイスとして機能します。 リソースを公開する場合は必ず、コードはまずリソースに適したアクセス許可を要求し (つまり、セキュリティ チェックを実行する必要があります)、通常は実際の操作を実行する権限をアサートする必要があります。

こちらも参照ください