如何在Linux上使用C执行切换用户

问题描述:

我在Linux上编写使用C的应用程序。在我的应用程序中,我需要以普通用户(非root用户)开始执行一些任务,而我需要在执行过程中以root用户身份执行一些任务。如何在Linux上使用C执行切换用户

顺便说一句,我不能修改普通用户的配置。所以我不能将普通用户添加到sudoers。我也无法修改任何操作系统配置。

我的应用程序真正做的是执行应用程序,获取其输出以进行分析。

某些应用程序需要以root身份运行。我使用多线程并行执行和分析这些应用程序的输出,然后将每个应用程序的报告存储在称为报告的单例中。我在子流程中使用execvp称这些应用程序。

我的应用程序的主要目的是自动化软件测试。而且大部分任务都需要在软件拥有者中运行,而不是以root身份运行。

那么,问题是

  • 我怎么能在执行过程中切换用户?
  • 无论如何,我可以在1可执行文件内实现这个吗?
  • 用POSIX API做到这一点比较好。
  • 用普通用户运行我的应用程序,向我的应用程序提供root密码,使用root密码切换到root用户。
+1

http://man7.org/linux/man-pages/man2/setuid.2.html – oakad

+0

@oakad谢谢,但是可以用普通用户启动我的应用程序,然后使用root密码切换到root? –

+2

不,尽管您可以产生一个以root身份运行的独立帮助程序进程,并通过IPC与其进行通信。一种方法是在助手上设置setuid位。尽可能减少助手,只给出实际需要root权限的基本功能,让主应用程序完成剩下的工作。 –

了解更多关于setuid可执行setreuid(2)execve(2)系统调用。请注意,在更改其所有权(使用chown(1))和代码仔细以避免security holes后,您需要将setuid标志放置在chmod u+s(请参阅chmod(1))的可执行文件中。

(所以我建议将验证码被人知道setuid机构审查,并意识到安全的重要性)

setuid后的基本机制(由susudosuperlogin等使用... )程序来获取(或撤销)特权。请参阅credentials(7) & capabilities(7)

这可能是更安全的启动一些辅助工艺(如根,或/usr/libexec/ ......也许开始有些setuid的可执行文件),并使用一些inter-process communication设施与它通信(如pipe(7) ...)。例如,不建议在根进程中使用像GTK或Qt这样的GUI工具包。如果您的应用程序具有某些GUI,则在非根(普通用户)进程中运行其GUI并以root身份运行(希望是小型)帮助程序进行真正的工作需要特殊权限是合理的。

在编码之前,我建议您阅读一本好书,如Advanced Linux Programmingsyscalls(2)以及您将使用的每个system call的文档。 Security方面特别重要。

Setuid可执行文件不一定需要或使用任何密码;它是相反的:需要密码的程序(特别是login,su,sudo等)都是setuid(在Linux上它们是free software,所以你可以学习它们的源代码);尝试ls -l /bin/su /usr/bin/sudo /bin/login来检查。

由于您想模拟各种用户环境,请注意environ(7)