リモート処理でのセキュリティ

このトピックの対象は、既存のアプリケーションとの下位互換性のために残されているレガシ テクノロジに特定されています。新規の開発には、このトピックを適用しないでください。分散アプリケーションは、現在は Windows Communication Foundation (WCF) を使用して開発する必要があります。

.NET リモート処理アプリケーションの開発者は、.NET リモート処理のセキュリティへの影響だけでなく、分散アプリケーション全般のセキュリティへの影響についても十分に理解している必要があります。セキュリティで保護された実装を使用していない場合、リモート オブジェクトのメソッドが呼び出されたり、リモート オブジェクトが機密情報を送受信しているときにその情報が傍受されたりする可能性があります。これらの問題を回避するには、クライアントを認証し (場合によってはサーバーの認証も)、クライアントとサーバー間の通信を暗号化する必要があります。

より難しい問題もあります。パラメーターとしてデリゲートを受け取るメソッドを定義するリモート オブジェクトについて考えてみます。悪意のある開発者は、このデリゲートを使用し、サーバー アプリケーションで任意のコードを実行することができます。デリゲートが静的メソッドをラップする場合、そのデリゲートでの呼び出しはリモート処理されません。コードは、デリゲートを呼び出したアプリケーション ドメインで呼び出されます。たとえば、認証されていないクライアントが、リモート オブジェクトを呼び出して静的メソッドをラップするデリゲートを渡すことによって、この脆弱性を利用する可能性があります。静的メソッドを実装するアセンブリをサーバーにコピーできるので、デリゲートが呼び出されると、その静的メソッドがサーバー上で実行されることになります。この問題を回避するには、リモート オブジェクトで使用されるデリゲートを、常にハッカーが推測できないカスタム型とカスタム パラメーターを使用して宣言する必要があります。また、クライアントには、逆シリアル化できる型を定義したり、リモート オブジェクトに渡したりすることを許可しないでください。

ここでは、セキュリティについて、デザイン上の決定に基づくさまざまなアプローチを紹介します。すべてのシナリオを説明することはできませんが、各トピックは出発点として役立ちます。

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

コード アクセス セキュリティとは、保護されているリソースや操作に対して、コードが持つアクセス権を制限できるようにするための機構です。通常、保護されているリソースにコードからアクセスしようとすると、すべてのスタック フレームにそのリソースへのアクセス許可があるかどうかを確認するため、スタック ウォークが実行されます。リモート オブジェクトに対して呼び出しが行われる場合、このスタック ウォークがリモート処理の境界を越えて実行されることはありません。したがって、リモート処理インフラストラクチャには、クライアントまたはサーバー上で実行するための FullTrust アクセス許可が必要です。FullTrust アクセス許可は、コード アクセス セキュリティを実質的に無効にします。リモート処理アプリケーションの認証されていない使用によって、FullTrust アクセス許可への認証されていないアクセスが可能になります。

9hwst9th.note(ja-jp,VS.100).gif注 :
いくつかのシステム型は MarshalByRefObject を拡張しますが、実行時にセキュリティ チェックを実行して、アプリケーション ドメインの外部からその型のオブジェクトをリモートで呼び出すことができないようにします。AppDomainSystem.Windows.Forms.Form は、そのようなシステム型の 2 つの例です。

リモート処理アプリケーションのセキュリティに関する考慮事項

一般に、分散アプリケーションでは、通信チャネルのセキュリティ保護と不適切な使用に対するアプリケーションのセキュリティ保護の 2 つの領域のセキュリティに対処する必要があります。

通信チャネルのセキュリティ保護では、メッセージを暗号化し、送信中に変更されないようにする必要があります。不適切な使用に対するアプリケーションのセキュリティ保護では、呼び出し元の認証と承認が必要です。呼び出し元の認証とは、呼び出し元が名乗っている身元を確認することです。呼び出し元の承認とは、特定の呼び出しの実行や保護されているリソースへのアクセスに必要な権限が呼び出し元にあるかどうかを確認することです。

組み込みチャネルでサポートされているセキュリティは、次のとおりです。

HttpChannel: リモート オブジェクトがインターネット インフォメーション サービス (IIS: Internet Information Services) によってホストされている場合、サポートされるのは認証だけです。暗号化がサポートされるのは、IIS が SSL を使用するように構成されている場合のみです。

TcpChannel: 認証と暗号化をサポートします。

IpcChannel: 認証をサポートします。

9hwst9th.note(ja-jp,VS.100).gif注 :
承認はコード内で指定する必要があります。組み込みチャネルには承認の機能が用意されていません。組み込みチャネルでは、コードで何を実行するか、またどのような制限を適用しているのかを認識できないためです。

9hwst9th.Caution(ja-jp,VS.100).gif注意 :
.NET Framework リモート処理は、既定では認証も暗号化も実行しません。したがって、クライアントやサーバーとリモートで通信する前に、それらの ID の確認に必要な手順をすべて実行することをお勧めします。.NET Framework リモート処理アプリケーションの実行には、FullTrust アクセス許可が必要です。認証されていないクライアントがサーバーへのアクセスを許可された場合は、完全な信頼を与えられているものとして、コードを実行できてしまいます。常に、クライアントを認証し、通信ストリームを暗号化してください。

参照

リファレンス

RemotingConfiguration
ChannelServices
Context
MethodCall
RemotingServices

概念

HTTP チャネルでの認証

その他のリソース

.NET Framework リモート処理の概要