我有一个C / C ++ Windows服务实现,它使用NamedPipe部署在两个不同的服务器上,以便它们可以相互通信。
我遵循最小权限原则,将服务帐户分配给" NT AUTHORITY / NetworkService",使用具有“读取权限”的安全描述符创建NamedPipe。 (A; OICI; GR ;;; NS),阻止匿名访问,阻止所有内置访客,授予所有已登录用户和管理员组的权限。
这些服务给了我一个拒绝访问(0x5)"错误。
以下是我尝试过的事情:
我试图为" NetworkService"提供所有权限。帐户。我知道这很糟糕:(但只是看它是否有效!访问被拒绝
允许匿名用户的读取权限(我读过" NetworkService"帐户向网络上的其他计算机提供匿名凭据)。访问被拒绝
该服务正在使用我的控制台测试应用程序:(但不能与其他服务一起使用。安全性至关重要,我只希望两台服务器能够相互通信。
有谁能告诉我,我是否应该为两台服务器中的每项服务创建一个特定帐户?
服务器不在域中,因此我不确定如何创建网络范围的帐户,或者即使可能。我不太喜欢Windows管理员的东西!
这是让服务相互通信的正确方向吗?
答案 0 :(得分:1)
听起来你有设计问题。
当您编写“使用具有'读取权限'的安全描述符创建NamedPipe”时,问题应该是“读取权限为谁?”。权限总是与受托人联系在一起。
在Windows中,受托人不存在于真空中。它们总是在某种范围内定义。没有中央用户数据库(Active Directory),这将是每台计算机的本地范围。两台计算机拥有截然不同的非重叠托管组。一台机器上的Administrator
与另一台机器上的Administrator
无关。
因此,当您在一台计算机上授予NetworkService
对NamedPipe的所有访问权限时,这可能意味着您从该山姆计算机访问权限中授予了NetworkService
受托者。来自其他计算机的不 NetworkService
!
从根本上说,如果没有主域控制器作为共享权限,two Windows PC's just won't trust each other。每个都是自己的安全机构。