跨服务器监控服务的AD账户

跨服务器监控服务的AD账户

我们有一些运行各种服务的 Windows 服务器,有时这些服务会停止运行。为了监控这些服务,我编写了一个 Windows 服务,它使用 ServiceController 查看可疑服务并检查其当前状态。当我将新服务配置为在具有相关服务器的本地管理员权限的帐户下运行时,这种方法很有效,但从安全角度来看,这并不理想,因为它授予的权限除了查看这些计算机上的服务之外。理想情况下,我希望创建一个 AD 帐户,该帐户可以“查看”和查询所有服务器上的服务(范围中的服务器是一个将来必定会扩大的列表),但在这些服务器上没有其他权限 - 这是否可能,如果可以,这种帐户的设置是什么?

如果这个描述有点模糊,我深表歉意,假设我编写的服务将安装在 ServerA 上,并且需要能够使用 ServiceController 来查询 ServerB 上的服务“MSSQLSERVER”、ServerC 上的服务“MSSQL$OTHERINSTANCE”以及 ServerD 上的服务“SOMEOTHERSERVICE”和“RUNNINGOUTOFIDEAS”。除此之外,要查询的服务列表保存在 ServerZ 上的 MS SQL Server 数据库中,因此该帐户需要能够连接到该服务器上的该数据库,因此,就我的目的而言,它需要是一个标准的 AD 帐户,在 SQL Server 安全性中显示为用户。

有人有什么想法吗?提前感谢任何建议,也感谢您花时间阅读本文。请注意:框架挑战,例如“你为什么要这样做?你应该这样做“ 就像直接回答一样受欢迎,因为我并不确信没有更好的方法,而且我总是乐于学习。

答案1

该帐户将需要在 scmanager 上具有以下访问权限才能远程监控机器的所有服务:

需要注入到当前 scmanager ACL 中的字符串: (A;;CCLCRPRC;;;<AccountSID>)

A: Allow
CC - SC_MANAGER_CONNECT - remotely connect
LC - SC_MANAGER_ENUMERATE_SERVICE - list all services
RP - SC_MANAGER_QUERY_LOCK_STATUS - interogate the status of each
RC - STANDARD_RIGHTS_READ - read the permissions of scmanager and services

ACL 存储在HKLM:\SYSTEM\CurrentControlset\Control\ServiceGroupOrder\Security

您将需要确定 scmanager 上的当前 ACL 是什么,并将上述字符串包含在适当的位置 - 即中间某处,在自由选择 ACL 的末尾和系统 ACL 之前,如下所示:

D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;CC;;;S-1-15-3-1024-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx)(A;;CCLCRPRC;;;<SID goes Here>)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)

根据您部署的方式以及用于自动部署的系统,您可能会发现利用该sc.exe命令更容易。您使用 sc.exe 管理的“服务”实际上不是服务,而是服务控制管理器 (scmanager):

sc.exe sdset scmanager "D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;CC;;;S-1-15-3-1024-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx)(A;;CCLCRPRC;;;<SID goes Here>)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)"


从技术上来说,这是过度的访问,因为它授予帐户查询任何服务(而不仅仅是少数服务)的状态和权限的权限。

相关内容