【问题标题】:Ask for <strike>root</strike> password to get desired privileges要求 <strike>root</strike> 密码以获得所需的权限
【发布时间】:2013-04-26 07:31:59
【问题描述】:

我正在通过 libkmod (https://github.com/profusion/kmod) 从我的应用程序中加载一个 Linux 内核模块,并且一切正常(因为模块在我想要的时候被加载和卸载),但为此我需要运行我的整个以 root 身份(或特权用户,例如 sudoers)进行编程。 我希望能够以普通用户身份加载应用程序,然后询问 root 用户的密码(用户在 sudoers 中)setuid(0); 只是为了加载模块然后恢复旧的 uid .

我的问题是:如何通过某种 UI 对话框(当我尝试通过 KDE 的控制面板更改某些内容时出现的那个)询问 root用户的密码?

问候

编辑:我不会接受像 system("kdesu/gksu my_app")popen() 和家人这样的方法。我正在寻找一种调用密码提示的编程方式。我也不会接受特定于 DE 的答案(请参阅 kdesu 和 gksu)。我正在寻找适用于每个符合 XDG 的 DE 的东西。最后,不需要密码提示存在。我可以在 Qt 中创建一个简单的对话框并询问密码,然后用它来调用任何接受它的函数,比如setuid('password', 0)

【问题讨论】:

  • -1 您的“不接受”标准表明拒绝理解合理的设计实践以及 unix 风格操作系统的安全性如何工作,特别是进程和安全上下文之间的关联。
  • 我的“不接受”标准表明拒绝做我所要求的糟糕、粗俗和糟糕的方法。不多也不少。我会接受任何适合我需要的答案,或者可以解释为什么我所问的问题是不可能的答案。
  • 您最好考虑一下使用密码实际上可以做什么。内核一点也不关心密码。相反,密码所做的只是(如果它检查的话)说服现有的 setuid 可执行文件(例如 loginsudo)以给定的潜在不同用户身份启动 shell 或其他请求的进程,例如超级用户。所以最终,你将不得不执行一些 setuid 程序来做你想做的事。自己获取用户密码不会改变这一点,而且这是不好的做法。

标签: c++ c linux permissions linux-kernel


【解决方案1】:

仅仅知道用户的密码对于调用setuid 没有用处,因为您需要CAP_SETUID 权限来更改uid(这通常意味着您需要是root 用户)。

请注意,如果您有CAP_SETUID 权限,则不需要用户密码;任何密码检查都必须由调用setuid的程序完成。


让您的程序加载内核模块的“正确”方法是编写一个简单的帮助程序,该程序什么都不做,只是加载模块,并将该帮助程序安装为 set-user-ID-根。

【讨论】:

  • 好的,我也在考虑其他可以加载内核的东西,仅此而已,但这让我想知道另外两件事。 a)我怎样才能调用其他二进制文件?通过系统()(或家庭)? b) 其他二进制文件将如何获得权限以加载内核?通过 chown 根; chmod ugo+xs?
  • a) 使用任何可行的方法(系统、fork+exec、posix_spawn 等)。 b) 这就是我所说的 set-user-ID-root 的意思。
  • 好的,这将是后备(至少现在)。谢谢你的回答。如果我没有其他选择,我会接受并给你+50。我真的很希望能够在我的代码中获得特权,而不必 chown/chmod 任何二进制文件。
  • 操作系统是故意设计的,因此获得权限需要CAP_SETUID;其他任何事情都会颠覆整个安全机制。
  • @alexandernst - 这就是你对 unix 缺乏了解的地方。整个要点是,只有当它们已经被授予程序时,您才能获得特权。通常,这是通过执行 setuid 可执行文件(其中预先存在的授权与可执行文件相关联)或执行 setuid 可执行文件来完成的,该可执行文件将依次执行您的程序。任何让现有的、以前没有特权的进程切换到以 root 身份执行的东西都被归类为“错误”并以高优先级进行修补。
【解决方案2】:

您可以使用pam 进行身份验证。示例http://www.freebsd.org/doc/en/articles/pam/pam-sample-appl.html

【讨论】:

  • Arch 中没有这样的包可以提供“openpam.h”。你如何编译它?但无论如何,更进一步,我看不出这对我有什么帮助。这只是运行 exec()(与 system() 几乎相同,但有一些小的变化)。我不想想运行一个shell命令,我想在我的代码内部获得适当的权限。
  • 另外,为了确定……这是否需要将二进制文件改成root并设置+s?如果是这样,这真的不是我想要的。
【解决方案3】:

您不想询问 root 密码。我曾在没有 root 访问权限的系统上工作,但我确实拥有 sudo 权限。这并不少见 - 特别是如果 sudoers 设置为仅允许一小组命令。

这就是sudo(它是图形用户界面的朋友)的用途。如果用户无法进入sudoers 文件,则他无权知道root 的密码。如果系统上没有sudo,那么它可能应该有它 - 这是一个比使用root 作为所有用户的更安全的解决方案。在我的家用计算机上,我每天都使用sudo,但我很少以root 登录。我认为这正是应该的。

【讨论】:

  • 对不起,我解释错了。其实我不想问root的密码,而是要用户的密码(假设他已经在sudoers中)
  • 因此,请使用sudo 或图形变体之一。没有充分的理由去做其他事情。
  • 我不希望我的整个应用程序在 sudo 模式下运行。我只想获得 sudoers 权限一秒钟,有足够的时间做我想做的事,然后回到有限的用户权限。
  • 请记住,如果应用程序正在执行setuid(或其中一个朋友),则需要由具有root 权限的人安装,我不完全确定我们有什么问题'重新尝试在这里解决。应用程序本身需要在 root 权限下运行,或者它可以安装为只能由某些用户运行。这还不够好吗?它适用于许多其他类型的应用程序。
  • 是的,我明白这一点。检查如何做到这一点的方法是查看这些工具如何做到这一点[如上面评论中所建议的那样],或者 sudo 如何工作(也有类似的事情)。如果系统配置工具实际上不仅仅是调用sudo,我会感到非常惊讶,但我从未看过源代码,所以我不能说。
【解决方案4】:

嗯,我不确定 KDE,但 Gnome 的版本是 /usr/bin/gksudo。这具有您的 gnome 密钥环的额外优势,它可以(根据您的配置方式)将该密码缓存 30 分钟或一些这样的时间,这样您就不必重复输入它。请注意,您必须在/etc/sudoers

【讨论】:

  • 好吧,假设我已经在 sudoers 中,我该如何调用 gksudo?我想避免system("gksudo .....");,因为那真的很难看。
  • @alexandernst,使用管道?
  • @AnishRam 我不确定你的意思。管道在这里有什么帮助?
  • 您需要运行gksudo 命令。因此,使用popen 命令,指定gksudo 作为命令,使用fgets 或类似的命令来读取输出并解析它。
  • 如果您的应用程序不是 Gnome 之一,您不想依赖 gksudo。 KDE 有/usr/lib/kde4/libexec/kdesu/usr/bin/kdesudo。然而,最安全的方法是查看那些 KCM 模块或 PartitionManager 的源代码,它们以类似的方式请求 root 权限
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
相关资源
最近更新 更多