Безопасный прием событий

Временные и постоянные потребители имеют различные методы защиты доставки событий.

В этой статье рассматриваются следующие разделы:

Защита временных потребителей

Временные потребители выполняются до перезагрузки системы или до остановки инструментария WMI, но не могут быть запущены при возникновении определенного события. Например, вызов SWbemServices.ExecNotificationQueryAsync создает временного потребителя.

Вызовы SWbemServices.ExecNotificationQuery или IWbemServices::ExecNotificationQuery создают временные потребители событий. Временные потребители не могут контролировать, кто предоставляет события для создаваемого приемника событий.

Вызовы методов ExecNotificationQuery можно выполнять синхронно, полусинхронно или асинхронно. Например, SWbemServices.ExecNotificationQuery — это синхронный метод, который может вызываться полусинхронно в зависимости от того, как задан параметр iflags . SWbemServices.ExecNotificationQueryAsync — это асинхронный вызов.

Имейте в виду, что обратный вызов в приемник для асинхронных версий этих вызовов может не возвращаться на том же уровне проверки подлинности, что и вызов скрипта. Поэтому вместо асинхронных вызовов рекомендуется использовать полусинхронные вызовы. Если требуется асинхронное взаимодействие, см. статьи Вызов метода и Настройка безопасности для асинхронного вызова.

Подписчики сценариев не могут проверка права доступа поставщика событий для предоставления событий приемнику, созданному скриптом. Поэтому рекомендуется, чтобы вызовы SWbemServices.ExecNotificationQuery использовали полусинхронную форму вызова и использовали определенные параметры безопасности. Дополнительные сведения см. в разделе Создание полусинхронного вызова с помощью VBScript.

Защита постоянных потребителей

Постоянные потребители имеют постоянную подписку на события от поставщика событий, которые будут сохраняться после перезапуска операционной системы. Поставщик событий, поддерживающий постоянных потребителей, является поставщиком потребителей событий. Если поставщик событий не выполняется при возникновении события, WMI запускает поставщик, когда ему необходимо доставить события. WMI определяет поставщика-получателя, в который должны доставляться события, на основе экземпляра __EventConsumerProviderRegistration , который связывает поставщик потребителя __Win32Provider экземпляр с логическим классом потребителей , определенным поставщиком-потребителем. Дополнительные сведения о роли поставщиков-получателей см. в разделе Написание поставщика потребителя событий.

Постоянные потребители могут контролировать, кто отправляет им события, а поставщики событий могут контролировать, кто обращается к их событиям.

Клиентские скрипты и приложения создают экземпляры класса логического потребителя в рамках подписки. Класс логического потребителя определяет, какие сведения содержит событие, что клиент может делать с событием и как доставляется событие.

Стандартные классы потребителей WMI предоставляют примеры роли логических классов потребителей. Дополнительные сведения см. в разделе Мониторинг и реагирование на события с помощью стандартных потребителей.

Защита постоянной подписки

Постоянные подписки имеют больший потенциал для возникновения проблем безопасности в инструментарии WMI и, следовательно, имеют следующие требования к безопасности:

  • Экземпляр логического потребителя, __EventFilter и экземпляры __FilterToConsumerBinding должны иметь один и тот же идентификатор безопасности (SID) в свойстве CreatorSID . Дополнительные сведения см. в разделе Сохранение одного идентификатора безопасности во всех экземплярах постоянной подписки.

  • Учетная запись, создающая подписку, должна быть учетной записью домена с правами локального администратора или учетной записью группы локальных администраторов. Использование идентификатора безопасности группы "Администраторы" позволяет подписке продолжать работать на локальном компьютере, даже если она отключена от сети. Использование учетной записи домена позволяет точно идентифицировать пользователя.

    Однако если компьютер не подключен и создается учетная запись домена, потребитель завершается ошибкой, так как WMI не может проверить удостоверение учетной записи. Чтобы избежать сбоя подписки, если компьютер отключен от сети, используйте идентификатор безопасности группы Администраторы для подписки. В этом случае необходимо убедиться, что учетная запись LocalSystem может получить доступ к данным членства в группе в домене. Некоторые поставщики услуг потребителей событий предъявляют особенно высокие требования к безопасности, так как мошенническая подписка может нанести большой ущерб. Примерами могут быть стандартные потребители ActiveScriptEventConsumer и CommandLineEventConsumer.

  • Вы можете настроить постоянную подписку так, чтобы принимать только события от определенных удостоверений поставщика событий. Задайте для дескриптора безопасности в свойстве EventAccess экземпляра __EventFilter идентификаторы поставщика событий. WMI сравнивает удостоверение поставщика событий с дескрипторем безопасности, чтобы определить, имеет ли поставщик WBEM_RIGHT_PUBLISH доступ. Дополнительные сведения см. в разделе Константы безопасности WMI.

    Если фильтр разрешает доступ к удостоверению поставщика событий, он также доверяет событию. Это позволяет потребителю, который получил событие, вызывать делегированное событие.

    Примечание По умолчанию для дескриптора безопасности в EventAccess используется значение NULL, что разрешает доступ всем пользователям. Для повышения безопасности событий рекомендуется ограничить доступ в экземпляре подписки __EventFilter .

Настройка Administrator-Only SD

В следующем примере кода C++ создается дескриптор безопасности только для администратора в экземпляре __EventFilter . В этом примере создается дескриптор безопасности с помощью языка определения дескриптора безопасности (SDDL). Дополнительные сведения о WBEM_RIGHT_SUBSCRIBE см. в разделе Константы безопасности WMI.

// Create SD that allows only administrators 
//    to send events to this filter. 
// The SDDL settings are O:BAG:BAD:(A;;0x80;;;BA)
// Set the EventAccess property in the 
//    IWbemClassObject of the __EventFilter instance. 
   long lMask = WBEM_RIGHT_PUBLISH;
     WCHAR wBuf[MAX_PATH];
     _ltow( lMask, wBuf, 16 );
 
HRESULT hRes = pEventFilterInstance->Put( L"EventAccess", 0,
    &_variant_t( L"O:BAG:BAD:(A;;0x80;;;BA)" ), NULL );

В предыдущем примере кода требуются следующие операторы reference и #include.

#define _WIN32_DCOM
#include <wbemidl.h>
#include <comdef.h>

#pragma comment(lib, "wbemuuid.lib")

Олицетворение удостоверения поставщика событий

Для обработки события постоянному потребителю может потребоваться олицетворить поставщика событий. Постоянные потребители могут олицетворять поставщика событий только при наличии следующих условий:

  • Для экземпляра __FilterToConsumerBinding свойство MaintainSecurityContext имеет значение True.
  • Событие доставляется в том же контексте безопасности, в который находился поставщик при создании события. Только потребитель, реализованный в виде библиотеки DLL, или внутрипроцессный потребитель, может получать события в контексте безопасности поставщика. Дополнительные сведения о безопасности внутрипроцессных поставщиков и потребителей см. в разделе Размещение и безопасность поставщиков.
  • Поставщик событий выполняется в процессе, который допускает олицетворение.

Учетная запись, выполняющая процесс потребителя, должна иметь FULL_WRITE доступ к репозиторию WMI (также известному как репозиторий CIM). В подписке экземпляры __FilterToConsumerBinding, __EventConsumer и __EventFilter должны иметь одно и то же значение идентификатора безопасности (SID) в свойстве CreatorSID . WMI сохраняет идентификатор безопасности в CreatorSID для каждого экземпляра.

Идентификаторы безопасности и постоянные подписки

Постоянная подписка не работает, если привязка, потребитель и фильтр созданы не тем же пользователем. Это означает, что __FilterToConsumerBinding, __EventConsumer и __EventFilter должны иметь одно и то же значение идентификатора безопасности (SID) в свойстве CreatorSID . Инструментарий управления Windows (WMI) сохраняет это значение.

Создание постоянных подписок с помощью учетных записей домена

При использовании учетных записей домена для создания постоянных подписок необходимо учитывать несколько проблем. Каждая постоянная подписка по-прежнему должна работать, если пользователь не вошел в систему, то есть они работают под встроенной учетной записью LocalSystem.

Если пользователь домена является создателем постоянной подписки для потребителей, чувствительных к безопасности (ActiveScriptEventConsumer, CommandLineEventConsumer), WMI проверяет, принадлежит ли свойство CreatorSID класса __EventFilter , __FilterToConsumerBinding класса и экземпляров потребителя пользователю, который является членом локальной группы администраторов.

В следующем примере кода показано, как указать свойство CreatorSID .

 instance of __EventFilter as $FILTER
    {
        // this is the Administrators SID in array of bytes format
        CreatorSID = {1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0};    
        // Add filter code here ...
    }

    instance of ActiveScriptEventConsumer as $CONSUMER
    {
       CreatorSID = {1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0};
       // Add consumer code here ...
    }

    instance of __FilterToConsumerBinding
    {
       CreatorSID = {1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0};
       Consumer = $CONSUMER;
       Filter = $FILTER;
       // Add binding code here ...
    }

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

Защита событий WMI

Получение события WMI