Windows - Utiliser le compte Service local et / ou Service réseau pour un service Windows

18

J'ai créé un service de fenêtre qui surveille les fichiers sur un répertoire spécifique de notre système d'exploitation Windows. Lorsqu'un fichier est détecté, le service effectue des E / S sur les fichiers, lit les fichiers, crée des sous-répertoires, etc. Ce service utilise également la connectivité de la base de données pour se connecter à un autre serveur. Mon plan consiste à exécuter le service en tant que compte «Service local» par défaut. Étant donné que je dois autoriser les privilèges d'écriture / lecture, ce que, apparemment, le compte "Service local" ne fait pas par défaut, je vais définir explicitement les privilèges "Contrôle total" pour le compte "Service local" sur le dossier que je suis lecture / écriture vers et depuis.

Je crois que ce qui précède est un bon. Ma question est la suivante: pour le dossier dans lequel je lis et j'écris, dois-je configurer un rôle "Service réseau" avec un accès de contrôle total? Je me demande, puisque mon service utilise la connectivité de la base de données à un autre serveur, si j'ai besoin de la configuration du compte "Service réseau".

Je peux mal comprendre ce que fait le compte "Service réseau".

contactmatt
la source

Réponses:

18

Le NT AUTHORITY\NetworkServicecompte n'est nécessaire que lorsque vous communiquez avec d'autres ordinateurs d'un domaine qui ont besoin des informations d'identification de votre ordinateur pour le contrôle d'accès. Il n'est pas nécessaire pour un accès Internet / réseau simple. Il n'est nécessaire qu'à des fins spécifiques dans un domaine Active Directory.

De plus, l'intérêt du NT AUTHORITY\LocalServicecompte est qu'il dispose de privilèges minimaux sur le système. En lui accordant plus de privilèges, vous diminuez la sécurité des nombreux services de votre système conçus pour fonctionner au niveau de privilèges bas qu'il a été conçu pour offrir. Si votre service nécessite des privilèges au-delà de ceux-ci, vous devez créer un nouveau compte avec les privilèges nécessaires et définir ce compte dans l' onglet Connexion des propriétés du service. (Cela peut également être fait par programme.)

Vous pouvez également l'exécuter en utilisant le NT AUTORITY\LocalSystemcompte , qui a un accès illimité à votre système, mais je suppose que vous vouliez utiliser le LocalServicecompte pour la sécurité accrue qu'il offre.

Patchs
la source
1
Comment le fait de donner au compte LocalService le contrôle total sur un dossier (et sous-dossiers) diminuerait-il la sécurité des autres services?
contactmatt
1
@ user19185 Cela ne diminue pas leur sécurité en soi , mais cela augmente le profil d'attaque. Si un service fonctionnant comme LocalServiceest compromis, il aurait accès à tout ce que vous avez ouvert LocalService, alors qu'il n'aurait normalement accès à rien. Il s'agit d'une procédure d'exploitation standard de sécurité informatique depuis les années 70 .
Patchs du
1
Je veux juste souligner qu'il LocalSystema plus de droits et de privilèges que les comptes d'administrateur standard.
Stein Åsmul
@Stein Åsmul: merci pour la correction! J'ai mis à jour ma réponse pour refléter cela.
Patchs
2

La réponse précédente ne semblait pas répondre directement aux questions, j'ai donc pensé y ajouter quelque chose.

  1. Mon plan consiste à exécuter le service en tant que compte «Service local» par défaut. Je vais définir explicitement les privilèges "Contrôle total" pour le compte "Service local" sur le dossier que je lis / écris vers et depuis. Je pense que ce qui précède est un bon plan.

Personnellement, je ne vois pas de gros problème avec ce plan. Avec BUILTINs, le choix est entre:

  1. Exécution en tant que LOCALSYSTEM - donc si ce service est compromis, l'attaquant possède Tout , et immédiatement.
  2. Exécution en tant que LOCALSERVICE - donc si ce service, ou l'un des nombreux autres services exécutés sous ce compte, est compromis, l'attaquant a accès à un répertoire supplémentaire. *

On peut dire que l'ajout de quelques ACL supplémentaires pour pouvoir utiliser la deuxième option est préférable. Oui, l'option la plus sûre pour un service à faible privilège mais hautement sensible à la sécurité serait de s'exécuter sous un compte de service personnalisé à faible privilège. Mais à moins que vous ne vouliez créer un nouveau compte / gérer les mots de passe pour chaque service que vous déployez, l'utilisation de LocalService pour des tâches non sensibles mineures n'est pas si terrible. Vous avez juste besoin de prendre une décision responsable sur la base de ces considérations, comme ce qui se trouve dans ce répertoire ou cette base de données, l'impact en cas de violation, etc.

Bien que, encore une fois, par principe de privilège minimum, vous ne devez définir que Full Controlsi ce Modifyn'est vraiment pas suffisant.

2. Ma question est la suivante: pour le dossier dans lequel je lis et j'écris, dois-je configurer un rôle "Service réseau" avec un accès de contrôle total? Je me demande, puisque mon service utilise la connectivité de la base de données à un autre serveur, si j'ai besoin de la configuration du compte "Service réseau".

Si votre base de données nécessite une connexion Windows Integrated / SSPI, alors oui, vous devrez utiliser NetworkService (ou un compte de service de domaine) partout, c'est-à-dire RunAs et les autorisations de répertoire. En supposant que vous ayez également accordé à votre ordinateur $ ou votre compte de domaine l'accès à cette base de données. Je doute que vous le fassiez, donc s'il utilise l'authentification normale par nom d'utilisateur / pwd, vous devriez pouvoir tout faire avec LocalService. Vous devez accorder un seul droit de compte sur ce répertoire, quel que soit celui que vous utilisez dans vos RunAs, pas les deux.

3.Je peux mal comprendre ce que fait le compte "Service réseau".

LocalService / NetworkService sont des comptes presque identiques sur l'ordinateur local. La différence réside principalement dans ce qu'ils peuvent faire sur le réseau. NS peut accéder à certaines ressources réseau car il apparaît sur le réseau en tant que compte réel (ordinateur). Mais LS apparaîtra comme ANONYME, donc tout ce qui se trouve sur le réseau sera refusé.

Soit dit en passant, vous devez utiliser une tâche planifiée pour cela, pas un service.

* À partir de Vista, en raison de l' isolement des services , un processus LocalService compromis ne peut pas facilement en attaquer un autre. Chaque processus / instance de service LocalService / NetworkService obtient son propre SID de session de connexion unique (propriétaire unique), contrairement à Windows 2003. Mais je ne suis pas sûr que ce soit parfait et atténue complètement la vulnérabilité DACL sur les fichiers et les ressources. Les SID et les jetons restreints en écriture sont mentionnés dans ce contexte.

Amit Naidu
la source
2

Les autres réponses confirment ce que vous dites à propos de l'utilisation du service local. Pour résumer, le service local est le compte recommandé à utiliser avec votre service, sauf si vous avez besoin des fonctionnalités SSPI Active Directory supplémentaires du service réseau.

Pour restreindre l'accès en lecture / écriture à un dossier spécifique, vous pouvez faire mieux que simplement donner l'accès au compte de service local générique. Le problème, comme d'autres l'ont souligné, est que cela donnerait également un accès en lecture / écriture à tous les autres services fonctionnant en tant que service local et si tous les services le faisaient, le service local aurait progressivement accès à des ressources de plus en plus importantes.

La solution consiste plutôt à ACL votre dossier en utilisant votre SID de service spécifique. Seul votre propre processus de service est associé à votre SID de service, ce qui verrouille encore plus votre ressource. Vous pouvez afficher le SID du service à l'aide de sc showsid <service name>. Le SID du service est généré à partir du nom du service, il sera donc le même sur toutes les machines.

Pour activer l'utilisation du SID de service par votre service, utilisez ChangeServiceConfig2avec la SERVICE_SID_INFOstructure à définir SERVICE_SID_TYPE_UNRESTRICTED. Vous pouvez également définir SERVICE_SID_TYPE_RESTRICTEDpour obtenir un SID encore plus restreint qui autorise uniquement l'accès en écriture aux ressources explicitement autorisées avec votre SID de service.

Ce lien contient les descriptions de haut niveau des SID de service et des SID de service restreint: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and- 2008 / hh125927 (v = ws.10)

zhuman - MSFT
la source