如何在Linux中模拟身份
我开发了一个可以在多个平台上运行的桌面应用程序,使用的是Python和PyQt。在这个应用中,我想实现一个“模拟用户”的功能。具体来说,用户选择一个文件后,应用会检查这个文件的命名规则和其他相关信息。如果一切正常,应用就会把这个文件复制到一个服务器上,只有模拟的用户,比如说(user123),对这个文件有完全的权限,而其他用户只能读取这个文件。
在Windows系统上,我通过使用win32security
和win32con
成功实现了这个功能。
模拟登录的代码
Self.handel=win32security.LogonUser(self.loginID,self.domain,self.password,win32con.LOGON32_LOGON_INTERACTIVE,win32con.LOGON32_PROVIDER_DEFAULT)
win32security.ImpersonateLoggedOnUser(self.handel)
恢复到原用户的代码
win32security.RevertToSelf()
有没有人能给我一些在Linux(RHEL 6)上实现这个功能的建议呢?
1 个回答
1
首先,想想你的任务是否真的需要操作系统级别的身份模拟。
比如,如果你使用 PySmbClient 来访问 Windows 文件共享,那么你可以自己管理所有的连接,只需给 smbclient 提供不同的账号信息就可以了。
如果你使用 PyKDE4.kio,情况也是差不多的(KIO 是用 smbclient 的)。
如果你通过已经存在的系统级挂载来访问文件服务器,那么实际上并没有像 Windows 那样的“身份模拟”;这只是通过改变进程的 “有效用户ID” 来实现的,通常只有当程序拥有 root 权限时才能做到(或者在 Linux 上拥有相当于 root 的 CAP_SETUID 权限)。
uid = pw.getpwnam(username).pw_uid os.seteuid(uid) ... os.seteuid(0)
(不过,这并不保证在存储凭证的内核密钥环中能正常工作……对此我还没有答案。)
然而,大多数桌面程序并没有 root 权限(而且不应该拥有)。在这种情况下,seteuid() 是不可用的,特权操作通常是由一个特权守护进程来完成,桌面应用通过某种形式的进程间通信(通常是 D-Bus)与其联系。