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