我正在Linux上使用C编写应用程序。在我的应用程序中,我需要在开始时以普通用户(非root用户)执行一些任务,而在执行过程中也需要以root用户执行一些任务。
顺便说一句,我不能修改普通用户的配置。因此,我无法将普通用户添加到sudoers。我也无法修改任何操作系统配置。
我的应用程序真正要做的是执行应用程序,获取其输出以进行分析。
某些应用程序需要使用root运行。我使用多线程并行执行和分析这些应用程序的输出,然后将每个应用程序的报告存储在称为“报告”的单例中。我execvp
在子流程中使用这些应用程序。
我的应用程序的主要目的是自动化软件测试。并且大多数任务需要在不能为root的软件所有者中运行。
所以,问题是
如何在执行期间切换用户?
无论如何,我可以在1个可执行文件中实现它吗?
使用POSIX API更好。
以普通用户身份运行我的应用程序,为我的应用程序提供root密码,使用root密码切换到root。
Basile Stary.. 5
阅读有关setuid可执行文件以及setreuid(2)和execve(2)系统调用的更多信息。请注意,在更改其所有权(使用chown(1))后,您需要将setuid标志放在chmod u+s
(使用chmod(1))上的可执行文件上,并仔细编码以避免安全漏洞。
(因此,我建议让知道setuid机制并了解安全性问题的人员审查您的代码)
setuid后的基本机制(通过使用su
,sudo
,super
,login
程序以获取(或撤消)的权限等)。请参阅凭据(7)和功能(7)。
启动一些帮助程序进程(以root身份启动,或者在/usr/libexec/
...中启动某个setuid可执行文件),并使用一些进程间通信工具(例如pipe(7) ...)进行通信,可能会更安全。例如,不建议在根进程中使用GUI工具包,例如GTK或Qt。如果您的应用程序具有一些GUI,则可以在非root用户(普通用户)进程中运行其GUI,并以root用户身份运行(希望很小的)帮助程序进程,以完成需要特殊特权的实际工作。
在编码之前,我建议您读一本好书,例如Advanced Linux Programming和syscalls(2)以及您将要使用的每个系统调用的文档。安全方面尤其重要。
Setuid可执行文件不一定需要或使用任何密码。这是另一种方式圆:节目需要密码(特别是login
,su
,sudo
等...)是的setuid(他们是自由软件在Linux上,所以你可以学习他们的源代码); 尝试ls -l /bin/su /usr/bin/sudo /bin/login
检查一下。
由于要模拟各种用户环境,因此请注意environ(7)。
阅读有关setuid可执行文件以及setreuid(2)和execve(2)系统调用的更多信息。请注意,在更改其所有权(使用chown(1))后,您需要将setuid标志放在chmod u+s
(使用chmod(1))上的可执行文件上,并仔细编码以避免安全漏洞。
(因此,我建议让知道setuid机制并了解安全性问题的人员审查您的代码)
setuid后的基本机制(通过使用su
,sudo
,super
,login
程序以获取(或撤消)的权限等)。请参阅凭据(7)和功能(7)。
启动一些帮助程序进程(以root身份启动,或者在/usr/libexec/
...中启动某个setuid可执行文件),并使用一些进程间通信工具(例如pipe(7) ...)进行通信,可能会更安全。例如,不建议在根进程中使用GUI工具包,例如GTK或Qt。如果您的应用程序具有一些GUI,则可以在非root用户(普通用户)进程中运行其GUI,并以root用户身份运行(希望很小的)帮助程序进程,以完成需要特殊特权的实际工作。
在编码之前,我建议您读一本好书,例如Advanced Linux Programming和syscalls(2)以及您将要使用的每个系统调用的文档。安全方面尤其重要。
Setuid可执行文件不一定需要或使用任何密码。这是另一种方式圆:节目需要密码(特别是login
,su
,sudo
等...)是的setuid(他们是自由软件在Linux上,所以你可以学习他们的源代码); 尝试ls -l /bin/su /usr/bin/sudo /bin/login
检查一下。
由于要模拟各种用户环境,因此请注意environ(7)。