Sécurité du service et droits d’accès

Le modèle de sécurité Windows vous permet de contrôler l’accès au gestionnaire de contrôle de service (SCM) et aux objets de service. Les sections suivantes fournissent des informations détaillées :

Droits d’accès pour le Gestionnaire de contrôle de service

Voici les droits d’accès spécifiques pour le SCM.

Droit d’accès Description
SC_MANAGER_ALL_ACCESS (0xF003F) Inclut STANDARD_RIGHTS_REQUIRED, en plus de tous les droits d’accès dans ce tableau.
SC_MANAGER_CREATE_SERVICE (0x0002) Obligatoire pour appeler la fonction CreateService pour créer un objet de service et l’ajouter à la base de données.
SC_MANAGER_CONNECT (0x0001) Obligatoire pour se connecter au gestionnaire de contrôle de service.
SC_MANAGER_ENUMERATE_SERVICE (0x0004) Obligatoire pour appeler la fonction EnumServicesStatus ou EnumServicesStatusEx pour répertorier les services qui se trouvent dans la base de données.
Obligatoire pour appeler la fonction NotifyServiceStatusChange pour recevoir une notification lors de la création ou de la suppression d’un service.
SC_MANAGER_LOCK (0x0008) Obligatoire pour appeler la fonction LockServiceDatabase pour acquérir un verrou sur la base de données.
SC_MANAGER_MODIFY_BOOT_CONFIG (0x0020) Obligatoire pour appeler la fonction NotifyBootConfigStatus .
SC_MANAGER_QUERY_LOCK_STATUS (0x0010) Obligatoire pour appeler la fonction QueryServiceLockStatus pour récupérer les informations de verrouillage status de la base de données.

Voici les droits d’accès génériques pour le SCM.

Droit d’accès Description
GENERIC_READ
STANDARD_RIGHTS_READ
SC_MANAGER_ENUMERATE_SERVICE
SC_MANAGER_QUERY_LOCK_STATUS
GENERIC_WRITE
STANDARD_RIGHTS_WRITE
SC_MANAGER_CREATE_SERVICE
SC_MANAGER_MODIFY_BOOT_CONFIG
GENERIC_EXECUTE
STANDARD_RIGHTS_EXECUTE
SC_MANAGER_CONNECT
SC_MANAGER_LOCK
GENERIC_ALL
SC_MANAGER_ALL_ACCESS

Un processus disposant des droits d’accès appropriés peut ouvrir un handle au SCM qui peut être utilisé dans les fonctions OpenService, EnumServicesStatusEx et QueryServiceLockStatus . Seuls les processus disposant de privilèges d’administrateur peuvent ouvrir des handles au SCM qui peuvent être utilisés par les fonctions CreateService et LockServiceDatabase .

Le système crée le descripteur de sécurité pour le SCM. Pour obtenir ou définir le descripteur de sécurité pour le SCM, utilisez les fonctions QueryServiceObjectSecurity et SetServiceObjectSecurity avec un handle de l’objet SCManager.

Windows Server 2003 et Windows XP : Contrairement à la plupart des autres objets sécurisables, le descripteur de sécurité du SCM ne peut pas être modifié. Ce comportement a changé à partir de Windows Server 2003 avec Service Pack 1 (SP1).

Les droits d’accès suivants sont accordés.

Compte Droits d’accès
Utilisateurs authentifiés à distance
SC_MANAGER_CONNECT
Utilisateurs authentifiés locaux (y compris LocalService et NetworkService)
SC_MANAGER_CONNECT
SC_MANAGER_ENUMERATE_SERVICE
SC_MANAGER_QUERY_LOCK_STATUS
STANDARD_RIGHTS_READ
LocalSystem
SC_MANAGER_CONNECT
SC_MANAGER_ENUMERATE_SERVICE
SC_MANAGER_MODIFY_BOOT_CONFIG
SC_MANAGER_QUERY_LOCK_STATUS
STANDARD_RIGHTS_READ
Administrateurs
SC_MANAGER_ALL_ACCESS

Notez que les utilisateurs distants authentifiés sur le réseau mais qui ne sont pas connectés de manière interactive peuvent se connecter au SCM, mais pas effectuer d’opérations qui nécessitent d’autres droits d’accès. Pour effectuer ces opérations, l’utilisateur doit être connecté de manière interactive ou le service doit utiliser l’un des comptes de service.

Windows Server 2003 et Windows XP : Les utilisateurs authentifiés à distance bénéficient des droits d’accès SC_MANAGER_CONNECT, SC_MANAGER_ENUMERATE_SERVICE, SC_MANAGER_QUERY_LOCK_STATUS et STANDARD_RIGHTS_READ . Ces droits d’accès sont restreints comme décrit dans le tableau précédent à partir de Windows Server 2003 avec SP1

Lorsqu’un processus utilise la fonction OpenSCManager pour ouvrir un handle à une base de données de services installés, il peut demander des droits d’accès. Le système effectue une case activée de sécurité sur le descripteur de sécurité du SCM avant d’accorder les droits d’accès demandés.

Droits d’accès pour un service

Voici les droits d’accès spécifiques d’un service.

Droit d’accès Description
SERVICE_ALL_ACCESS (0xF01FF) Inclut STANDARD_RIGHTS_REQUIRED en plus de tous les droits d’accès dans ce tableau.
SERVICE_CHANGE_CONFIG (0x0002) Obligatoire pour appeler la fonction ChangeServiceConfig ou ChangeServiceConfig2 pour modifier la configuration du service. Étant donné que cela accorde à l’appelant le droit de modifier le fichier exécutable que le système exécute, il ne doit être accordé qu’aux administrateurs.
SERVICE_ENUMERATE_DEPENDENTS (0x0008) Obligatoire pour appeler la fonction EnumDependentServices pour énumérer tous les services dépendant du service.
SERVICE_INTERROGATE (0x0080) Obligatoire pour appeler la fonction ControlService pour demander au service de signaler immédiatement ses status.
SERVICE_PAUSE_CONTINUE (0x0040) Obligatoire pour appeler la fonction ControlService pour suspendre ou continuer le service.
SERVICE_QUERY_CONFIG (0x0001) Obligatoire pour appeler les fonctions QueryServiceConfig et QueryServiceConfig2 pour interroger la configuration du service.
SERVICE_QUERY_STATUS (0x0004) Obligatoire pour appeler la fonction QueryServiceStatus ou QueryServiceStatusEx pour demander au gestionnaire de contrôle de service la status du service.
Obligatoire pour appeler la fonction NotifyServiceStatusChange pour recevoir une notification lorsqu’un service change status.
SERVICE_START (0x0010) Obligatoire pour appeler la fonction StartService pour démarrer le service.
SERVICE_STOP (0x0020) Obligatoire pour appeler la fonction ControlService pour arrêter le service.
SERVICE_USER_DEFINED_CONTROL(0x0100) Obligatoire pour appeler la fonction ControlService pour spécifier un code de contrôle défini par l’utilisateur.

Voici les droits d’accès standard pour un service.

Droit d’accès Description
ACCESS_SYSTEM_SECURITY Requis pour appeler la fonction QueryServiceObjectSecurity ou SetServiceObjectSecurity pour accéder à la SACL. La bonne façon d’obtenir cet accès consiste à activer le privilègeSE_SECURITY_NAME dans le jeton d’accès actuel de l’appelant, à ouvrir le handle pour l’accès ACCESS_SYSTEM_SECURITY, puis à désactiver le privilège.
DELETE (0x10000) Requis pour appeler la fonction DeleteService pour supprimer le service.
READ_CONTROL (0x20000) Requis pour appeler la fonction QueryServiceObjectSecurity pour interroger le descripteur de sécurité de l’objet de service.
WRITE_DAC (0x40000) Requis pour appeler la fonction SetServiceObjectSecurity pour modifier le membre Dacl du descripteur de sécurité de l’objet de service.
WRITE_OWNER (0x80000) Requis pour appeler la fonction SetServiceObjectSecurity pour modifier les membres Owner et Group du descripteur de sécurité de l’objet de service.

Voici les droits d’accès génériques pour un service.

Droit d’accès Description
GENERIC_READ
STANDARD_RIGHTS_READ
SERVICE_QUERY_CONFIG
SERVICE_QUERY_STATUS
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
GENERIC_WRITE
STANDARD_RIGHTS_WRITE
SERVICE_CHANGE_CONFIG
GENERIC_EXECUTE
STANDARD_RIGHTS_EXECUTE
SERVICE_START
SERVICE_STOP
SERVICE_PAUSE_CONTINUE
SERVICE_USER_DEFINED_CONTROL

Le SCM crée le descripteur de sécurité d’un objet de service lorsque le service est installé par la fonction CreateService . Le descripteur de sécurité par défaut d’un objet de service accorde l’accès suivant.

Compte Droits d’accès
Utilisateurs authentifiés à distance Non accordé par défaut. Windows Server 2003 avec SP1 : SERVICE_USER_DEFINED_CONTROL
Windows Server 2003 et Windows XP : Les droits d’accès pour les utilisateurs authentifiés à distance sont les mêmes que pour les utilisateurs authentifiés locaux.
Utilisateurs locaux authentifiés (y compris LocalService et NetworkService)
READ_CONTROL
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_INTERROGATE
SERVICE_QUERY_CONFIG
SERVICE_QUERY_STATUS
SERVICE_USER_DEFINED_CONTROL
LocalSystem
READ_CONTROL
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_INTERROGATE
SERVICE_PAUSE_CONTINUE
SERVICE_QUERY_CONFIG
SERVICE_QUERY_STATUS
SERVICE_START
SERVICE_STOP
SERVICE_USER_DEFINED_CONTROL
Administrateurs
DELETE
READ_CONTROL
SERVICE_ALL_ACCESS
WRITE_DAC
WRITE_OWNER

Pour effectuer des opérations, l’utilisateur doit être connecté de manière interactive ou le service doit utiliser l’un des comptes de service.

Pour obtenir ou définir le descripteur de sécurité d’un objet de service, utilisez les fonctions QueryServiceObjectSecurity et SetServiceObjectSecurity . Pour plus d’informations, consultez Modification de la liste DACL pour un service.

Lorsqu’un processus utilise la fonction OpenService , le système vérifie les droits d’accès demandés par rapport au descripteur de sécurité pour l’objet de service.

L’octroi de certains droits d’accès à des utilisateurs non approuvés (tels que SERVICE_CHANGE_CONFIG ou SERVICE_STOP) peut leur permettre d’interférer avec l’exécution de votre service et éventuellement de leur permettre d’exécuter des applications sous le compte LocalSystem.

Lorsque la fonction EnumServicesStatusEx est appelée, si l’appelant n’a pas le droit d’accès SERVICE_QUERY_STATUS à un service, le service est omis en mode silencieux de la liste des services retournés au client.