在 Mac OS X 上模拟用户

vil*_*pam 6 authentication macos impersonation

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

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

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

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

编辑:pmjordan 的回答似乎解决了 set*uid per-process-only 问题,以及如何通过 Mac OS X 上的 Unix 域套接字传递用户凭据的问题似乎通过使用 unix 域套接字而不是普通套接字来解决实际的身份验证问题。

pmd*_*mdj 2

对于 OS X 的具体信息:您是否看过Mac OS X 的身份验证、授权和权限指南?

一般来说,在类 UNIX 操作系统中,进程通常由一个特定用户拥有,并且它们被允许执行的操作主要由该用户决定。虽然有一些例外,但一般来说,这个想法往往是在每个进程的粒度上执行此操作。从好的方面来说,启动新流程确实很容易 - 请参阅fork()功能

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

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