在Mac OS X上模拟用户

时间:2012-03-02 16:40:37

标签: macos authentication impersonation

在Windows上,可以使用允许在用户上下文中运行的客户端使用套接字或管道连接到它的服务,然后模拟连接用户以代表该用户执行操作,例如访问文件只有用户有权访问(或确保没有访问其他文件)。

在Mac OS X上完成此操作的等效方法是什么(Linux也很有趣)?我会假设set * uid函数会以某种方式用于此吗?

但是,如何验证我想要模拟的用户并在用户连接套接字时设置uid?

此外,set * uid函数似乎影响整个进程,这使得它们难以在多线程守护进程中使用。在Mac OS X / Linux上,此类服务是否有不同的常用设计模式?

编辑: pmjordan的答案似乎只关注set * uid per-process-only问题,问题How can I pass user credentials through a Unix-domain socket on Mac OS X?似乎通过使用unix域套接字而不是普通套接字来处理实际的身份验证问题。

2 个答案:

答案 0 :(得分:2)

对于OS X细节:你看过Mac OS X的Authentication, Authorization, and Permissions Guide吗?

通常,在类UNIX操作系统中,进程通常由一个特定用户拥有,而他们允许执行的操作主要由此决定。这有一些例外,但一般来说,这个想法倾向于在每个进程的粒度上执行此操作。从好的方面来说,开始新流程非常简单 - 请参阅the fork() function

因此,守护程序(例如 sshd )模拟不同用户的典型方法是将主进程作为 root 运行。然后,接受传入的连接并将它们传递给fork() ed子进程,正如您所说,立即使用set * uid删除权限。如果子进程需要与父进程通信,则可以设置各种进程间通信通道,例如管道。显然,从安全角度来看,代码运行的代码越少越好,因此您需要将子进程作为自治目标。

如果您需要用户实际提供他们的用户名和密码,事情会变得复杂一些;您可能希望查看 su sudo 实用程序的源代码,并阅读特定于平台的身份验证API文档。

答案 1 :(得分:1)

来自Technical Note TN2083 - Apple Developer

在某些情况下,模仿用户是有帮助的,至少就内核的BSD子系统进行的权限检查而言。单线程守护进程可以使用seteuid和setegid来完成此操作。这些设置了整个过程的有效用户和组ID。如果您的守护程序使用多个线程来处理来自不同用户的请求,这将导致问题。在这种情况下,您可以使用pthread_setugid_np设置线程的有效用户和组ID。这是在Mac OS X 10.4中引入的。