我正在为Linux系统开发一个库(CLI程序集)。 我想为库的用户提供一种切换当前有效的用户和组的方法。 主要原因是提供访问控制(某些用户只允许某些操作),其次是以特定的用户来修改文件系统。
我已经确定了两种可能的方法:
1.以root用户身份启动Mono,并调用像seteuid等libc例程
通过设置/ usr / bin / mono的位来实现这一点,然后从我的库中(即在Mono运行时启动之后)设置有效的用户,会在Mono终止时导致崩溃:
使用单声道在Linux中获取MAC地址
NAnt和双平台构build – 在Windows和Mono / Linux上构build的最佳方式
以root身份运行时以用户身份启动外部进程
Process.Start()创build的进程在父应用程序closures时终止
这是Linux 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的有效用户方面可能存在问题,因为它正在pipe理大量资源,并且可能会导致问题发生。
2.在本地守护进程中处理身份validation,不要更改单声道有效用户
我不确定是否有任何现成的解决scheme,但在概念上,我想有一个守护进程作为根运行,库将通信(例如通过POSIX消息队列)来执行身份validation。 守护程序以root用户身份运行,以便能够读取/ etc / shadow。 Mono的有效用户不会改变,但是我的图书馆会跟踪哪个“等效用户”进程正在运行。 不幸的是,这种方法不允许库作为不同的用户访问文件系统。
题
我坚持第二个选项,还是有一些方法来真正改变一个单声道进程的有效用户?
谢谢!
使用Mono 4.3.3在Debian / Jessie上构buildMonoDevelop
在CentOS 5.x / 6.x上安装Mono和Monodevelop
单声道有没有关于ASP.NET的真正的限制?
将Mono应用程序部署到Windows
单声道+ Linux + sqlite->坏习惯 – >导致无法打开数据库文件
以下作品在我的盒子:)
编辑#1:这应该作为根执行。 (片段取自: 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); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。