Безопасное получение событий
Временные и постоянные потребители имеют различные методы обеспечения доставки событий.
В этом разделе рассматриваются следующие разделы:
- защита временных потребителей
- обеспечение защиты постоянных потребителей
- защита постоянной подписки
- Настройки Administrator-Only SD
- Имперсонация идентичности поставщика событий
- идентификаторов и постоянных подписок
- создание постоянных подписок с помощью учетных записей домена
- Связанные темы
Защита временных потребителей
временных потребителей запускается до перезагрузки системы или до остановки 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. Дополнительные сведения см. в разделе Сохранение одного и того же SID во всех инстанциях постоянной подписки.
Учетная запись, которая создает подписку, должна быть учетной записью домена с правами локального администратора или учетной записью группы "Локальные администраторы". Использование SID группы "Администраторы" позволяет подписке продолжать работать на локальном компьютере, даже если он отключен от сети. Использование учетной записи домена позволяет точно идентифицировать пользователя.
Однако если компьютер не подключен, и создаваемая учетная запись является учетной записью домена, операция завершается ошибкой, так как 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 );
В предыдущем примере кода требуются следующие ссылки и директивы #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 сохраняет SID в свойстве CreatorSID для каждого экземпляра.
SIDы и постоянные подписки
Постоянная подписка не работает, если привязка, потребитель и фильтр не создаются тем же пользователем, что означает, что __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.
Связанные разделы