6

要理解我在问什么,区分 Unix 中 SUID 的几种用法很重要。

我有一个项目使用用户 PATH 中的可执行文件,该可执行文件归项目所有,并且设置了 SUID 位。这样,当它运行时,它会在文件所有者的上下文中运行,而不是在调用用户的上下文中运行。通过这种方式,它可以访问用户无法访问的内容,从而通过正常的文件系统保护来保护这些内容不受用户的影响。这工作得相当好。计划是将项目迁移到客户端-服务器架构,但这需要一些时间。同时,如何在 Windows 系统上复制这种行为?

请注意,项目的可执行文件不会调用 SETUID 库调用,但坦率地说,在我看来,考虑到项目的功能,这将是一个很棒的功能。该项目不需要系统根权限。第一个安全问题是它需要保护自己的文件不受用户(只是文件所有者以外的任何用户)的影响,如果它能够切换到“用户上下文”来访问文件,那就太好了系统就好像它是调用用户一样。(通过这种方式,它可以更容易地确定项目可以触摸什么,什么不可以。)

该项目是用 C 和 Java 结合编写的 - 带有 SUID 集的 C 程序调用 Java 代码...

我很想知道所有这些机制,并且特别关注那些:

  1. 适用于 C 和 Java,并且;
  2. 易于为非 Windows 程序员实现,并且;
  3. 需要 Windows 独有的最少编码。

如果某些解决方案更好,请分享您在这方面所知道的任何想法。

笔记:

  1. LogonUser:需要纯文本密码。这怎么可能是答案?
  2. RunAs:需要在提示时输入密码!...与 LogonUser 一样,只会更糟;我不明白这是一个答案。
4

2 回答 2

4

我认为 Windows 中没有 SETUID 的等价物,但您可以以其他用户身份启动进程。如果您使用的是 C,那么您实际上只需要研究两个主要的 Windows 特定功能:

登录用户

CreateProcessAsUser

这些功能的文档非常好,所以它不应该是那么大的挑战。基本上,您将使用 LogonUser 模拟用户,然后使用 CreateProcessAsUser 以该用户身份启动 JVM。

您也可以查看RUNAS命令,但我不确定这是否能满足您的需求。

于 2009-03-16T19:40:21.983 回答
4

Cygwin 对他们如何在不需要用户密码的情况下执行此操作进行了很好的讨论:在 Cygwin 中使用 Windows 安全性

基本上,他们安装了一个自定义 LSA 身份验证包,该包无需密码即可提供安全令牌。作为后备,当未安装身份验证包时,它们使用未记录的 NtCreateToken API。

想要模拟的应用程序可以在调用 java.util 之前进行 cygwin setuid 调用。

于 2012-07-12T00:16:53.133 回答