【问题标题】:How can I switch user during execution using C on Linux如何在 Linux 上使用 C 在执行期间切换用户
【发布时间】:2017-10-17 03:24:42
【问题描述】:

我正在 Linux 上使用 C 语言编写应用程序。在我的应用程序中,我需要在开始时以普通用户(非 root 用户)执行一些任务,而在执行过程中我还需要以 root 用户执行一些任务。

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

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

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

我的应用程序的主要目的是自动化软件测试。并且大多数任务都需要在软件所有者中运行,而不是 root。

那么问题来了

  • 如何在执行过程中切换用户?
  • 无论如何我可以在 1 个可执行文件中实现它吗?
  • 使用 POSIX API 更好。
  • 以普通用户运行我的应用程序,为我的应用程序提供 root 密码,使用 root 密码切换到 root。

【问题讨论】:

  • @oakad 谢谢,但是可以用普通用户启动我的应用程序,然后使用 root 密码切换到 root 吗?
  • 不,尽管您可以生成一个以 root 身份运行的单独帮助进程,并通过 IPC 与其通信。一种方法是在帮助程序上设置 setuid 位。使帮助程序尽可能地最小化,只为其提供实际需要 root 访问权限的非常基本的功能,并让您的主应用程序完成其余的工作。
  • 可执行文件或运行它的用户必须设置 CAP_SETUID。对于用户,可以通过认证链中的pam_cap 模块注入能力。对于可执行文件,有一个 setcap 实用程序。
  • @PeterYANG:请编辑您的问题以改进它并详细说明您的申请、动机和背景

标签: c linux posix


【解决方案1】:

详细了解setuid 可执行文件setreuid(2)execve(2) 系统调用。请注意,在更改其所有权(使用chown(1))和仔细编码以避免security holes .

(因此我建议让了解setuid 机制并了解安全问题的人审查您的代码)

Setuid 是获取(或撤销)权限的基本机制(由susudosuperlogin 等程序使用)。见credentials(7) & capabilities(7)

启动一些辅助进程(以 root 身份,或者在 /usr/libexec/ ... 中启动一些 setuid 可执行文件)并使用一些 inter-process communication 设施(如 pipe(7)...)与其通信可能会更安全。例如,不建议在根进程中使用 GTK 或 Qt 等 GUI 工具包。如果您的应用有一些 GUI,那么在非 root(普通用户)进程中运行其 GUI 并以 root 身份运行(希望很小)帮助程序进程来完成需要特殊权限的实际工作是合理的。

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

Setuid 可执行文件不一定需要或使用任何密码;反之亦然:需要密码的程序(尤其是 loginsusudo 等)是 setuid(在 Linux 上它们是 free software,因此您可以学习 他们的源代码);尝试ls -l /bin/su /usr/bin/sudo /bin/login 进行检查。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2023-02-08
    相关资源
    最近更新 更多