我正在尝试为Windows服务设置防火墙规则,以拒绝所有入站和出站TCP和UDP连接,除了使用Windows Service Hardening API的主机和端口白名单之外,请遵循此处的VBScript示例。
现在,这个服务可能产生新的进程(因为它是一个持续的集成构build和testing代理),所以仅仅设置NewOutboundRule.ApplicationName = "%systemDrive%\WINDOWS\system32\svchost.exe"
是NewOutboundRule.ApplicationName = "%systemDrive%\WINDOWS\system32\svchost.exe"
上面 – 我需要一个规则适用于服务运行的所有应用程序。
但是,如果我尝试设置新的入站规则,在INetFw
接口上未指定可选的ApplicationName
属性,则添加新规则的调用将失败(位于上面脚本的wshRules.Add NewOutboundRule
行中)。 其他一切都是正确的,就好像我指定了ApplicationName
,调用成功了。
有什么方法可以创build适用于ApplicationName
所有可能值的规则,或者是一些替代方法吗?
经过一番实验,事实证明,WSH规则是这样工作的:对INetFwServiceRestriction::RestrictService
(带有restrictService=TRUE
)的调用只需要包含被调用来启动服务的主要可执行文件的名称。 如果该进程使用任何其他可执行文件产生新进程,则默认情况下新进程将阻止所有入站和出站网络连接。 即使通过INetFwServiceRestriction::Rules
为主可执行文件添加了异常,情况也是如此。
因此,如果由服务运行的辅助可执行文件需要网络访问,则还需要为这些可执行文件添加显式的INetFwRule
异常。 这很有道理 – 对RestrictService
的调用会阻止所有内容,然后可以添加包含应用程序名称的例外白名单。