方法: 企業内のエンドポイントをロックダウンする

大規模な企業では、多くの場合、企業のセキュリティ ポリシーに準拠してアプリケーションを開発する必要があります。 ここでは、コンピューターにインストールされているすべての Windows Communication Foundation (WCF) クライアント アプリケーションを検証するのに使用できるクライアント エンドポイント検証コントロールを開発してインストールする方法を説明します。

この場合、このエンドポイント動作は machine.config ファイルのクライアントの <commonBehaviors> セクションに追加されるため、検証コントロールはクライアント検証コントロールです。 WCF は、クライアント アプリケーションだけを対象に共通のエンドポイント動作を読み込み、サービス アプリケーションだけを対象に共通のサービス動作を読み込みます。 サービス アプリケーション用のこの同じ検証コントロールをインストールするには、検証コントロールがサービス動作であることが必要です。 詳細については、<commonBehaviors> セクションに関する記事を参照してください。

重要

アプリケーションが部分信頼環境で実行されている場合、構成ファイルの <commonBehaviors> セクションに追加された AllowPartiallyTrustedCallersAttribute 属性 (APTCA) でマークされていないサービス動作またはエンドポイント動作は実行されません。この場合、例外はスローされません。 検証コントロールなどの共通動作を強制的に実行するには、次のいずれかを行う必要があります。

  • 共通動作を AllowPartiallyTrustedCallersAttribute 属性でマークし、部分信頼アプリケーションとして展開したときに実行できるようにします。 APTCA でマークされたアセンブリを実行できないように、コンピューターでレジストリ エントリを設定できます。

  • アプリケーションが完全信頼アプリケーションとして配置されている場合に、ユーザーが部分信頼環境でアプリケーションを実行するようにコード アクセス セキュリティ設定を変更できないことを確認します。 ユーザーがこのような変更を行うことができる場合、カスタム検証コントロールは実行されず、例外もスローされません。 これを確認する方法については、コード アクセス セキュリティ ポリシー ツール (Caspol.exe)levelfinal オプションを参照してください。

詳細については、「部分信頼のベスト プラクティス」および「サポートする配置シナリオ」を参照してください。

エンドポイント検証コントロールを作成するには

  1. IEndpointBehavior メソッドに、必要な検証手順を備えた Validate を作成します。 コードの例は次のとおりです。 (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.");
        }
    
  2. 手順 1. で作成したエンドポイント検証コントロールを登録する新しい BehaviorExtensionElement を作成します。 このコード例を次に示します。 (この例の元のコードは、「セキュリティの検証」のサンプルにあります。)

    public class InternetClientValidatorElement : BehaviorExtensionElement
    {
        public override Type BehaviorType
        {
            get { return typeof(InternetClientValidatorBehavior); }
        }
    
        protected override object CreateBehavior()
        {
            return new InternetClientValidatorBehavior();
        }
    }
    
  3. コンパイル済みのアセンブリが厳密な名前で署名されていることを確認します。 詳細については、「厳密名ツール (SN.EXE)」および言語のコンパイラ コマンドを参照してください。

検証コントロールをターゲット コンピューターにインストールするには

  1. 適切な機構を使用してエンドポイント検証をインストールします。 企業では、グループ ポリシーと Systems Management Server (SMS) を使用してインストールします。

  2. Gacutil.exe (グローバル アセンブリ キャッシュ ツール) を使用して、厳密な名前のアセンブリをグローバル アセンブリ キャッシュにインストールします。

  3. System.Configuration 名前空間の型を使用して、次の処理を行います。

    1. 完全修飾型名を使用して <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);
      
    2. <commonBehaviors> セクションの EndpointBehaviors プロパティに動作要素を追加し、その要素をロックします。 (サービスの検証コントロールをインストールするには、検証コントロールが IServiceBehavior であることが必要です。また、検証コントロールを ServiceBehaviors プロパティに追加する必要があります。) 次のコード例は、手順 a. と b. の後の適切な構成を示しています。厳密な名前が存在しない点だけが異なります。

      // 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);
      
    3. 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();

.NET Framework のセキュリティ

また、構成ファイルの要素を暗号化する必要がある場合もあります。 詳細については、「参照」を参照してください。

関連項目