背景:我正在编写一个服务,并希望给它尽可能少的特权。
虚拟帐户(有时称为"虚拟服务帐户")是Windows 7/2008R2的新增功能,文档很少,是为需要最低权限但在域环境中使用计算机标识访问网络的服务自动管理的帐户。
我的服务不需要网络访问,所以我使用LocalService,但我不喜欢这样一个事实,即如果我授予对文件等的访问权限,我就会授予对以该帐户运行的所有服务的访问权限。
有没有我可以使用的最低特权帐户?
您不需要更改服务运行的帐户;LocalService
是好的。
相反,将服务配置为具有非零SID类型,即指定SERVICE_SID_TYPE_UNRESTRICTED
或SERVICE_SID_TYPE_RESTRICTED
。您可以使用ChangeServiceConfig2()函数和SERVICE_CONFIG_SERVICE_SID_INFO
选项来执行此操作。
然后,您可以使用服务SID(其名称为NT SERVICEmyservice
,而不是LocalService
)授予对文件和其他受保护资源的访问权限。这将只允许访问您的服务。(好吧,以及共享同一流程的任何其他服务,但大多数第三方服务都在自己的流程中运行。)
对于最低权限,请使用SERVICE_SID_TYPE_RESTRICTED
。这意味着服务只能访问明确授予访问Everyone
、服务SID、登录会话SID或WRITE_RESTRICTED
的受保护对象。您还应该使用SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO
选项来减少授予服务的权限;许多服务根本不需要任何特权。(在这种情况下,您可能会发现您需要指定SE_CHANGE_NOTIFY_NAME
,而不是一个空列表,尽管我可能记错了。)