Megosztás a következőn keresztül:


Események biztonságos fogadása

Az ideiglenes és állandó fogyasztók különböző módszerekkel biztosítják az eseménykézbesítést.

A következő szakaszokat tárgyaljuk ebben a témakörben:

Ideiglenes fogyasztók védelme

Az ideiglenes felhasználók a rendszer újraindításáig vagy a WMI leállításáig futnak, de nem indíthatók el egy adott esemény felmerülése esetén. A SWbemServices.ExecNotificationQueryAsync hívása például ideiglenes fogyasztót hoz létre.

A hívások SWbemServices.ExecNotificationQuery vagy IWbemServices::ExecNotificationQuery ideiglenes eseményfelhasználókat hoznak létre. Az ideiglenes felhasználók nem tudják szabályozni, hogy ki biztosít eseményeket a eseményfogadó számára, amelyet ők hoztak létre.

A ExecNotificationQuery metódusokra irányuló hívások szinkron módon, félszinkron módonvagy aszinkron módon is kezdeményezhetők. Az SWbemServices.ExecNotificationQuery például egy szinkron metódus, amely a iflags paraméter beállításától függően félszinkron módon hívható. SWbemServices.ExecNotificationQueryAsync egy aszinkron hívás.

Vegye figyelembe, hogy előfordulhat, hogy a hívások aszinkron verzióinak fogadóhelyen történő visszahívása nem ugyanazon a hitelesítési szinten lesz, mint amit a szkript kezdeményezett. Ezért javasoljuk, hogy aszinkron hívások helyett félszinkront használjon. Ha aszinkron kommunikációra van szüksége, olvassa el Metódus meghívása és A biztonság beállítása aszinkron híváscímű témakört.

A parancsfájl-előfizetők nem tudják ellenőrizni, hogy egy eseményszolgáltató hozzáférési jogosultságai megfelelőek-e ahhoz, hogy eseményeket biztosítson a szkript által létrehozott fogadó számára. Ezért javasoljuk, hogy SWbemServices.ExecNotificationQuery a hívás félszinkron formáját használja, és használjon meghatározott biztonsági beállításokat. További információért lásd: Félszinkron hívás VBScript használatával.

Állandó fogyasztók védelme

Az állandó felhasználók állandó előfizetéssel rendelkezik egy eseményszolgáltatótól származó eseményekre, amelyek az operációs rendszer újraindítása után is megmaradnak. Az állandó fogyasztókat támogató eseményszolgáltató egy eseményfelhasználói szolgáltató. Ha az eseményszolgáltató nem fut esemény bekövetkezésekor, akkor a WMI elindítja a szolgáltatót, amikor eseményeket kell kézbesítenie. A WMI a __EventConsumerProviderRegistration-példány alapján azonosítja, hogy melyik fogyasztói szolgáltatónak kell kézbesíteni az eseményeket, amely a fogyasztószolgáltató __Win32Provider példányt egy logikai fogyasztói osztályhoz társítja, a fogyasztó szolgáltatója határozza meg. A fogyasztói szolgáltatók szerepéről további információt a Eseményfogyasztói szolgáltató írásacímű szakaszban talál.

Az állandó fogyasztók szabályozhatják, hogy ki küldi el az eseményeket, és az eseményszolgáltatók szabályozhatják, hogy kik férnek hozzá az eseményeikhez.

Az ügyfélszkriptek és -alkalmazások egy előfizetés részeként hozzák létre a logikai fogyasztói osztály példányait. A logikai fogyasztói osztály határozza meg, hogy az esemény milyen információkat tartalmaz, mit tehet az ügyfél az eseménysel, és hogyan történik az esemény kézbesítése.

A WMI standard fogyasztói osztályok példákat nyújtanak a logikai fogyasztói osztályok szerepére. További információért tekintse meg: Események monitorozása és megválaszolása standard fogyasztókkal.

Az állandó előfizetés biztonságossá tétele

Az állandó előfizetések nagyobb mértékben okozhatnak biztonsági problémákat a WMI-ben, ezért a következő biztonsági követelményekkel rendelkeznek:

  • A logikai fogyasztói példánynak, a __EventFilterés a __FilterToConsumerBinding példánynak ugyanazzal az egyéni biztonsági azonosítóval (SID) kell rendelkeznie a CreatorSID tulajdonságban. További információért lásd a Az állandó előfizetések minden példányában ugyanaz a SID című részt.

  • Az előfizetést létrehozó fióknak helyi rendszergazdai jogosultságokkal rendelkező tartományi fióknak vagy helyi Rendszergazdák csoportfióknak kell lennie. A Rendszergazdák csoport SID-jének használata lehetővé teszi, hogy az előfizetés továbbra is működjön a helyi számítógépen, még akkor is, ha az leválasztva van a hálózatról. A tartományi fiók használata lehetővé teszi a felhasználó pontos azonosítását.

    Ha azonban a számítógép nincs csatlakoztatva, és a létrehozó fiók tartományi fiók, a művelet meghiúsul, mert a WMI nem tudja ellenőrizni a fiók identitását. Az előfizetési hiba elkerülése érdekében, ha a számítógép leválasztva van a hálózatról, használja a Rendszergazdák csoport BIZTONSÁGI azonosítóját egy előfizetéshez. Ebben az esetben győződjön meg arról, hogy a LocalSystem-fiók hozzáfér a tartomány csoporttagsági adataihoz. Egyes eseményfogyasztói szolgáltatók különösen magas biztonsági követelményekkel rendelkeznek, mivel egy megbízhatatlan előfizetés nagy károkat okozhat. Ilyenek például az alapértelmezett fogyasztók, ActiveScriptEventConsumer és CommandLineEventConsumer.

  • Az állandó előfizetést úgy konfigurálhatja, hogy csak adott eseményszolgáltatói identitásokból fogadjon eseményeket. Állítsa be a biztonsági leírót a __EventFilter-példány EventAccess tulajdonságában az eseményszolgáltatói identitásra. A WMI összehasonlítja az eseményszolgáltató identitását a biztonsági leíróval annak megállapításához, hogy a szolgáltató rendelkezik-e WBEM_RIGHT_PUBLISH hozzáféréssel. További információ: WMI biztonsági állandók.

    Ha a szűrő hozzáférést engedélyez az eseményszolgáltató identitásához, akkor az eseményt is megbízhatónak tekinti. Ez lehetővé teszi, hogy az eseményt megkapó fogyasztó delegált eseményt generáljon.

    Megjegyzés Az EventAccess biztonsági leírójának alapértelmezett értéke NULL, amely mindenki számára lehetővé teszi a hozzáférést. A jobb eseménybiztonság érdekében ajánlott korlátozni a hozzáférést a __EventFilter előfizetési példányában.

Administrator-Only SD beállítása

A következő C++-kód példa egy csak rendszergazdai szintű biztonsági leírót hoz létre a __EventFilter-példányon. Ez a példa Security Descriptor Definition Language (SDDL) használatával hozza létre a biztonsági leírót. További információért a WBEM_RIGHT_SUBSCRIBEtémában tekintse meg a WMI Biztonsági Konstansok.

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

Az előző példakódhoz a következő hivatkozásra és #include utasításokra van szükség.

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

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

Az eseményszolgáltató identitásának megszemélyesítése

Előfordulhat, hogy egy állandó fogyasztónak meg kell megszemélyesítenie az eseményszolgáltatót az esemény feldolgozásához. Az állandó fogyasztók csak akkor tehetik meg, hogy megszemélyesítik az eseményszolgáltatót, ha a következő feltételek teljesülnek:

  • A __FilterToConsumerBinding példánya a MaintainSecurityContext tulajdonságot Trueértékre állítja.
  • A rendszer ugyanabban a biztonsági környezetben kézbesít egy eseményt, amelyben a szolgáltató az esemény létrehozásakor volt. Csak a DLL-ben megvalósított fogyasztó, azaz egy folyamaton belüli fogyasztó, képes eseményeket fogadni a szolgáltató biztonsági környezetében. A folyamaton belüli szolgáltatók és fogyasztók biztonságával kapcsolatos további információkért lásd szolgáltatói üzemeltetési és biztonsági.
  • Az eseményszolgáltató olyan folyamatban fut, amely lehetővé teszi a megszemélyesítést.

A fogyasztói folyamatot futtató fióknak FULL_WRITE hozzáféréssel kell rendelkeznie a WMI-adattárhoz (más néven CIM-adattárhoz). Az előfizetésben a __FilterToConsumerBinding, __EventConsumerés __EventFilter példányoknak ugyanazzal az egyéni biztonsági azonosítóval (SID) kell rendelkezniük a CreatorSID tulajdonságban. A WMI tárolja a SID-et a CreatorSID minden példányhoz.

SID-k és állandó előfizetések

Az állandó előfizetés nem működik, ha a kötést, a fogyasztót és a szűrőt nem ugyanaz a felhasználó hozza létre, ami azt jelenti, hogy a __FilterToConsumerBinding, __EventConsumerés __EventFilter azonos egyedi biztonsági azonosító (SID) értékkel kell rendelkeznie a CreatorSID tulajdonságban. Ezt az értéket a Windows Management Instrumentation (WMI) tárolja.

Állandó előfizetések létrehozása tartományi fiókokkal

Több problémát is figyelembe kell venni, amikor tartományi fiókokat használ állandó előfizetések létrehozásához. Minden állandó előfizetésnek akkor is működnie kell, ha nincs bejelentkezve felhasználó, ami azt jelenti, hogy a beépített LocalSystem-fiók alatt működnek.

Ha egy tartományi felhasználó a biztonsági szempontból érzékeny fogyasztók számára állandó feliratkozás létrehozója (ActiveScriptEventConsumer, CommandLineEventConsumer), akkor a WMI ellenőrzi, hogy a CreatorSID tulajdonsága a __EventFilter osztály, a __FilterToConsumerBinding osztály, és a fogyasztói példányok egy olyan felhasználóhoz tartoznak-e, aki tagja a helyi Administrators csoportnak.

Az alábbi példakód bemutatja, hogyan adhatja meg a CreatorSID tulajdonságot.

 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 ...
    }

Tartományközi helyzetek esetén adja hozzá a hitelesített felhasználókat a "Windows engedélyezési hozzáférési csoporthoz".

WMI-események biztonságossá tétele

WMI-esemény fogadása