Considerações de segurança para escritores

A infraestrutura do VSS requer que os processos de gravador possam funcionar como clientes COM e como servidores.

Ao agir como servidores, os gravadores VSS expõem interfaces COM (por exemplo, os manipuladores de eventos VSS como CVssWriter::OnIdentify) e recebem chamadas COM de entrada de processos VSS (como solicitantes e o serviço VSS) ou chamadas RPC de processos externos ao VSS, normalmente quando esses processos geram eventos VSS (por exemplo, quando um solicitante chama IVssBackupComponents:: GatherWriterMetadata). Portanto, um gravador vss precisa gerenciar com segurança quais clientes COM são capazes de fazer chamadas COM de entrada em seu processo.

Da mesma forma, os gravadores VSS também podem atuar como clientes COM, fazendo chamadas COM de saída para retornos de chamada fornecidos pela infraestrutura vss ou chamadas RPC para processos externos ao VSS. Esses retornos de chamada fornecidos por um aplicativo de backup ou pelo serviço VSS permitem que o gravador execute tarefas como atualizar o documento de componentes Backup por meio da interface IVssComponent. Portanto, as configurações de segurança do VSS devem permitir que os gravadores façam chamadas COM de saída em outros processos VSS.

O mecanismo mais simples para gerenciar problemas de segurança do gravador envolve a seleção adequada da conta de usuário sob a qual ela é executada. Normalmente, um gravador precisa ser executado em um usuário que seja membro do grupo Administradores ou do grupo Backup Operators ou que precise ser executado como a conta do Sistema Local.

Por padrão, quando um gravador está atuando como um cliente COM, se ele não for executado nessas contas, qualquer chamada COM feita será automaticamente rejeitada com E_ACCESSDENIED sem sequer acessar a implementação do método COM.

Desabilitando o tratamento de exceções COM

Ao desenvolver um gravador, defina o sinalizador com COMGLB_EXCEPTION_DONOT_HANDLE opções globais para desabilitar o tratamento de exceções COM. É importante fazer isso porque o tratamento de exceção COM pode mascarar erros fatais em um aplicativo VSS. O erro mascarado pode deixar o processo em um estado instável e imprevisível, o que pode levar a corrupçãos e travas. Para obter mais informações sobre esse sinalizador, consulte IGlobalOptions.

Configurando a permissão de verificação de acesso PADRÃO COM do Gravador

Os gravadores precisam estar cientes de que quando seus processos atuam como um servidor (por exemplo, para lidar com eventos VSS), eles devem permitir chamadas de entrada de outros participantes do VSS, como solicitantes ou o serviço VSS.

No entanto, por padrão, um processo permitirá apenas clientes COM que estão em execução na mesma sessão de logon do SID SELF) ou em execução na conta do Sistema Local. Esse é um problema potencial porque esses padrões não são suficientes para dar suporte à infraestrutura do VSS. Por exemplo, os solicitantes podem ser executados como uma conta de usuário "operador Backup" que não está nem na mesma sessão de logon que o processo de gravador nem uma conta do Sistema Local.

Para lidar com esse tipo de problema, todo processo de servidor COM pode exercer um controle adicional sobre se um cliente RPC ou COM tem permissão para executar um método COM que o servidor (um gravador neste caso) implementa usando o CoInitializeSecurity para definir uma permissão de verificação de acesso COM padrão em todo o processo.

Os escritores podem fazer explicitamente o seguinte:

  • Permitir que todos os processos acessem a chamada para o processo de gravador.

    Essa opção pode ser adequada para muitos gravadores e é usada por outros servidores COM, por exemplo, todos os serviços de Windows baseados em SVCHOST já estão usando essa opção, assim como todos os Serviços COM+ por padrão.

    Permitir que todos os processos executem chamadas COM de entrada não é necessariamente uma fraqueza de segurança. Um gravador que atua como um servidor COM, como todos os outros servidores COM, sempre mantém a opção de autorizar seus clientes em todos os métodos COM implementados em seu processo.

    Para permitir que todos os processos COM acessem um gravador, você pode passar um descritor de segurança NULL como o primeiro parâmetro do CoInitializeSecurity. (Observe que o CoInitializeSecurity deve ser chamado no máximo uma vez para todo o processo. Consulte a documentação com para obter mais detalhes sobre CoInitializeSecurity.)

    Veja a seguir um exemplo de código que inclui uma chamada para 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
        );
    

    Ao definir explicitamente a segurança em nível COM de um gravador com o CoInitializeSecurity, você deve fazer o seguinte:

    • Defina o nível de autenticação como pelo menos RPC_C_AUTHN_LEVEL_CONNECT.

      Para obter uma melhor segurança, considere usar RPC_C_AUTHN_LEVEL_PKT_PRIVACY.

    • Defina o nível de representação como RPC_C_IMP_LEVEL_IDENTIFY , a menos que o processo de gravador precise permitir representação para chamadas RPC ou COM específicas que não estão relacionadas ao VSS.

  • Permitir acesso somente a processos especificados para chamar o processo de gravador.

    Um servidor COM (como um gravador) que está chamando CoInitializeSecurity com um descritor de segurança não NULL pode usar o descritor para se configurar para aceitar chamadas de entrada somente de usuários que pertencem a um conjunto específico de contas.

    Um gravador deve garantir que os clientes COM em execução em usuários válidos estejam autorizados a chamar em seu processo. Um gravador que especifica um Descritor de Segurança no primeiro parâmetro deve permitir que os seguintes usuários executem chamadas de entrada no processo do solicitante:

    • Sistema Local
    • Membros do grupo administrador local
    • Membros do grupo local Backup Operators
    • A conta sob a qual o gravador está em execução

Controlar explicitamente o acesso de conta de usuário a um gravador

Há casos em que restringir o acesso a um gravador a processos em execução como Sistema Local, ou nos administradores locais ou grupos locais de operadores de Backup locais, pode ser muito restritivo.

Por exemplo, um processo de gravador (talvez um gravador não-sistema de terceiros) pode normalmente não precisar ser executado em uma conta de Administrador ou operador de Backup. Por motivos de segurança, seria melhor não promover artificialmente os privilégios do processo para dar suporte ao VSS.

Nesses casos, a chave do registro HKEY_LOCAL_MACHINE\SYSTEMCurrentControlSetServicesVSSVssAccessControl\\\\ deve ser modificada para instruir o VSS de que um usuário especificado é seguro para executar um gravador VSS.

Sob essa chave, você deve criar uma subchave que tenha o mesmo nome que a conta que deve ser concedida ou negado acesso. Essa subchave deve ser definida como um dos valores na tabela a seguir.

Valor Significado
0 Negar o acesso do usuário ao gravador e ao solicitante.
1 Conceda ao usuário acesso ao gravador.
2 Conceda ao usuário acesso ao solicitante.
3 Conceda ao usuário acesso ao gravador e ao solicitante.

 

O exemplo a seguir concede acesso à conta "MyDomain\MyUser":

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

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

Esse mecanismo também pode ser usado para restringir explicitamente um usuário permitido de executar um gravador VSS. O exemplo a seguir restringirá o acesso da conta "ThatDomain\Administrator":

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

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

O usuário ThatDomain\Administrator não seria capaz de executar um gravador VSS.