Windows

用於跨伺服器監控服務的 AD 帳戶

  • August 4, 2021

我們有一些執行各種服務的 Windows 伺服器,有時這些服務會停止。為了監控這些服務,我編寫了一個 Windows 服務,它使用 ServiceController 查看可疑服務並檢查它們的目前狀態。當我將新服務配置為在對相關伺服器具有本地管理員權限的帳戶下執行時,這可以正常工作,但從安全的角度來看,這並不理想,因為它授予權限而不是查看這些機器上的服務。理想情況下,我希望創建一個 AD 帳戶,該帳戶可以“查看”和詢問所有伺服器上的服務(範圍內的伺服器是一個將來必然會擴大的列表)但在這些伺服器上沒有其他權限 - 這是甚至可能,如果是這樣,這樣的帳戶的設置是什麼?

如果這個描述有點含糊,我很抱歉,所以假設我寫的服務將安裝在 ServerA 上,並且需要能夠使用 ServiceController 來詢問 ServerB 上的服務“MSSQLSERVER”,ServerC 上的服務“MSSQL$OTHERINSTANCE”和 ServerD 上的“SOMEOTHERSERVICE”和“RUNNINGOUTOFIDEAS”服務。除此之外,要詢問的服務列表保存在 ServerZ 上的 MS SQL Server 數據庫中,因此該帳戶需要能夠連接到該伺服器上的該數據庫,因此出於我的目的,它需要標準 AD 帳戶,在 SQL Server 安全性中作為使用者可見。

有沒有人有任何想法?提前感謝您的任何建議,並感謝您花時間閱讀本文。請注意:諸如“您為什麼要這樣做?您應該這樣做”之類的框架挑戰與直接回答一樣受歡迎,因為我不相信沒有更好的方法,我總是很高興學習。

該帳戶需要在 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)"


這在技術上是過度訪問,因為它授予帳戶查詢任何服務的狀態和權限的權限,而不僅僅是少數服務。

引用自:https://serverfault.com/questions/1073503