Windows - 使用本地服务和/或网络服务帐户作为 Windows 服务

Windows - 使用本地服务和/或网络服务帐户作为 Windows 服务

我创建了一个窗口服务,用于监控 Windows 操作系统上特定目录中的文件。检测到文件时,该服务会执行一些文件 I/O、读取文件、创建子目录等。此服务还使用数据库连接来连接到另一台服务器。我的计划是让该服务作为默认的“本地服务”帐户运行。由于我需要允许写入/读取权限,而“本地服务”帐户显然默认不具备此权限,因此我将明确为“本地服务”帐户在读取/写入的文件夹上设置“完全控制”权限。

我认为以上内容很好。我的问题是,对于我正在读取和写入的文件夹,我是否需要设置具有完全控制访问权限的“网络服务”角色?我想知道,由于我的服务使用与另一台服务器的数据库连接,我是否需要设置“网络服务”帐户。

我可能误解了“网络服务”帐户的作用。

答案1

NT AUTHORITY\NetworkService帐户仅当您与域中需要您的计算机凭据进行访问控制的其他计算机通信时才需要。简单的 Internet/网络访问不需要它。它仅在 Active Directory 域中用于特定目的时才是必要的。

也是NT AUTHORITY\LocalService帐户是它在系统上具有最低权限。赋予它更多权限会降低系统上许多服务的安全性,这些服务旨在以它旨在提供的低权限级别运行。如果您的服务需要高于这些权限的权限,您应该为其创建一个具有必要权限的新帐户,并将该帐户设置为登录服务属性选项卡。(这也可以通过编程完成。)

您也可以使用NT AUTORITY\LocalSystem帐户,它可以无限制地访问您的系统,但我认为您想使用该LocalService帐户来提高其安全性。

答案2

其他答案证实了您关于使用本地服务的说法。总而言之,除非您需要网络服务的额外 Active Directory SSPI 功能,否则建议使用本地服务帐户来与您的服务一起使用。

不过,要限制对特定文件夹的读/写访问权限,您可以做得比仅授予通用本地服务帐户访问权限更好。正如其他人指出的那样,问题在于,这也会授予以本地服务身份运行的所有其他服务的读/写访问权限,如果所有服务都这样做,那么本地服务将逐渐获得对越来越多重要资源的访问权限。

解决方案是使用您的特定服务 SID 为您的文件夹设置 ACL。只有您自己的服务进程才与您的服务 SID 相关联,因此这会进一步锁定您的资源。您可以使用 查看服务 SID sc showsid <service name>。服务 SID 是根据服务名称生成的,因此在所有计算机上都是相同的。

要启用服务 SID,请ChangeServiceConfig2使用SERVICE_SID_INFO结构进行设置SERVICE_SID_TYPE_UNRESTRICTED。您还可以设置SERVICE_SID_TYPE_RESTRICTED获取更受限制的 SID,该 SID 仅允许对服务 SID 明确允许的资源进行写访问。

此链接包含服务 SID 和受限服务 SID 的高级描述: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/hh125927(v=ws.10)

答案3

先前的回答似乎没有直接回答这些问题,所以我想我应该补充一些。

  1. 我的计划是让该服务作为默认的“本地服务”帐户运行。我将明确为“本地服务”帐户对我读取/写入的文件夹设置“完全控制”权限。我相信以上是一个好计划。

就我个人而言,我认为这个计划没什么大问题。使用 BUILTIN 时,可以选择以下方案:

  1. 以 LOCALSYSTEM 身份运行 - 因此,如果此服务受到威胁,攻击者将拥有一切,并立即。
  2. 以 LOCALSERVICE 身份运行 - 因此,如果此服务或在此帐户下运行的许多其他服务中的任何一个受到损害,攻击者就可以访问一个额外的目录。*

可以说,添加一些额外的 ACL 以便能够使用第二种选择是更好的选择。是的,对于低权限但高度安全敏感的服务来说,最安全的选择是在定制的低权限服务帐户下运行。但除非您想为部署的每项服务创建新帐户/管理密码,否则使用 LocalService 执行次要的非敏感任务并不是一件可怕的事情。您只需根据这些考虑做出负责任的决定,例如该目录或数据库中的内容、如果它们被破坏会产生什么影响等。

尽管如此,按照最小特权原则,您只应在确实不够的Full Control情况下进行设置。Modify

2.我的问题是,对于我正在读取和写入的文件夹,我是否需要设置具有完全控制访问权限的“网络服务”角色?我想知道,由于我的服务使用与另一台服务器的数据库连接,我是否需要设置“网络服务”帐户。

如果您的数据库需要 Windows Integrated/SSPI 登录,那么是的,您需要在任何地方使用 NetworkService(或域服务帐户),即 RunAs 和目录权限。假设您还授予了您的 computername$ 或域帐户对此数据库的访问权限。我怀疑您是否这样做了,因此如果它使用正常的用户名/密码身份验证,您应该能够使用 LocalService 执行所有操作。您只需授予该目录的一个帐户权限,无论您在 RunAs 中使用哪个,而不是同时授予两者。

3.我可能误解了“网络服务”帐户的作用。

本地服务/网络服务是本地计算机上几乎相同的帐户。主要区别在于它们在网络上可以执行的操作。NS 可以访问一些网络资源,因为它在网络上显示为真实(计算机)帐户。但 LS 将显示为匿名,因此网络上的几乎所有操作都会被拒绝。

顺便说一句,您应该为此使用计划任务,而不是服务。

*从 Vista 开始,由于服务隔离,一个受感染的 LocalService 进程无法轻易攻击另一个进程。与 Windows 2003 不同,每个 LocalService/NetworkService 服务进程/实例都有自己独特的登录会话 SID(唯一所有者)。但我不确定这是否完美,是否完全缓解了文件和资源上的 DACL 漏洞。受限 SID 和 写限制令牌在此上下文中被提及。

相关内容