Menerima Peristiwa Dengan Aman

Konsumen sementara dan permanen memiliki metode yang berbeda untuk mengamankan pelaksanaan acara.

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 pengguna acara sementara. Pengguna sementara tidak dapat mengontrol siapa yang menyediakan peristiwa ke sink yang mereka buat untuk peristiwa.

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

Harap diketahui bahwa panggilan balik ke sink untuk versi asinkron dari panggilan ini mungkin tidak dikembalikan pada tingkat autentikasi yang sama dengan panggilan yang dilakukan oleh 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.

Pengguna pembuatan skrip tidak dapat memeriksa hak akses penyedia peristiwa untuk menyediakan peristiwa ke saluran 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.

Memastikan Konsumen Tetap

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 acara . Jika penyedia kejadian tidak aktif ketika kejadian terjadi, maka WMI memulai penyedia ketika perlu mengirimkan kejadian. WMI mengidentifikasi penyedia konsumen mana peristiwa yang seharusnya dikirimkan, berdasarkan instans __EventConsumerProviderRegistration, yang menghubungkan penyedia konsumen __Win32Provider instans ke kelas konsumen logis yang didefinisikan oleh penyedia konsumen. Untuk informasi selengkapnya tentang peran penyedia konsumen, lihat Menulis Penyedia Pengonsumsi Acara.

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 mendefinisikan informasi apa yang dikandung peristiwa, apa yang dapat dilakukan klien dengan peristiwa, dan bagaimana peristiwa dikirimkan.

Kelas Konsumen Standar WMI memberikan contoh peran kelas konsumen logis. Untuk informasi lebih lanjut, 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 setiap instance dari 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 layanan konsumen acara memiliki persyaratan keamanan yang sangat tinggi, karena langganan yang tidak sah dapat menyebabkan kerusakan yang 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 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 lebih lanjut, 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.

    Perhatian Default untuk deskriptor keamanan di EventAccess adalah NULL, yang memungkinkan akses bagi semua orang. Disarankan untuk membatasi akses ke dalam instans langganan __EventFilter demi meningkatkan keamanan acara.

Mengatur Administrator-Only SD

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 menyamar sebagai penyedia acara untuk memproses acara. Konsumen permanen hanya dapat meniru penyedia acara ketika kondisi-kondisi berikut terpenuhi.

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

Akun yang menjalankan proses konsumen harus memiliki akses FULL_WRITE ke repositori WMI (juga dikenal sebagai repositori CIM). Dalam langganan, instance __FilterToConsumerBinding, __EventConsumer, dan __EventFilter harus memiliki nilai pengidentifikasi keamanan individu (SID) yang sama di dalam 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 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 Acara WMI

Menerima Peristiwa WMI