c++ - Windows 服务与 NamedPipe 之间的访问安全

标签 c++ security winapi service named-pipes

我有一个 C/C++ Windows 服务实现,它部署在两个不同的服务器上,使用 NamedPipe 以便它们可以相互通信。

我遵循最小权限原则,将服务帐户分配给“NT AUTHORITY/NetworkService”,创建具有“读取权限”(A;OICI;GR;;;NS) 的安全描述符的 NamedPipe,阻止匿名访问,阻止所有内置访客,授予登录用户和管理员组所有权限。

服务给我一个“拒绝访问(0x5)”错误。

这是我尝试过的:

  1. 我试图授予“NetworkService”帐户的所有权限。我知道这很糟糕 :( 但只是想看看它是否有效!访问被拒绝

  2. 允许匿名用户读取权限(我读到“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/

相关文章:

java - 在数据库中安全存储 1 个密码

winapi - 空渲染器不在 graphedit 中

html - 保护纯 HTML 站点的技术

c - 如何解析 “invalid conversion from ' const char *' to ' LPSTR {aka char* }' [-fpermissive] "

c++ - 我可以区分单击和双击系统托盘图标吗?

c++ - 使用 stringstream 精度格式化 float 但丢弃零填充

c++ - 设置控件的背景颜色? (WinAPI)

c++ - 将字符传递给运算符重载的自定义流操纵器

c++ - 自动移动构造函数

c# - 在 .NET/C# 中测试进程是否具有管理权限