【问题标题】:Impersonating a user on Mac OS X在 Mac OS X 上模拟用户
【发布时间】:2012-03-21 04:11:02
【问题描述】:

在 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 域套接字而不是普通套接字来解决实际的身份验证问题。

【问题讨论】:

    标签: macos authentication impersonation


    【解决方案1】:

    关于 OS X 的细节:您查看过 Mac OS X 的 Authentication, Authorization, and Permissions Guide 吗?

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

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

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

    【讨论】:

    • 从守护进程创建一个以特定用户身份运行的子进程,似乎是可行的方法。但是我怎么知道要使用哪个 uid?我可能正在尝试做一些应该以不同方式完成的事情 - 我希望守护进程确保它只访问调用用户有权访问的文件,并且我希望用户应用程序能够知道它与以足够权限运行的东西进行通信,可以像我一样运行。也许有其他方法可以做到这一点?
    • 我不太清楚你的意思。 “我希望守护进程确保它只访问调用用户有权访问的文件” - 如果子进程以相关用户身份运行,它只有该用户的权限, except 用于在fork() 期间打开的任何句柄,您可以将其关闭。还是你在问别的?
    • “我希望用户应用程序能够知道它与正在以足够权限运行的东西进行通信,可以像我一样运行。” - 恐怕我根本不明白你对这部分的要求。我认为对你的程序应该做什么给出一个粗略的想法/例子会有所帮助。
    • 对不起,我的解释令人费解...... :) 守护进程以 root 身份运行,打开一个客户端可以连接的套接字。客户希望服务代表他们执行一项任务,该任务需要了解一些不得在用户之间泄漏的每个用户信息。所以我希望守护进程放弃特权,这样客户端就不可能要求它访问除属于启动客户端的用户的文件之外的任何内容。另一方面,客户端(已经可以访问每个用户的信息)不想将信息传输给任何人。
    • 相反,如果守护进程能够对用户进行身份验证,它可以安全地放弃作为该用户的权限并访问包含用户信息的文件。客户端可以放心,因为它从未传输过信息,但守护程序无论如何都能够访问它,因此它必须由具有足够权限的人访问,即代表用户行事的 root。
    【解决方案2】:

    来自Technical Note TN2083 - Apple Developer

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

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多