Практическое руководство. Блокировка конечных точек в среде предприятия

Крупным предприятиям часто требуется, чтобы приложения разрабатывались в соответствии с политиками безопасности предприятия. В следующем разделе описывается разработка и установка проверяющего средства конечной точки клиента, который можно использовать для проверки всех клиентских приложений Windows Communication Foundation (WCF), установленных на компьютерах.

В этом случае проверяющий элемент является клиентским проверятелем, так как это поведение конечной точки добавляется в раздел commonBehaviors> клиента <в файле machine.config. WCF загружает общее поведение конечных точек только для клиентских приложений и загружает поведение общих служб только для приложений-служб. Чтобы установить тот же проверяющий элемент управления для приложения службы, этот элемент управления должен представлять собой поведение службы. Дополнительные сведения см. в разделе commonBehaviors>.<

Внимание

Поведение службы или конечной точки, не отмеченное AllowPartiallyTrustedCallersAttribute атрибутом (APTCA), добавленным в <раздел commonBehaviors> файла конфигурации, не выполняется при запуске приложения в среде частичного доверия, и при этом исключение не возникает. Чтобы принудительно запустить общие поведения, такие как проверяющие элементы управления, необходимо выполнить одно из следующих условий.

  • Помечайте общее поведение с атрибутом AllowPartiallyTrustedCallersAttribute , чтобы он выполнялся при развертывании в качестве приложения частичного доверия. Обратите внимание, что на компьютере может быть установлен соответствующий параметр реестра, чтобы на нем не могли выполняться сборки, помеченные атрибутом APTCA.

  • Убедитесь, что если приложение развертывается как полностью доверенное приложение, которое пользователи не могут изменять параметры безопасности доступа к коду для запуска приложения в среде частичного доверия. Если это так, пользовательский проверяющий элемент управления не выполняется и исключение не создается. Чтобы убедиться в этом, см. параметр с помощью средства политики безопасности доступа к коду levelfinal (Caspol.exe).

Дополнительные сведения см. в разделе "Рекомендации по частичному доверию" и "Поддерживаемые сценарии развертывания".

Создание проверяющего элемента конечной точки

  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. Создает новый класс BehaviorExtensionElement, который регистрирует проверяющий элемент управления конечной точки на шаге 1. Это показано в следующем примере кода. (Исходный код для этого примера находится в Пример проверки безопасности.)

    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. Добавьте элемент поведения в EndpointBehaviors свойство <раздела CommonBehaviors> и заблокируйте элемент. (Чтобы установить проверяющий элемент в службе, проверяющий элемент должен быть 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

Может также возникнуть необходимость зашифровать элементы файла конфигурации. Дополнительные сведения см. в разделе «См. также».

См. также