WCF-セキュリティ
WCFサービスは、目的のクライアントのみがサービスにアクセスできるように、2つのセキュリティモードまたはレベルを備えた堅牢なセキュリティシステムを誇っています。分散トランザクションで一般的なセキュリティの脅威は、WCFによって大幅に緩和されます。
主なセキュリティ機能
次の図に示すように、WCFサービスには4つの主要なセキュリティ機能があります。
Authentication −ここで、認証はメッセージの送信者を識別することに限定されず、相互に行われます。つまり、あらゆる種類の中間者攻撃の可能性を排除するために、メッセージ受信者の認証が必要です。
Authorization−これは、セキュリティを確保するためにWCFサービスが実行する次のステップであり、ここで、サービスが呼び出し元に続行を許可するかどうかを決定します。承認は認証に依存しませんが、通常は認証に従います。
Confidentiality−発信者とサービスの間の情報交換は、メッセージが意図されていない他の人による解釈を制限するために機密に保たれます。これを可能にするために、暗号化は他のさまざまなメカニズムとともに使用されます。
Integrity −最後の重要な概念は、整合性を維持することです。つまり、送信者から受信者への移動中にメッセージがだれによっても改ざんされていないことを保証します。
転送セキュリティモード
WCFは、クライアントとサーバー間の安全な通信を確保するために、次の転送セキュリティモードを提供します。さまざまな転送セキュリティモードを以下に示します。
None−このモードは、いかなる種類のメッセージセキュリティも保証せず、サービスはクライアントに関する資格情報を取得しません。このモードは、メッセージの改ざんを許可する可能性があるため、お勧めできないため、非常に危険です。
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "None"/>
</binding>
</wsHttpBinding>
Transport−このモードは、TCP、IPC、Https、MSMQなどの通信プロトコルを使用してメッセージの安全な転送を実現する最も簡単な方法です。このモードは、転送がポイントツーポイントであり、主に制御された環境、つまりイントラネットアプリケーションで使用される場合に、より効果的です。
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "Transport"/>
</binding>
</wsHttpBinding>
Message−セキュリティモードは相互認証を可能にし、メッセージが暗号化され、安全なプロトコルとは見なされないhttpを介して転送できるため、プライバシーを大幅に提供します。ここでは、メッセージ転送に関与する仲介者の数や、セキュリティで保護されたトランスポートがあるかどうかを考慮せずに、セキュリティがエンドツーエンドで提供されます。このモードは通常、インターネットアプリケーションで使用されます。
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "Message"/>
</binding>
</wsHttpBinding>
Mixed −このセキュリティモードは頻繁には使用されず、クライアント認証はクライアントレベルでのみ提供されます。
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "TransportWithMessageCredential"/>
</binding>
</wsHttpBinding>
Both−このセキュリティモードは、トランスポートセキュリティとメッセージセキュリティの両方で構成され、堅牢なセキュリティカバーを提供しますが、多くの場合、全体的なパフォーマンスが過負荷になります。これはMSMQでのみサポートされています。
<netMsmqBinding>
<binding name = "WCFSecurityExample">
<security mode = "Both"/>
</binding>
</netMsmqBinding>
BasicHttpBindingを除くすべてのWCFバインディングには、デフォルトである程度の転送セキュリティがあります。
メッセージセキュリティレベル
メッセージレベルのセキュリティは、WCFプロトコルに依存しません。標準のアルゴリズムを使用してデータを暗号化することにより、メッセージデータ自体で使用されます。メッセージセキュリティレベルのさまざまなバインディングに使用できるクライアント資格情報がいくつかあります。これらについては、以下で説明します。
Client credentials for message level security in WCF
None−ここでは、メッセージを保護するために暗号化が使用されますが、クライアント認証は実行されません。つまり、匿名クライアントがサービスにアクセスできます。BasicHttpBindingを除いて、すべてのWCFバインディングはこのクライアント資格情報をサポートします。ただし、NetNamedPipeBindingの場合、このクライアント資格情報はまったく使用できないことに注意してください。
Windows−ここでは、メッセージの暗号化とクライアント認証の両方が、リアルタイムでログインしたユーザーに対して行われます。この場合も、他のすべてのWCFバインディングとは異なり、NetNamedPipeBindingは使用できず、BasicHttpBindingはサポートを提供しません。
UserName−ここでは、メッセージはユーザー名を提供することによって暗号化および保護され、クライアントはパスワードを提供する必要があるときに認証されます。BasicHttpBindingは、上記の2つのクライアント資格情報と同様に、UserNameをサポートしておらず、NetNamedPipeBindingでは使用できません。
Certificate−メッセージの暗号化に加えて、クライアントとサービスの両方が証明書による認証を取得します。このクライアント資格情報は使用可能であり、NetNamedPipeBindingを除くすべてのWCFバインディングでサポートされています。
IssuedToken− Cardspaceなどの機関から発行されたトークンは、メッセージの認証に使用されます。メッセージの暗号化もここで実行されます。
次のコードは、クライアントの資格情報がWCFメッセージのセキュリティレベル/モードでどのように構成されているかを示しています。
<netTcpBinding>
<binding name = "WCFMessageSecurityExample">
<security mode = "Message">
<message clientCredentialType = "None"/>
</security>
</binding>
</netTcpBinding>
<netMsmqBinding>...</netMsmqBinding>
</bindings>
<behaviors>...</behaviors>
ここで、トランスポートセキュリティモードはメッセージセキュリティレベルよりも優れていることに注意する必要があります。前者の方が高速だからです。追加のコーディングを必要とせず、相互運用性のサポートを提供するため、全体的なパフォーマンスが低下することはありません。
ただし、セキュリティの観点から、メッセージセキュリティモードはより堅牢で、プロトコルに依存せず、エンドツーエンドのセキュリティを提供します。