Considérations relatives à la sécurité pour les enregistreurs
L’infrastructure VSS nécessite que les processus d’enregistreur puissent fonctionner à la fois en tant que clients COM et en tant que serveurs.
Quand 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 ::GatherWriterMetadata). 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 aux rappels fournis par l’infrastructure VSS ou les appels RPC aux processus externes à VSS. Ces rappels fournis par une application de sauvegarde ou par le service VSS permettent à l’enregistreur 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 permettre aux enregistreurs d’effectuer des appels COM sortants dans d’autres processus VSS.
Le mécanisme le plus simple de gestion des 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 enregistreur agit en tant que client COM, s’il ne s’exécute pas sous ces comptes, tout appel COM effectué est automatiquement rejeté avec E_ACCESSDENIED sans même obtenir l’implémentation de la méthode COM.
Désactivation de la gestion des exceptions COM
Lors du développement d’un enregistreur, 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 enregistreurs doivent être conscients que lorsque leurs processus agissent en tant que serveur (par exemple, pour gérer les é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 que le SID SELF) 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’écriture ni un compte système local.
Pour gérer ce type de problème, chaque processus de serveur COM peut exercer un contrôle supplémentaire sur le fait qu’un client RPC ou COM soit autorisé à effectuer une méthode COM que le serveur (un enregistreur dans ce cas) implémente à l’aide de CoInitializeSecurity pour définir une autorisation de vérification d’accès COM par défaut à l’échelle du processus.
Les rédacteurs peuvent effectuer explicitement les opérations suivantes :
Autorisez tous les processus à appeler dans le processus d’écriture.
Cette option peut être adéquate 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 faiblesse de sécurité. Un enregistreur 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 COM à accéder à un enregistreur, vous pouvez passer un descripteur de sécurité NULL en tant que 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 enregistreur avec CoInitializeSecurity, procédez comme suit :
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 de l’enregistreur 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 d’écriture.
Un serveur COM (tel qu’un enregistreur) qui appelle CoInitializeSecurity avec un descripteur null nonNULL peut utiliser le descripteur de sécurité pour se configurer pour accepter les appels entrants uniquement des utilisateurs appartenant à un ensemble spécifique de comptes.
Un enregistreur doit s’assurer que les clients COM s’exécutant sous des utilisateurs valides sont autorisés à appeler son processus. Un enregistreur qui spécifie un descripteur de sécurité dans le premier paramètre doit autoriser les utilisateurs suivants à effectuer des appels entrants dans le processus demandeur :
- Système local
- Membres du groupe Administrateurs local
- Membres du groupe Opérateurs de sauvegarde local
- Compte sous lequel l’enregistreur est en cours d’exécution
Contrôle explicite de l’accès au compte d’utilisateur à un enregistreur
Il existe des cas où la restriction de l’accès à un enregistreur aux processus s’exécutant en tant que système local, ou sous les administrateurs locaux ou les groupes locaux d’opérateurs de sauvegarde locaux, peut être trop restrictive.
Par exemple, un processus d’écriture (peut-être un enregistreur non système tiers) n’a peut-être pas besoin d’être exécuté sous un compte Administrateur ou 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 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS\VssAccessControl clé de Registre doit être modifiée pour indiquer à VSS qu’un utilisateur spécifié est sûr d’exécuter un enregistreur VSS.
Sous cette clé, vous devez créer une sous-clé portant le même nom que le compte à accorder ou refuser l’accès. 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 demandeur. |
1 | Accordez à l’utilisateur l’accès à votre enregistreur. |
2 | Accordez à l’utilisateur l’accès à votre demandeur. |
3 | Accordez à l’utilisateur l’accès à votre enregistreur et 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 restreindre explicitement un utilisateur autorisé à 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.