Partilhar via


Receber eventos de forma segura

Os consumidores temporários e permanentes têm diferentes métodos para garantir a entrega do evento.

As seguintes seções são discutidas neste tópico:

Proteger os consumidores temporários

Uns consumidores temporários são executados até que o sistema seja reiniciado ou o WMI seja parado, mas não podem ser iniciados se um evento específico for gerado. Por exemplo, uma chamada para SWbemServices.ExecNotificationQueryAsync cria um consumidor temporário.

As chamadas SWbemServices.ExecNotificationQuery ou IWbemServices::ExecNotificationQuery criam consumidores de eventos temporários. Os consumidores temporários não podem controlar quem fornece eventos para o receptordo eventoque eles criam.

As chamadas para métodos de ExecNotificationQuery podem ser feitas de forma síncrona, semissíncronaou assíncrona. Por exemplo, SWbemServices.ExecNotificationQuery é um método síncrono que pode ser chamado de forma semissíncrona, dependendo de como o iflags parâmetro é definido. SWbemServices.ExecNotificationQueryAsync é uma chamada assíncrona.

Lembre-se de que a chamada de retorno para o destino das versões assíncronas dessas chamadas pode não ocorrer no mesmo nível de autenticação que a chamada feita pelo script. Portanto, é recomendável que você use chamadas semissíncronas em vez de assíncronas. Se você precisar de comunicação assíncrona, consulte chamando um método e Definindo a segurança em uma chamada assíncrona.

Os assinantes de scripts não podem verificar os direitos de acesso de um provedor de eventos para fornecer eventos ao coletor criado pelo script. Portanto, é recomendável que as chamadas para SWbemServices.ExecNotificationQuery usem a forma semissíncrona da chamada e usem configurações de segurança específicas. Para obter mais informações, consulte Fazendo uma chamada semissíncrona com VBScript.

Garantir os consumidores permanentes

Um consumidor permanente tem uma assinatura permanente de eventos de um provedor de eventos que persistirá depois que o sistema operativo for reiniciado. Um provedor de eventos que oferece suporte a consumidores permanentes é um provedor de consumidores de eventos . Se o provedor de eventos não estiver em execução quando um evento ocorrer, o WMI iniciará o provedor quando precisar entregar eventos. O WMI identifica a qual provedor de cliente os eventos devem ser entregues, com base na instância de __EventConsumerProviderRegistration, que associa o provedor de cliente __Win32Provider a uma classe lógica de cliente definida pelo provedor de cliente. Para mais informações sobre o papel dos provedores de consumidores, consulte Escrevendo um provedor de consumidor de evento.

Os consumidores permanentes podem controlar quem lhes envia eventos e os fornecedores de eventos podem controlar quem acede aos seus eventos.

Scripts de cliente e aplicativos criam instâncias da classe de consumidor lógico como parte de uma assinatura. A classe de consumidor lógica define quais informações o evento contém, o que o cliente pode fazer com o evento e como o evento é entregue.

WMI Classes Padrão de Consumidor fornecem exemplos do papel das classes de consumidor lógicas. Para obter mais informações, consulte "Monitorização e Resposta a Eventos com Consumidores Padrão".

Garantir a Subscrição Permanente

As assinaturas permanentes têm maior potencial para causar problemas de segurança no WMI e, portanto, têm os seguintes requisitos de segurança:

  • A instância lógica do consumidor, a instância __EventFilter, e as instâncias __FilterToConsumerBinding devem ter o mesmo identificador de segurança individual (SID) na propriedade CreatorSID. Para obter mais informações, consulte Mantendo o mesmo SID em todas as instâncias de uma assinatura permanente.

  • A conta que cria a assinatura deve ser uma conta de domínio com privilégios de administrador local ou a conta de grupo Administradores local. A utilização do SID do grupo Administradores permite que a subscrição continue a funcionar no computador local, mesmo que esteja desligada da rede. O uso de uma conta de domínio permite a identificação exata do usuário.

    No entanto, se o computador não estiver conectado e a conta de criação for uma conta de domínio, o consumidor falhará porque o WMI não pode verificar a identidade da conta. Para evitar falha de assinatura se o computador estiver desconectado da rede, use o SID do grupo Administradores para uma assinatura. Nesse caso, você deve garantir que a conta LocalSystem possa acessar dados de associação de grupo no domínio. Alguns fornecedores de consumidores de eventos têm requisitos de segurança particularmente elevados, uma vez que uma subscrição fraudulenta pode causar grandes danos. Exemplos incluem os consumidores padrão: ActiveScriptEventConsumer e CommandLineEventConsumer.

  • Você pode configurar a assinatura permanente para aceitar apenas eventos de identidades específicas do provedor de eventos. Defina o descritor de segurança na propriedade EventAccess da instância __EventFilter para as identidades do provedor de eventos. O WMI compara a identidade do fornecedor de eventos com o descritor de segurança para determinar se o fornecedor tem acesso WBEM_RIGHT_PUBLISH. Para obter mais informações, consulte Constantes de segurança WMI.

    Se o filtro permitir acesso à identidade do provedor de eventos, ele também confiará no evento. Isso permite que o consumidor que recebeu o evento gere um evento delegado.

    Observação O padrão para o descritor de segurança em EventAccess é NULL , que permite o acesso a todos. Recomenda-se limitar o acesso na instância de assinatura do __EventFilter para melhorar a segurança do evento.

Configurar um SD Administrator-Only

O exemplo de código C++ a seguir cria um descritor de segurança somente administrador na instância __EventFilter. Este exemplo cria o descritor de segurança usando SDDL (Security Descriptor Definition Language). Para obter mais informações sobre WBEM_RIGHT_SUBSCRIBE, consulte Constantes de segurança 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 );

O exemplo de código anterior requer as seguintes instruções de referência e #include.

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

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

Personificando a identidade do provedor de eventos

Um consumidor permanente pode precisar se passar pelo provedor do evento para processar o evento. Os consumidores permanentes só podem fazer-se passar pelo fornecedor do evento quando se verificarem as seguintes condições:

  • A instância de __FilterToConsumerBinding tem a propriedade MaintainSecurityContext definida como True.
  • Um evento é entregue no mesmo contexto de segurança em que o provedor estava quando gerou o evento. Somente um consumidor implementado como uma DLL, um consumidor em processo, pode receber eventos no contexto de segurança do provedor. Para obter mais informações sobre a segurança de provedores e consumidores em processo, consulte Provider Hosting and Security.
  • O provedor de eventos está a ser executado num processo que permite a imitação.

A conta que executa o processo de consumidor deve ter acesso FULL_WRITE ao repositório WMI (também conhecido como repositório CIM). Na assinatura, as instâncias __FilterToConsumerBinding, __EventConsumere __EventFilter devem ter o mesmo valor de SID (identificador de segurança individual) na propriedade CreatorSID. WMI armazena o SID no CreatorSID para cada instância.

SIDs e Subscrições Permanentes

Uma assinatura permanente não funciona quando a vinculação, o consumidor e o filtro não são criados pelo mesmo usuário, o que significa que o __FilterToConsumerBinding, __EventConsumere __EventFilter devem ter o mesmo valor de identificador de segurança individual (SID) na propriedade CreatorSID. O WMI (Instrumentação de Gerenciamento do Windows) armazena esse valor.

Criando assinaturas permanentes usando contas de domínio

Vários problemas devem ser considerados ao usar contas de domínio para criar assinaturas permanentes. Todas as assinaturas permanentes ainda devem funcionar quando nenhum usuário estiver conectado, o que significa que elas funcionam sob a conta LocalSystem integrada.

Se um usuário de domínio for o criador de uma assinatura permanente para consumidores sensíveis à segurança (ActiveScriptEventConsumer, CommandLineEventConsumer), o WMI verificará se o CreatorSID propriedade da classe __EventFilter, classe __FilterToConsumerBinding e as instâncias de consumidor pertencem a um usuário que é membro do grupo Administradores local.

O exemplo de código a seguir mostra como especificar a propriedade 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 ...
    }

Para situações entre domínios, adicione Usuários Autenticados ao "Grupo de Acesso de Autorização do Windows".

Segurança de Eventos WMI

Receber um evento WMI