Dela via


Ta emot händelser på ett säkert sätt

Tillfälliga och permanenta konsumenter har olika metoder för att säkra händelseleverans.

Följande avsnitt beskrivs i det här avsnittet:

Skydda tillfälliga konsumenter

En tillfälliga användare körs tills systemet startas om eller WMI stoppas men kan inte startas om en viss händelse utlöses. Ett anrop till SWbemServices.ExecNotificationQueryAsync skapar till exempel en tillfällig konsument.

Anropen SWbemServices.ExecNotificationQuery eller IWbemServices::ExecNotificationQuery skapar tillfälliga händelsekonsumenter. Tillfälliga konsumenter kan inte styra vem som tillhandahåller händelser till event sink de skapar.

Anrop till ExecNotificationQuery metoder kan göras synkront, semisynkronteller asynkront. Till exempel är SWbemServices.ExecNotificationQuery en synkron metod som kan anropas semisynkront, beroende på hur parametern iflags är inställd. SWbemServices.ExecNotificationQueryAsync är ett asynkront anrop.

Tänk på att återanropet till mottagaren för de asynkrona versionerna av dessa anrop kanske inte returneras på samma autentiseringsnivå som det anrop som skriptet gjorde. Därför rekommenderar vi att du använder semisynkrona i stället för asynkrona anrop. Om du behöver asynkron kommunikation kan du läsa Anropa en metod och Ställa in säkerhet på ett asynkront anrop.

Skriptprenumeranter kan inte kontrollera åtkomsträttigheterna för en händelseleverantör för att leverera händelser till inkastet som har skapats av skriptet. Därför rekommenderar vi att anrop till SWbemServices.ExecNotificationQuery använda anropets semisynkrona form och använda specifika säkerhetsinställningar. Mer information finns i Att göra ett semisynkront anrop med VBScript-.

Skydda permanenta konsumenter

En permanent konsument har en permanent prenumeration på händelser från en händelseleverantör som kvarstår när operativsystemet har startats om. En händelseleverantör som stöder permanenta kunder är en händelsekonsumentleverantör. Om händelseprovidern inte körs när en händelse inträffar startar WMI providern när den behöver leverera händelser. WMI identifierar vilken konsumentleverantör som händelserna ska levereras till, baserat på den __EventConsumerProviderRegistration instansen, som associerar konsumentleverantören __Win32Provider instans med en logisk konsumentklass definierad av konsumentleverantören. Mer information om rollen för konsumenttjänsteleverantörer finns i Att skriva en händelsekonsumenttjänsteleverantör.

Permanenta konsumenter kan styra vem som skickar händelser till dem och händelseleverantörer kan styra vem som kommer åt deras händelser.

Klientskript och program skapar instanser av den logiska konsumentklassen som en del av en prenumeration. Den logiska konsumentklassen definierar vilken information händelsen innehåller, vad klienten kan göra med händelsen och hur händelsen levereras.

WMI-standardkonsumentklasser ger exempel på vilken roll logiska konsumentklasser har. För mer information, se Övervakning och svar på händelser med standardkonsumenter.

Skydda den permanenta prenumerationen

Permanenta prenumerationer har större potential att orsaka säkerhetsproblem i WMI och har därför följande säkerhetskrav:

  • Den logiska konsumentinstansen, __EventFilteroch __FilterToConsumerBinding-instanserna måste ha samma individuella säkerhetsidentifierare (SID) i egenskapen CreatorSID. Mer information finns i Att behålla samma SID i alla instanser av en permanent prenumeration.

  • Kontot som skapar prenumerationen måste antingen vara ett domänkonto med lokala administratörsbehörigheter eller det lokala gruppkontot Administratörer. Med hjälp av administratörsgruppens SID kan prenumerationen fortsätta att fungera på den lokala datorn, även om den är frånkopplad från nätverket. Med hjälp av ett domänkonto kan användaren identifieras exakt.

    Men om datorn inte är ansluten och det skapande kontot är ett domänkonto misslyckas konsumenten eftersom WMI inte kan verifiera kontots identitet. Om du vill undvika prenumerationsfel om datorn är frånkopplad från nätverket använder du administratörsgruppens SID för en prenumeration. I det här fallet bör du se till att LocalSystem-kontot kan komma åt gruppmedlemskapsdata på domänen. Vissa händelsekonsumentleverantörer har särskilt höga säkerhetskrav, eftersom en falsk prenumeration kan orsaka stor skada. Exempel är standardkonsumenterna ActiveScriptEventConsumer och CommandLineEventConsumer.

  • Du kan konfigurera den permanenta prenumerationen så att den endast accepterar händelser från specifika händelseprovideridentiteter. Ange säkerhetsbeskrivningen i egenskapen EventAccess för __EventFilter-instansen till händelseproviderns identiteter. WMI jämför händelseproviderns identitet med säkerhetsbeskrivningen för att avgöra om providern har WBEM_RIGHT_PUBLISH åtkomst. Mer information finns i WMI-säkerhetskonstanter.

    Om filtret tillåter åtkomst till händelseproviderns identitet litar det också på händelsen. På så sätt kan den konsument som tog emot händelsen utlösa en delegerad händelse.

    Obs Standardvärdet för säkerhetsbeskrivningen i EventAccess är NULL-, vilket ger åtkomst till alla. Att begränsa åtkomsten i prenumerationsinstansen av __EventFilter rekommenderas för bättre händelsesäkerhet.

Ange en Administrator-Only SD

I följande C++-kodexempel skapas en säkerhetsbeskrivning endast för administratörer på den __EventFilter instansen. I det här exemplet skapas säkerhetsbeskrivningen med hjälp av SDDL (Security Descriptor Definition Language). Mer information om WBEM_RIGHT_SUBSCRIBEfinns i WMI-säkerhetskonstanter.

// 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 );

I föregående kodexempel krävs följande referens- och #include-instruktioner.

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

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

Förfalska händelseleverantörens identitet

En permanent konsument kan behöva personifiera händelseprovidern för att bearbeta händelsen. Permanenta konsumenter kan bara personifiera händelseprovidern när följande villkor finns:

  • Instansen av __FilterToConsumerBinding har egenskapen MaintainSecurityContext inställd på True.
  • En händelse levereras i samma säkerhetskontext som providern befann sig i när händelsen genererades. Endast en konsument som implementeras som en DLL, en pågående konsument, kan ta emot händelser i leverantörens säkerhetskontext. Mer information om säkerhet för processerveridrar och konsumenter finns i Provider Hosting and Security.
  • Händelseprovidern körs i en process som tillåter personifiering.

Kontot som kör konsumentprocessen måste ha FULL_WRITE åtkomst till WMI-lagringsplatsen (kallas även CIM-lagringsplatsen). I prenumerationen måste __FilterToConsumerBinding, __EventConsumeroch __EventFilter-instanser ha samma sidvärde (individuell säkerhetsidentifierare) i egenskapen CreatorSID. WMI lagrar SID i CreatorSID- för varje instans.

SID och permanenta prenumerationer

En permanent prenumeration fungerar inte när bindningen, konsumenten och filtret inte skapas av samma användare, vilket innebär att __FilterToConsumerBinding, __EventConsumeroch __EventFilter måste ha samma individuella säkerhetsidentifierare (SID) i egenskapen CreatorSID. Windows Management Instrumentation (WMI) lagrar det här värdet.

Skapa permanenta prenumerationer med hjälp av domänkonton

Du måste ta hänsyn till flera problem när du använder domänkonton för att skapa permanenta prenumerationer. Varje permanent prenumeration bör fortfarande fungera när ingen användare är inloggad, vilket innebär att de fungerar under det inbyggda LocalSystem-kontot.

Om en domänanvändare skapar en permanent prenumeration för säkerhetskänsliga konsumenter (ActiveScriptEventConsumer, CommandLineEventConsumer), kontrollerar WMI om egenskapen CreatorSID egenskapen för klassen __EventFilter, __FilterToConsumerBinding och konsumentinstanserna tillhör en användare som är medlem i den lokala administratörsgruppen.

Följande kodexempel visar hur du kan ange egenskapen 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 ...
    }

För situationer mellan domäner lägger du till Autentiserade användare i "Åtkomstgrupp för Windows-auktorisering".

Säkerställa WMI-händelser

tar emot en WMI-händelse