Considerazioni sulla sicurezza per i writer

L'infrastruttura VSS richiede che i processi writer siano in grado di funzionare sia come client COM che come server.

Quando agiscono come server, i writer VSS espongono interfacce COM (ad esempio, i gestori eventi VSS, ad esempio CVssWriter::OnIdentify) e ricevono chiamate COM in ingresso dai processi VSS (ad esempio i richiedenti e il servizio VSS) o le chiamate RPC da processi esterni al Servizio Copia Shadow del servizio Copia Shadow del carico, in genere quando questi processi generano eventi VSS (ad esempio, quando un richiedente chiama IVssBackupComponents:: GatherWriterMetadata). Pertanto, un writer VSS deve gestire in modo sicuro i client COM in grado di effettuare chiamate COM in ingresso nel processo.

Analogamente, i writer VSS possono anche fungere da client COM, eseguendo chiamate COM in uscita ai callback forniti dall'infrastruttura VSS o chiamate RPC a processi esterni al Servizio Copia Shadow del carico. Questi callback forniti da un'applicazione di backup o dal servizio VsS consentono al writer di eseguire attività come l'aggiornamento del documento dei componenti di backup tramite l'interfaccia IVssComponent . Pertanto, le impostazioni di sicurezza vss devono consentire ai writer di effettuare chiamate COM in uscita in altri processi VSS.

Il meccanismo più semplice per la gestione dei problemi di sicurezza del writer comporta la selezione corretta dell'account utente in cui viene eseguito. Un writer deve in genere essere eseguito con un utente membro del gruppo Administrators o del gruppo Backup Operators oppure deve essere eseguito come account di sistema locale.

Per impostazione predefinita, quando un writer funge da client COM, se non viene eseguito con questi account, qualsiasi chiamata COM eseguita viene automaticamente rifiutata con E_ACCESSDENIED senza nemmeno arrivare all'implementazione del metodo COM.

Disabilitazione della gestione delle eccezioni COM

Quando si sviluppa un writer, impostare il flag com COMGLB_EXCEPTION_DONOT_HANDLE opzioni globali per disabilitare la gestione delle eccezioni COM. È importante eseguire questa operazione perché la gestione delle eccezioni COM può mascherare gli errori irreversibili in un'applicazione VSS. L'errore mascherato può lasciare il processo in uno stato instabile e imprevedibile, che può causare danneggiamenti e blocchi. Per altre informazioni su questo flag, vedere IGlobalOptions.

Impostazione dell'autorizzazione controllo di accesso COM predefinita writer

I writer devono tenere presente che quando i processi fungono da server (ad esempio, per gestire gli eventi VSS), devono consentire chiamate in ingresso da altri partecipanti del Servizio Copia Shadow del carico, ad esempio i richiedenti o il servizio VsS.

Tuttavia, per impostazione predefinita, un processo consentirà solo i client COM in esecuzione nella stessa sessione di accesso il SID SELF) o in esecuzione con l'account di sistema locale. Si tratta di un potenziale problema perché queste impostazioni predefinite non sono sufficienti per supportare l'infrastruttura vss. Ad esempio, i richiedenti possono essere eseguiti come account utente "Operatore di backup" che non si trova nella stessa sessione di accesso del processo writer né come account di sistema locale.

Per gestire questo tipo di problema, ogni processo del server COM può esercitare ulteriore controllo sul fatto che un client RPC o COM sia autorizzato a eseguire un metodo COM, ovvero un writer in questo caso, implementa utilizzando CoInitializeSecurity per impostare un'autorizzazione di controllo di accesso COM predefinita a livello di processo.

I writer possono eseguire in modo esplicito le operazioni seguenti:

  • Consentire a tutti i processi di accedere alla chiamata al processo writer.

    Questa opzione può essere adeguata per molti writer e viene usata da altri server COM, ad esempio tutti i servizi Windows basati su SVCHOST usano già questa opzione, come tutti i servizi COM+ per impostazione predefinita.

    Consentire a tutti i processi di eseguire chiamate COM in ingresso non è necessariamente un punto debole per la sicurezza. Un writer che funge da server COM, come tutti gli altri server COM, mantiene sempre la possibilità di autorizzare i client in ogni metodo COM implementato nel relativo processo.

    Per consentire a tutti i processi l'accesso COM a un writer, è possibile passare un descrittore di sicurezza NULL come primo parametro di CoInitializeSecurity. Si noti che CoInitializeSecurity deve essere chiamato al massimo una volta per l'intero processo. Per altri dettagli su CoInitializeSecurity, vedere la documentazione COM.

    Di seguito è riportato un esempio di codice che include una chiamata a CoInitializeSecurity:

    // Initialize COM security.
    hr = CoInitializeSecurity(
           NULL,                          // PSECURITY_DESCRIPTOR          pSecDesc,
           -1,                            // LONG                          cAuthSvc,
           NULL,                          // SOLE_AUTHENTICATION_SERVICE  *asAuthSvc,
           NULL,                          // void                         *pReserved1,
           RPC_C_AUTHN_LEVEL_PKT_PRIVACY, // DWORD                         dwAuthnLevel,
           RPC_C_IMP_LEVEL_IDENTIFY,      // DWORD                         dwImpLevel,
           NULL,                          // void                         *pAuthList,
           EOAC_NONE,                     // DWORD                         dwCapabilities,
           NULL                           // void                         *pReserved3
        );
    

    Quando si imposta in modo esplicito la sicurezza a livello COM di un writer con CoInitializeSecurity, è necessario eseguire le operazioni seguenti:

    • Impostare il livello di autenticazione su almeno RPC_C_AUTHN_LEVEL_CONNECT.

      Per una maggiore sicurezza, è consigliabile usare RPC_C_AUTHN_LEVEL_PKT_PRIVACY.

    • Impostare il livello di rappresentazione su RPC_C_IMP_LEVEL_IDENTIFY a meno che il processo writer non debba consentire la rappresentazione per chiamate RPC o COM specifiche non correlate al Servizio Copia Shadow del shadow del servizio Copia Shadow del database.

  • Consente l'accesso solo ai processi specificati per chiamare nel processo writer.

    Un server COM (ad esempio un writer) che chiama CoInitializeSecurity con un descrittore di sicurezza non NULL può usare il descrittore per configurare se stesso per accettare chiamate in ingresso solo da utenti appartenenti a un set specifico di account.

    Un writer deve assicurarsi che i client COM in esecuzione con utenti validi siano autorizzati a chiamare nel processo. Un writer che specifica un descrittore di sicurezza nel primo parametro deve consentire agli utenti seguenti di eseguire chiamate in ingresso nel processo del richiedente:

    • Sistema locale
    • Membri del gruppo Administrators locale
    • Membri del gruppo degli operatori di backup locali
    • Account con cui è in esecuzione il writer

Controllo esplicito dell'accesso dell'account utente a un writer

In alcuni casi, la limitazione dell'accesso a un writer ai processi in esecuzione come sistema locale o in amministratori locali o gruppi locali di Backup Operators potrebbe essere troppo restrittiva.

Ad esempio, un processo writer (ad esempio un writer non di sistema di terze parti) potrebbe non essere in genere necessario eseguire con un account Amministratore o Operatore di backup. Per motivi di sicurezza, sarebbe preferibile non promuovere artificialmente i privilegi del processo per supportare il Servizio Copia Shadow del servizio Copia Shadow del database.

In questi casi, la chiave del Registro di sistema HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS\VssAccessControl deve essere modificata per indicare a VSS che un utente specificato è sicuro per eseguire un writer VSS.

In questa chiave è necessario creare una sottochiave con lo stesso nome dell'account a cui concedere o negare l'accesso. Questa sottochiave deve essere impostata su uno dei valori della tabella seguente.

Valore Significato
0 Negare all'utente l'accesso al writer e al richiedente.
1 Concedere all'utente l'accesso al writer.
2 Concedere all'utente l'accesso al richiedente.
3 Concedere all'utente l'accesso al writer e al richiedente.

 

L'esempio seguente concede l'accesso all'account "MyDomain\MyUser":

HKEY_LOCAL_MACHINE
   SYSTEM
      CurrentControlSet
         Services
            VSS
               VssAccessControl
                  MyDomain\MyUser = 1<dl>
<dt>

                  Data type
</dt>
<dd>                  REG_DWORD</dd>
</dl>

Questo meccanismo può essere usato anche per limitare in modo esplicito un utente altrimenti consentito all'esecuzione di un writer VSS. L'esempio seguente limita l'accesso dall'account "ThatDomain\Administrator":

HKEY_LOCAL_MACHINE
   SYSTEM
      CurrentControlSet
         Services
            VSS
               VssAccessControl
                  ThatDomain\Administrator = 0<dl>
<dt>

                  Data type
</dt>
<dd>                  REG_DWORD</dd>
</dl>

L'utente ThatDomain\Administrator non è in grado di eseguire un writer VSS.