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