我正在为 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 进程的有效用户?
谢谢!