7

我正在为 Linux 系统开发一个库(CLI 程序集)。我想为图书馆的用户提供一种切换当前有效用户和组的方法。主要原因是提供访问控制(某些操作只允许特定用户),其次是允许以特定用户身份修改文件系统。

我已经确定了两种可能的方法:

1. 以 root 身份启动 Mono 并 P/invoke libc 例程,如 seteuid 等

通过设置 /usr/bin/mono 的 s 位然后从我的库中设置有效用户(即在 Mono 运行时启动之后)实现了这一点,导致 Mono 在终止时崩溃:

ERROR:handles.c:1940:_wapi_handle_update_refs: assertion failed: (thr_ret == 0)

Native stacktrace:

mono2 [0x8bb6c]
  /lib/libc.so.6(__default_rt_sa_restorer_v2+0) [0x4020a5a0]
  /lib/libc.so.6(gsignal+0x40) [0x4020920c]

从逻辑上讲,我理解更改 Mono 的有效用户可能会出现问题,因为它正在管理许多资源,并且这样做可能会导致问题。

2. 在本机守护进程中处理身份验证,并且不更改 Mono 有效用户

我不确定是否有任何现成的解决方案,但从概念上讲,我正在考虑以 root 身份运行一个守护进程,该库将与之通信(例如通过 POSIX 消息队列)以执行身份验证. 守护进程以 root 身份运行,以便能够读取 /etc/shadow。Mono 的有效用户不会改变,但我的库将跟踪进程作为哪个“等效用户”运行。不幸的是,这种方法不允许库以不同的用户身份访问文件系统。

问题

我是否坚持第二个选项,或者有什么方法可以真正改变 Mono 进程的有效用户?

谢谢!

4

1 回答 1

5

以下适用于我的盒子:)

编辑#1:这应该以root身份执行。(摘自:http: //msdn.microsoft.com/en-us/library/w070t6ka.aspx

using System;
using System.Security.Permissions;
using System.Security.Principal;

public class ImpersonationDemo
{
// Test harness. 
// If you incorporate this code into a DLL, be sure to demand FullTrust.
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
public static void Main (string[] args)
{
    try {
        // Check the identity.
        Console.WriteLine ("Before impersonation: " + WindowsIdentity.GetCurrent ().Name);

        // Impersonate a user
        using (WindowsIdentity newId = new WindowsIdentity("Your user name"))
        using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
        {
            // Check the identity.
            Console.WriteLine ("After impersonation: " + WindowsIdentity.GetCurrent ().Name);
        }

        // Releasing the context object stops the impersonation 
        // Check the identity.
        Console.WriteLine ("After closing the context: " + WindowsIdentity.GetCurrent ().Name);
    } catch (Exception ex) {
        Console.WriteLine ("Exception occurred. " + ex.Message);
    }
}
}
于 2013-04-29T10:23:20.440 回答