Bagikan melalui


Menerima Peristiwa Dengan Aman

Konsumen sementara dan permanen memiliki metode yang berbeda untuk mengamankan pengiriman peristiwa.

Bagian berikut dibahas dalam topik ini:

Mengamankan Konsumen Sementara

Konsumen sementara berjalan sampai sistem di-boot ulang atau WMI dihentikan tetapi tidak dapat dimulai jika peristiwa tertentu dinaikkan. Misalnya, panggilan ke SWbemServices.ExecNotificationQueryAsync membuat konsumen sementara.

Panggilan SWbemServices.ExecNotificationQuery atau IWbemServices::ExecNotificationQuery membuat konsumen peristiwa sementara. Konsumen sementara tidak dapat mengontrol siapa yang menyediakan peristiwa ke sink peristiwa yang mereka buat.

Panggilan ke metode ExecNotificationQuery dapat dilakukan secara sinkron, semisinkron, atau asinkron. Misalnya, SWbemServices.ExecNotificationQuery adalah metode sinkron yang dapat disebut secara semisinkron, tergantung pada bagaimana parameter iflags diatur. SWbemServices.ExecNotificationQueryAsync adalah panggilan asinkron.

Ketahuilah bahwa panggilan balik ke sink untuk versi asinkron dari panggilan ini mungkin tidak dikembalikan pada tingkat autentikasi yang sama dengan panggilan yang dilakukan skrip. Oleh karena itu, disarankan agar Anda menggunakan semisinkron alih-alih panggilan asinkron. Jika Anda memerlukan komunikasi asinkron, lihat Memanggil Metode dan Mengatur Keamanan pada Panggilan Asinkron.

Pelanggan pembuatan skrip tidak dapat memeriksa hak akses penyedia peristiwa untuk menyediakan peristiwa ke sink yang dibuat oleh skrip. Oleh karena itu, disarankan agar panggilan ke SWbemServices.ExecNotificationQuery menggunakan bentuk panggilan semisinkron dan menggunakan pengaturan keamanan tertentu. Untuk informasi selengkapnya, lihat Melakukan Panggilan Semisinkron dengan VBScript.

Mengamankan Konsumen Permanen

Konsumen permanen memiliki langganan permanen ke peristiwa dari penyedia peristiwa yang akan bertahan setelah sistem operasi dimulai ulang. Penyedia acara yang mendukung konsumen permanen adalah penyedia konsumen peristiwa. Jika penyedia peristiwa tidak berjalan saat peristiwa terjadi, maka WMI memulai penyedia ketika perlu mengirimkan peristiwa. WMI mengidentifikasi penyedia konsumen mana yang harus dikirimkan peristiwa, berdasarkan instans __EventConsumerProviderRegistration , yang mengaitkan penyedia konsumen __Win32Provider instans dengan kelas konsumen logis yang ditentukan oleh penyedia konsumen. Untuk informasi selengkapnya tentang peran penyedia konsumen, lihat Menulis Penyedia Konsumen Peristiwa.

Konsumen permanen dapat mengontrol siapa yang mengirimi mereka peristiwa dan penyedia peristiwa dapat mengontrol siapa yang mengakses peristiwa mereka.

Skrip dan aplikasi klien membuat instans kelas konsumen logis sebagai bagian dari langganan. Kelas konsumen logis menentukan informasi apa yang dikandung peristiwa, apa yang dapat dilakukan klien dengan peristiwa tersebut, dan bagaimana peristiwa dikirimkan.

Kelas Konsumen Standar WMI memberikan contoh peran kelas konsumen logis. Untuk informasi selengkapnya, lihat Memantau dan Merespons Peristiwa dengan Konsumen Standar.

Mengamankan Langganan Permanen

Langganan permanen memiliki potensi yang lebih besar untuk menyebabkan masalah keamanan di WMI dan karenanya memiliki persyaratan keamanan berikut:

  • Instans konsumen logis, __EventFilter, dan instans __FilterToConsumerBinding harus memiliki pengidentifikasi keamanan individu (SID) yang sama di properti CreatorSID . Untuk informasi selengkapnya, lihat Menyimpan SID yang sama di semua instans langganan permanen.

  • Akun yang membuat langganan harus merupakan akun domain dengan hak istimewa administrator lokal atau akun grup Administrator lokal. Menggunakan SID grup Administrator memungkinkan langganan untuk terus bekerja di komputer lokal, meskipun terputus dari jaringan. Menggunakan akun domain memungkinkan identifikasi pengguna yang tepat.

    Namun, jika komputer tidak tersambung dan akun pembuatan adalah akun domain, konsumen gagal karena WMI tidak dapat memverifikasi identitas akun. Untuk menghindari kegagalan langganan jika komputer terputus dari jaringan, gunakan SID grup Administrator untuk langganan. Dalam hal ini, Anda harus memastikan bahwa akun LocalSystem dapat mengakses data keanggotaan grup di domain. Beberapa penyedia konsumen peristiwa memiliki persyaratan keamanan yang sangat tinggi, karena langganan nakal dapat menyebabkan kerusakan besar. Contohnya adalah konsumen standar, ActiveScriptEventConsumer dan CommandLineEventConsumer.

  • Anda dapat mengonfigurasi langganan permanen untuk hanya menerima peristiwa dari identitas penyedia peristiwa tertentu. Atur deskriptor keamanan di properti EventAccess dari instans__EventFilter ke identitas penyedia peristiwa. WMI membandingkan identitas penyedia peristiwa dengan deskriptor keamanan untuk menentukan apakah penyedia memiliki akses WBEM_RIGHT_PUBLISH . Untuk informasi selengkapnya, lihat Konstanta Keamanan WMI.

    Jika filter mengizinkan akses ke identitas penyedia peristiwa, maka filter juga mempercayai peristiwa tersebut. Hal ini memungkinkan konsumen yang menerima acara untuk menaikkan acara yang didelegasikan.

    Catatan Default untuk deskriptor keamanan di EventAccess adalah NULL, yang memungkinkan akses ke semua orang. Membatasi akses dalam instans langganan __EventFilter disarankan untuk keamanan peristiwa yang lebih baik.

Mengatur SD Administrator-Only

Contoh kode C++ berikut membuat deskriptor keamanan khusus administrator pada instans __EventFilter . Contoh ini membuat deskriptor keamanan menggunakan Security Descriptor Definition Language (SDDL). Untuk informasi selengkapnya tentang WBEM_RIGHT_SUBSCRIBE, lihat Konstanta Keamanan 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 );

Contoh kode sebelumnya memerlukan referensi dan pernyataan #include berikut.

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

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

Meniru Identitas Penyedia Peristiwa

Konsumen permanen mungkin perlu meniru penyedia peristiwa untuk memproses peristiwa. Konsumen permanen hanya dapat meniru penyedia peristiwa ketika kondisi berikut ada:

  • Instans __FilterToConsumerBinding memiliki properti MaintainSecurityContext yang diatur ke True.
  • Peristiwa dikirimkan dalam konteks keamanan yang sama dengan tempat penyedia menghasilkan peristiwa. Hanya konsumen yang diimplementasikan sebagai DLL, konsumen dalam proses, yang dapat menerima peristiwa dalam konteks keamanan penyedia. Untuk informasi selengkapnya tentang keamanan penyedia dan konsumen dalam proses, lihat Penyedia Hosting dan Keamanan.
  • Penyedia peristiwa berjalan dalam proses yang memungkinkan peniruan identitas.

Akun yang menjalankan proses konsumen harus memiliki akses FULL_WRITE ke repositori WMI (juga dikenal sebagai repositori CIM). Dalam langganan, instans __FilterToConsumerBinding, __EventConsumer, dan __EventFilter harus memiliki nilai pengidentifikasi keamanan individu (SID) yang sama di properti CreatorSID . WMI menyimpan SID di CreatorSID untuk setiap instans.

SID dan Langganan Permanen

Langganan permanen tidak berfungsi saat pengikatan, konsumen, dan filter tidak dibuat oleh pengguna yang sama, yang berarti bahwa __FilterToConsumerBinding, __EventConsumer, dan __EventFilter harus memiliki nilai pengidentifikasi keamanan individu (SID) yang sama di properti CreatorSID . Instrumentasi Manajemen Windows (WMI) menyimpan nilai ini.

Membuat Langganan Permanen Menggunakan Akun Domain

Beberapa masalah harus dipertimbangkan saat menggunakan akun domain untuk membuat langganan permanen. Setiap langganan permanen masih harus berfungsi ketika tidak ada pengguna yang masuk, yang berarti mereka berfungsi di bawah akun LocalSystem bawaan.

Jika pengguna domain adalah pembuat langganan permanen untuk konsumen sensitif keamanan (ActiveScriptEventConsumer, CommandLineEventConsumer), maka WMI memverifikasi apakah properti CreatorSID dari kelas __EventFilter , kelas __FilterToConsumerBinding , dan instans konsumen milik pengguna yang merupakan anggota grup Administrator lokal.

Contoh kode berikut menunjukkan bagaimana Anda dapat menentukan properti 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 ...
    }

Untuk situasi lintas domain, tambahkan Pengguna Terautentikasi ke "Grup Akses Otorisasi Windows".

Mengamankan Peristiwa WMI

Menerima Acara WMI