Considérations relatives à la sécurité pour les enregistreurs

L’infrastructure VSS nécessite des processus d’enregistreur pour pouvoir fonctionner à la fois en tant que clients COM et en tant que serveurs.

Lorsqu’ils agissent en tant que serveurs, les enregistreurs VSS exposent des interfaces COM (par exemple, les gestionnaires d’événements VSS tels que CVssWriter::OnIdentify) et reçoivent des appels COM entrants à partir de processus VSS (tels que les demandeurs et le service VSS) ou des appels RPC provenant de processus externes à VSS, généralement lorsque ces processus génèrent des événements VSS (par exemple, lorsqu’un demandeur appelle IVssBackupComponents :: CollectWriterMetadata). Par conséquent, un enregistreur VSS doit gérer en toute sécurité les clients COM capables d’effectuer des appels COM entrants dans son processus.

De même, les enregistreurs VSS peuvent également agir en tant que clients COM, en effectuant des appels COM sortants vers des rappels fournis par l’infrastructure VSS ou des appels RPC à des processus externes à VSS. Ces rappels fournis par une application de sauvegarde ou par le service VSS permettent au writer d’effectuer des tâches telles que la mise à jour du document composants de sauvegarde via l’interface IVssComponent . Par conséquent, les paramètres de sécurité VSS doivent autoriser les enregistreurs à effectuer des appels COM sortants dans d’autres processus VSS.

Le mécanisme le plus simple pour gérer les problèmes de sécurité de l’enregistreur implique la sélection appropriée du compte d’utilisateur sous lequel il s’exécute. Un enregistreur doit généralement s’exécuter sous un utilisateur membre du groupe Administrateurs ou du groupe Opérateurs de sauvegarde, ou il doit s’exécuter en tant que compte système local.

Par défaut, lorsqu’un writer agit en tant que client COM, s’il ne s’exécute pas sous ces comptes, tout appel COM qu’il effectue est automatiquement rejeté avec E_ACCESSDENIED sans même atteindre l’implémentation de la méthode COM.

Désactivation de la gestion des exceptions COM

Lors du développement d’un writer, définissez l’indicateur d’options globales COM COMGLB_EXCEPTION_DONOT_HANDLE pour désactiver la gestion des exceptions COM. Il est important de le faire, car la gestion des exceptions COM peut masquer les erreurs irrécupérables dans une application VSS. L’erreur masquée peut laisser le processus dans un état instable et imprévisible, ce qui peut entraîner des altérations et des blocages. Pour plus d’informations sur cet indicateur, consultez IGlobalOptions.

Définition de l’autorisation de vérification d’accès COM par défaut de l’enregistreur

Les rédacteurs doivent être conscients que lorsque leurs processus agissent en tant que serveur (par exemple, pour gérer des événements VSS), ils doivent autoriser les appels entrants d’autres participants VSS, tels que les demandeurs ou le service VSS.

Toutefois, par défaut, un processus autorise uniquement les clients COM qui s’exécutent sous la même session d’ouverture de session SELF SID) ou qui s’exécutent sous le compte système local. Il s’agit d’un problème potentiel, car ces valeurs par défaut ne sont pas suffisantes pour prendre en charge l’infrastructure VSS. Par exemple, les demandeurs peuvent s’exécuter en tant que compte d’utilisateur « Opérateur de sauvegarde » qui n’est ni dans la même session d’ouverture de session que le processus d’enregistreur ni comme compte système local.

Pour gérer ce type de problème, chaque processus serveur COM peut contrôler davantage si un client RPC ou COM est autorisé à exécuter une méthode COM que le serveur (un writer dans ce cas) implémente à l’aide de CoInitializeSecurity pour définir un accès COM par défaut à l’échelle du processus case activée autorisation.

Les rédacteurs peuvent explicitement effectuer les opérations suivantes :

  • Autorisez tous les processus à appeler le processus writer.

    Cette option peut être appropriée pour de nombreux enregistreurs et est utilisée par d’autres serveurs COM. Par exemple, tous les services Windows basés sur SVCHOST utilisent déjà cette option, comme tous les services COM+ par défaut.

    Autoriser tous les processus à effectuer des appels COM entrants n’est pas nécessairement une faille de sécurité. Un writer agissant en tant que serveur COM, comme tous les autres serveurs COM, conserve toujours la possibilité d’autoriser ses clients sur chaque méthode COM implémentée dans son processus.

    Pour autoriser tous les processus à accéder à un writer, vous pouvez passer un descripteur de sécurité NULL comme premier paramètre de CoInitializeSecurity. (Notez que CoInitializeSecurity doit être appelé au plus une fois pour l’ensemble du processus. Consultez la documentation COM pour plus d’informations sur CoInitializeSecurity.)

    Voici un exemple de code qui inclut un appel à 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
        );
    

    Lorsque vous définissez explicitement la sécurité au niveau COM d’un writer avec CoInitializeSecurity, vous devez effectuer les opérations suivantes :

    • Définissez le niveau d’authentification sur au moins RPC_C_AUTHN_LEVEL_CONNECT.

      Pour une meilleure sécurité, envisagez d’utiliser RPC_C_AUTHN_LEVEL_PKT_PRIVACY.

    • Définissez le niveau d’emprunt d’identité sur RPC_C_IMP_LEVEL_IDENTIFY sauf si le processus d’écriture doit autoriser l’emprunt d’identité pour des appels RPC ou COM spécifiques qui ne sont pas liés à VSS.

  • Autorisez uniquement l’accès aux processus spécifiés pour appeler le processus writer.

    Un serveur COM (tel qu’un writer) qui appelle CoInitializeSecurity avec un descripteur de sécurité non NULL peut utiliser le descripteur pour se configurer pour accepter uniquement les appels entrants provenant d’utilisateurs appartenant à un ensemble spécifique de comptes.

    Un writer doit s’assurer que les clients COM s’exécutant sous des utilisateurs valides sont autorisés à appeler son processus. Un writer qui spécifie un descripteur de sécurité dans le premier paramètre doit permettre aux utilisateurs suivants d’effectuer des appels entrants dans le processus du demandeur :

    • Système Local
    • Membres du groupe Administrateurs local
    • Membres du groupe d’opérateurs de sauvegarde local
    • Compte sous lequel l’enregistreur s’exécute

Contrôle explicite de l’accès du compte d’utilisateur à un writer

Dans certains cas, la restriction de l’accès à un enregistreur aux processus s’exécutant en tant que système local, ou sous les groupes locaux Administrateurs ou opérateurs de sauvegarde locaux, peut être trop restrictive.

Par exemple, un processus d’écriture (peut-être un enregistreur tiers non système) n’a généralement pas besoin d’être exécuté sous un compte d’administrateur ou d’opérateur de sauvegarde. Pour des raisons de sécurité, il serait préférable de ne pas promouvoir artificiellement les privilèges du processus pour prendre en charge VSS.

Dans ce cas, la clé de\ RegistreVSS\VssAccessControlControlControl HKEY_LOCAL_MACHINESYSTEM\CurrentControlSet\Services\ doit être modifiée pour indiquer à VSS qu’un utilisateur spécifié peut exécuter un enregistreur VSS en toute sécurité.

Sous cette clé, vous devez créer une sous-clé portant le même nom que le compte auquel l’accès doit être accordé ou refusé. Cette sous-clé doit être définie sur l’une des valeurs du tableau suivant.

Valeur Signification
0 Refusez à l’utilisateur l’accès à votre enregistreur et à votre demandeur.
1 Accordez à l’utilisateur l’accès à votre writer.
2 Accordez à l’utilisateur l’accès à votre demandeur.
3 Accordez à l’utilisateur l’accès à votre enregistreur et à votre demandeur.

 

L’exemple suivant accorde l’accès au compte « MyDomain\MyUser » :

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

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

Ce mécanisme peut également être utilisé pour empêcher explicitement un utilisateur autorisé d’exécuter un enregistreur VSS. L’exemple suivant limite l’accès à partir du compte « ThatDomain\Administrator » :

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

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

L’utilisateur ThatDomain\Administrator ne peut pas exécuter un enregistreur VSS.