方法 : 企業内のエンドポイントをロックダウンする
大規模な企業では、多くの場合、企業のセキュリティ ポリシーに準拠してアプリケーションを開発する必要があります。ここでは、コンピューターにインストールされているすべての Windows Communication Foundation (WCF) クライアント アプリケーションを検証できるクライアント エンドポイント検証を開発してインストールする方法を説明します。
この場合、このエンドポイント動作は machine.config ファイルのクライアントの <commonBehaviors> セクションに追加されるため、検証コントロールはクライアント検証コントロールです。WCF は、クライアント アプリケーションだけを対象に共通のエンドポイント動作を読み込み、サービス アプリケーションだけを対象に共通のサービス動作を読み込みます。サービス アプリケーション用のこの同じ検証コントロールをインストールするには、検証コントロールがサービス動作であることが必要です。詳細については、次のトピックを参照してください。「<commonBehaviors>」のセクションを参照してください。
注 : |
---|
アプリケーションが部分信頼環境で実行されている場合、構成ファイルの <commonBehaviors> セクションに追加された AllowPartiallyTrustedCallersAttribute 属性 (APTCA) でマークされていないサービス動作またはエンドポイント動作は実行されません。この場合、動作が実行されなくても、例外はスローされません。検証コントロールなどの共通動作を強制的に実行するには、次のいずれかを行う必要があります。 -- 共通動作を AllowPartiallyTrustedCallersAttribute 属性でマークし、部分信頼アプリケーションとして展開したときに実行できるようにします。APTCA でマークされたアセンブリを実行できないように、コンピューターでレジストリ エントリを設定できます。 -- アプリケーションが完全信頼アプリケーションとして展開されている場合に、ユーザーが部分信頼環境でアプリケーションを実行するようにコード アクセス セキュリティ設定を変更できないことを確認します。ユーザーがこのような変更を行うことができる場合、カスタム検証コントロールは実行されず、例外もスローされません。これを確認する方法については、Code Access Security Policy Tool (Caspol.exe) を使用した levelfinal オプションを参照してください。 詳細については、「部分信頼のベスト プラクティス」および「サポートされている配置シナリオ」を参照してください。 |
エンドポイント検証コントロールを作成するには
Validate メソッドに、必要な検証手順を備えた IEndpointBehavior を作成します。コード例を次に示します (
InternetClientValidatorBehavior
は、「セキュリティ検証」のサンプルから引用しています)。public class InternetClientValidatorBehavior : IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint serviceEndpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, System.ServiceModel.Dispatcher.ClientRuntime behavior) { } public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) { } public void Validate(ServiceEndpoint endpoint) { BindingElementCollection elements = endpoint.Binding.CreateBindingElements(); if (EndpointIsDual(endpoint, elements)) throw new InvalidOperationException("InternetClientValidator: endpoint uses 'dual' mode. This mode is disallowed for use with untrusted services."); if (EndpointAllowsNtlm(endpoint, elements)) throw new InvalidOperationException("InternetClientValidator: endpoint allows NTLM. This mode is disallowed for use with untrusted services."); if (EndpointAllowsTransactionFlow(endpoint, elements)) throw new InvalidOperationException("InternetClientValidator: endpoint flows transaction ids. This mode is disallowed for use with untrusted services."); }
手順 1. で作成したエンドポイント検証コントロールを登録する新しい BehaviorExtensionElement を作成します。このコード例を次に示します (この例の元のコードは、「セキュリティ検証」のサンプルにあります)。
public class InternetClientValidatorElement : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(InternetClientValidatorBehavior); } } protected override object CreateBehavior() { return new InternetClientValidatorBehavior(); } }
コンパイル済みのアセンブリが厳密な名前で署名されていることを確認します。詳細については、「Strong Name Tool (Sn.exe)」および言語のコンパイラ コマンドを参照してください。
検証コントロールをターゲット コンピューターにインストールには
適切な機構を使用してエンドポイント検証をインストールします。企業では、グループ ポリシーと Systems Management Server (SMS) を使用してインストールします。
Global Assembly Cache Tool (Gacutil.exe) を使用して、厳密な名前付きのアセンブリをグローバル アセンブリ キャッシュにインストールします。
System.Configuration 名前空間の型を使用して、次の処理を行います。
完全修飾型名を使用して、<behaviorExtensions> セクションに拡張を追加し、要素をロックします。
// Register our validator configuration element. ExtensionsSection extensions = machine.GetSection(@"system.serviceModel/extensions") as ExtensionsSection; if (extensions == null) throw new Exception("not extensions section."); ExtensionElement validator = new ExtensionElement( "internetClientValidator", "Microsoft.ServiceModel.Samples.InternetClientValidatorElement, InternetClientValidator, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" ); validator.LockItem = true; if (extensions.BehaviorExtensions.IndexOf(validator) < 0) extensions.BehaviorExtensions.Add(validator);
動作要素を <commonBehaviors> セクションの EndpointBehaviors プロパティに追加して要素をロックします (サービスの検証コントロールをインストールするには、検証コントロールが IServiceBehavior であることが必要です。また、検証コントロールを ServiceBehaviors プロパティに追加する必要があります)。手順 a. と b. の後に、厳密な名前が存在しないという例外を 1 つだけ設定した適切な構成を次のコード例に示します。
// Add a new section for our validator and lock it down. // Behaviors for client applications must be endpoint behaviors. // Behaviors for service applications must be service behaviors. CommonBehaviorsSection commonBehaviors = machine.GetSection(@"system.serviceModel/commonBehaviors") as CommonBehaviorsSection; InternetClientValidatorElement internetValidator = new InternetClientValidatorElement(); internetValidator.LockItem = true; commonBehaviors.EndpointBehaviors.Add(internetValidator);
machine.config ファイルを保存します。次のコード例では、手順 3. にあるすべてのタスクを実行しますが、変更された machine.config ファイルのコピーはローカルに保存されます。
// Write to disk. machine.SaveAs("newMachine.config"); // Write our new information. SectionInformation cBInfo = commonBehaviors.SectionInformation; Console.WriteLine(cBInfo.GetRawXml()); Console.WriteLine(extensions.SectionInformation.GetRawXml()); Console.Read();
例
次のコード例では、machine.config ファイルに共通の動作を追加し、そのコピーをディスクに保存する方法を示します。InternetClientValidatorBehavior
は、「セキュリティ検証」のサンプルから引用しています。
Configuration machine = ConfigurationManager.OpenMachineConfiguration();
// Register our validator configuration element.
ExtensionsSection extensions
= machine.GetSection(@"system.serviceModel/extensions") as ExtensionsSection;
if (extensions == null)
throw new Exception("not extensions section.");
ExtensionElement validator
= new ExtensionElement(
"internetClientValidator",
"Microsoft.ServiceModel.Samples.InternetClientValidatorElement, InternetClientValidator, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
);
validator.LockItem = true;
if (extensions.BehaviorExtensions.IndexOf(validator) < 0)
extensions.BehaviorExtensions.Add(validator);
// Add a new section for our validator and lock it down.
// Behaviors for client applications must be endpoint behaviors.
// Behaviors for service applications must be service behaviors.
CommonBehaviorsSection commonBehaviors
= machine.GetSection(@"system.serviceModel/commonBehaviors") as CommonBehaviorsSection;
InternetClientValidatorElement internetValidator = new InternetClientValidatorElement();
internetValidator.LockItem = true;
commonBehaviors.EndpointBehaviors.Add(internetValidator);
// Write to disk.
machine.SaveAs("newMachine.config");
// Write our new information.
SectionInformation cBInfo = commonBehaviors.SectionInformation;
Console.WriteLine(cBInfo.GetRawXml());
Console.WriteLine(extensions.SectionInformation.GetRawXml());
Console.Read();
セキュリティ
また、構成ファイルの要素を暗号化する必要がある場合もあります。詳細については、「参照」を参照してください。