Udostępnij przez


Bezpieczne odbieranie zdarzeń

Konsumenci tymczasowi i stali mają różne metody zabezpieczania dostarczania wydarzeń.

W tym temacie omówiono następujące sekcje:

Zabezpieczanie użytkowników tymczasowych

tymczasowych użytkowników działa do momentu ponownego uruchomienia systemu lub zatrzymania usługi WMI, ale nie można go uruchomić, jeśli zostanie zgłoszone określone zdarzenie. Na przykład wywołanie SWbemServices.ExecNotificationQueryAsync tworzy tymczasowego konsumenta.

Wywołania SWbemServices.ExecNotificationQuery lub IWbemServices::ExecNotificationQuery tworzą tymczasowych odbiorców zdarzeń. Użytkownicy tymczasowi nie mogą kontrolować, kto dostarcza zdarzenia do zdarzenia ujścia, które tworzą.

Metody ExecNotificationQuery można wywoływać synchronicznie, półsynchronicznielub asynchronicznie. Na przykład SWbemServices.ExecNotificationQuery to metoda synchroniczna, która może być wywoływana semisynchronicznie, w zależności od tego, jak ustawiono parametr iflags. SWbemServices.ExecNotificationQueryAsync to wywołanie asynchroniczne.

Należy pamiętać, że wywołanie zwrotne do odbiornika dla asynchronicznych wersji tych wywołań może nie zostać zwrócone na tym samym poziomie uwierzytelniania co wywołanie wykonane przez skrypt. W związku z tym zaleca się użycie wywołań semisynchronicznych zamiast asynchronicznych. Jeśli potrzebujesz komunikacji asynchronicznej, zobacz Wywoływanie metody i Ustawianie zabezpieczeń w asynchronicznych wywołaniach.

Subskrybenci skryptów nie mogą sprawdzić praw dostępu dostawcy zdarzeń w celu dostarczenia zdarzeń do ujścia utworzonego przez skrypt. Dlatego zaleca się, aby wywołania do SWbemServices.ExecNotificationQuery były wykonywane w półsynchronicznej formie z użyciem określonych ustawień zabezpieczeń. Aby uzyskać więcej informacji, zobacz Making a Semisynchronous Call with VBScript.

Zabezpieczanie stałych użytkowników

Stali konsumenci mają stałą subskrypcję zdarzeń od dostawcy zdarzeń, która zachowa się po ponownym uruchomieniu systemu operacyjnego. Dostawca zdarzeń, który obsługuje stałych odbiorców, to dostawca odbiorców zdarzeń . Jeśli dostawca zdarzeń nie jest uruchomiony w przypadku wystąpienia zdarzenia, usługa WMI uruchamia dostawcę, gdy musi dostarczać zdarzenia. Usługa WMI określa dostawcę odbiorców, do którego mają być dostarczane zdarzenia, na podstawie wystąpienia __EventConsumerProviderRegistration, które kojarzy dostawcę __Win32Provider z wystąpieniem logicznej klasy konsumenta zdefiniowanym przez dostawcę odbiorców. Aby uzyskać więcej informacji na temat roli dostawców konsumenckich, zobacz Tworzenie dostawcy zdarzeń dla konsumenta.

Użytkownicy stali mogą kontrolować, kto wysyła im zdarzenia, a dostawcy zdarzeń mogą kontrolować, kto uzyskuje dostęp do swoich zdarzeń.

Skrypty klienta i aplikacje tworzą wystąpienia klasy konsumenta logicznego w ramach subskrypcji. Klasa odbiorcy logicznego definiuje, jakie informacje zawiera zdarzenie, co klient może zrobić ze zdarzeniem i jak zdarzenie jest dostarczane.

Klasy odbiorców standardowych WMI zawierają przykłady roli logicznych klas odbiorców. Aby uzyskać więcej informacji, zobacz Monitorowanie i reagowanie na zdarzenia za pomocą standardowych odbiorców.

Zabezpieczanie stałej subskrypcji

Stałe subskrypcje mają większy potencjał, aby powodować problemy z zabezpieczeniami w usłudze WMI i dlatego mają następujące wymagania dotyczące zabezpieczeń:

  • Wystąpienie użytkownika logicznego, __EventFilteri wystąpienia __FilterToConsumerBinding muszą mieć ten sam indywidualny identyfikator zabezpieczeń (SID) we właściwości CreatorSID. Aby uzyskać więcej informacji, zobacz Przechowywanie tego samego identyfikatora SID we wszystkich wystąpieniach stałej subskrypcji.

  • Konto, które tworzy subskrypcję, musi być kontem domeny z uprawnieniami administratora lokalnego lub lokalnym kontem grupy Administratorzy. Użycie identyfikatora SID grupy Administratorzy umożliwia subskrypcji kontynuowanie pracy na komputerze lokalnym, nawet jeśli jest odłączony od sieci. Użycie konta domeny umożliwia dokładną identyfikację użytkownika.

    Jednak jeśli komputer nie jest połączony, a konto, które tworzy, jest kontem domeny, operacja nie udaje się, ponieważ usługa WMI nie może zweryfikować tożsamości konta. Aby uniknąć niepowodzenia subskrypcji, jeśli komputer jest odłączony od sieci, użyj identyfikatora SID grupy Administratorzy dla subskrypcji. W takim przypadku należy się upewnić, że konto LocalSystem może uzyskiwać dostęp do danych członkostwa w grupie w domenie. Niektórzy dostawcy usług konsumentów zdarzeń mają szczególnie wysokie wymagania dotyczące zabezpieczeń, ponieważ nieautoryzowana subskrypcja może spowodować duże szkody. Przykłady to użytkownicy standardowi, ActiveScriptEventConsumer i CommandLineEventConsumer.

  • Możesz skonfigurować trwałą subskrypcję tak, aby akceptowała tylko zdarzenia z określonych tożsamości dostawcy zdarzeń. Ustaw deskryptor zabezpieczeń we właściwości EventAccess wystąpienia __EventFilter na tożsamości dostawcy zdarzeń. Usługa WMI porównuje tożsamość dostawcy zdarzeń z deskryptorem zabezpieczeń, aby określić, czy dostawca ma WBEM_RIGHT_PUBLISH dostęp. Aby uzyskać więcej informacji, zapoznaj się z sekcją Stałe zabezpieczeń usługi WMI.

    Jeśli filtr zezwala na dostęp do tożsamości dostawcy zdarzeń, ufa również zdarzeniu. Dzięki temu użytkownik, który odebrał zdarzenie, może zgłosić zdarzenie delegowane.

    Uwaga Domyślne ustawienie deskryptora zabezpieczeń w EventAccess to NULL, co umożliwia dostęp wszystkim. Ograniczenie dostępu w instancji subskrypcji __EventFilter jest zalecane dla lepszego zabezpieczenia zdarzeń.

Ustawianie Administrator-Only SD

Poniższy przykład kodu C++ tworzy deskryptor zabezpieczeń tylko dla administratora w wystąpieniu __EventFilter. W tym przykładzie utworzono deskryptor zabezpieczeń przy użyciu Security Descriptor Definition Language (SDDL). Aby uzyskać więcej informacji na temat WBEM_RIGHT_SUBSCRIBE, zobacz Stałe zabezpieczeń usługi 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 );

Poprzedni przykład kodu wymaga następującego odwołania i instrukcji #include.

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

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

Personifikacja tożsamości dostawcy zdarzeń

Stały konsument może potrzebować podszywać się pod dostawcę eventu w celu przetworzenia zdarzenia. Stali klienci mogą podszywać się pod dostawcę zdarzeń tylko wtedy, gdy istnieją następujące warunki:

  • Wystąpienie __FilterToConsumerBinding ma właściwość MaintainSecurityContext ustawioną na wartość True.
  • Zdarzenie jest dostarczane w tym samym kontekście zabezpieczeń, w jaki dostawca był podczas generowania zdarzenia. Tylko użytkownik zaimplementowany jako biblioteka DLL, odbiorca procesu, może odbierać zdarzenia w kontekście zabezpieczeń dostawcy. Aby uzyskać więcej informacji na temat zabezpieczeń dostawców procesów i użytkowników, zobacz Dostawcy hostingu i zabezpieczeń.
  • Dostawca zdarzeń jest uruchomiony w procesie, który umożliwia personifikację.

Konto, na którym działa proces konsumenta, musi mieć FULL_WRITE dostęp do repozytorium WMI (nazywanego również repozytorium CIM). W subskrypcji wystąpienia __FilterToConsumerBinding, __EventConsumeri __EventFilter muszą mieć taką samą wartość indywidualnego identyfikatora zabezpieczeń (SID) we właściwości CreatorSID. Usługa WMI przechowuje identyfikator SID w CreatorSID dla każdego wystąpienia.

Identyfikatory SID i permanentne subskrypcje

Subskrypcja stała nie działa, gdy powiązanie, odbiorca i filtr nie są tworzone przez tego samego użytkownika, co oznacza, że __FilterToConsumerBinding, __EventConsumeri __EventFilter musi mieć taką samą wartość identyfikatora zabezpieczeń (SID) w właściwości CreatorSID. Instrumentacja zarządzania Windows (WMI) przechowuje tę wartość.

Tworzenie stałych subskrypcji przy użyciu kont domeny

Podczas korzystania z kont domeny do tworzenia stałych subskrypcji należy wziąć pod uwagę kilka problemów. Każda stała subskrypcja powinna nadal działać, gdy żaden użytkownik nie jest zalogowany, co oznacza, że działa w ramach wbudowanego konta LocalSystem.

Jeśli użytkownik domeny jest twórcą stałej subskrypcji dla konsumentów wrażliwych na bezpieczeństwo (ActiveScriptEventConsumer, CommandLineEventConsumer), usługa WMI sprawdza, czy właściwość CreatorSID klasy __EventFilter oraz klasy __FilterToConsumerBinding oraz wystąpienia konsumentów należą do użytkownika, który jest członkiem lokalnej grupy Administratorów.

Poniższy przykład kodu pokazuje, jak określić właściwość 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 ...
    }

W przypadku sytuacji międzydomenowych dodaj uwierzytelnionych użytkowników do grupy "Grupa dostępu autoryzacji systemu Windows".

Zabezpieczanie zdarzeń usługi WMI

Odbieranie zdarzenia WMI