我在Linux上使用C编写应用程序。在我的应用程序中,我需要在开始时使用普通用户(非root用户)执行一些任务,同时我还需要在执行过程中与root用户执行一些任务。
顺便说一句,我无法修改普通用户的配置。所以我无法将普通用户添加到sudoers。我也无法修改任何操作系统配置。
我的应用程序真正做的是执行应用程序,获取其输出以进行分析。
某些应用程序需要使用root运行。我使用多线程并行执行和分析这些应用程序的输出,然后将每个应用程序的报告存储在一个名为Report的单例中。我在子流程中使用execvp
调用这些应用程序。
我的应用程序的主要目的是自动化软件测试。并且大多数任务都需要在软件所有者中运行,而不是root用户。
所以,问题是
答案 0 :(得分:4)
详细了解 setuid可执行文件以及setreuid(2)和execve(2)系统调用。请注意,在更改其所有权(使用chmod(1))和代码后,您需要使用chmod u+s
(请参阅chown(1))将setuid标记放在可执行文件上< / strong>避免security holes。
(所以我建议让知道setuid机制并了解安全问题的人审核您的代码)
Setuid是su
,sudo
,super
,login
等......用于获取(或撤销)权限的基本机制。见credentials(7)&amp; capabilities(7)
启动一些帮助程序进程可能更安全(作为root,或者在/usr/libexec/
中启动一些setuid可执行文件...)并使用一些inter-process communication工具与pipe(7)进行通信} ...)。例如,建议不要在根进程中使用GTK或Qt等GUI工具包。如果你的应用程序有一些GUI,那么在非root(普通用户)进程中运行它的GUI是合理的,并且以root(希望很小的)辅助进程运行,从而完成需要特殊权限的实际工作。
在编码之前,我建议您阅读一本好书,例如Advanced Linux Programming和syscalls(2)以及您将使用的每个system call的文档。 Security方面尤其重要。
Setuid可执行文件不一定需要或使用任何密码;反过来说:需要密码的程序(特别是login
,su
,sudo
等......)是setuid(在Linux上它们是free software所以你可以学习他们的源代码);尝试ls -l /bin/su /usr/bin/sudo /bin/login
检查一下。
由于您要模拟各种用户环境,请注意environ(7)。