3

我正在开发一个代表用户管理网络接口的应用程序,它调用了几个需要 root 进行更改的外部程序(例如 ifconfig)。(具体来说,更改本地接口的 IP 地址等)在开发过程中,我一直以 root 身份运行 IDE(呃),以 root 身份运行调试器(double-ugh)。最终用户是否有一种在非 root 帐户下运行这些的好方法?我非常不喜欢 GTK、wxPython、Python 和我的应用程序在以 root 身份运行时所呈现的攻击面的大小。

我已经研究过功能,但它们看起来不成熟,我不确定我是否能够在 Python 中使用它们,特别是如果它们是基于线程的。我没有探索的唯一选项是设置了 setuid 位并代表 UI 执行所有根类型的东西的守护进程。我不愿在项目的早期引入这种复杂性,因为以 root 身份运行对用户来说并不是一个破坏者。

4

7 回答 7

7

尽管它引入了复杂性,但您对守护程序的想法有很多优点。只要这些操作不需要以 root 身份进行一些用户界面交互,守护程序就允许您控制允许和禁止哪些操作。

但是,您可以使用 SUDO 在 ROOT 和普通用户之间创建一个受控的折衷方案……只需将 SUDO 访问权限授予相关用户以获取他们需要的特定工具。通过只允许“允许的”根启动来减少攻击面。

于 2008-10-29T23:11:01.310 回答
3

你想要的是一个“组”

您创建一个组,指定要执行该操作的帐户属于该组,然后指定您要访问的资源是该组的成员。

有时组管理可能有点烦人,但它应该允许你做任何你想做的事情,而且是用户被授权,而不是你的程序。

(如果您希望您的程序获得授权,您可以创建一个特定用户来运行它并为该用户提供适当的组成员资格,然后在您的程序中 su 到该组以执行操作,而不赋予正在运行的用户权限。)

于 2008-10-29T23:11:35.100 回答
1

您可以为您的应用程序创建和分发 selinux 策略。Selinux 允许您需要的那种细粒度的访问。如果您不能或不会使用 selinux,那么守护程序就是您要走的路。

于 2008-10-29T23:10:17.023 回答
1

我不会以 root 身份全时运行应用程序,但您可能想探索使您的应用程序 setuid 成为 root,或者将 setuid 设置为可以使用 sudo 之类的特定应用程序成为 root 的某个 id。您可能可以设置一个无法登录的帐户,使用 setuid 更改程序的 ID(在需要时临时),并将 sudo 设置为不提示输入密码,但始终允许访问该帐户以执行特定任务。

这样你的程序在正常运行时没有特殊权限,只在需要时提升它的权限,并且被 sudo 限制为只运行某些程序。

自从我做了很多 Unix 开发以来已经有一段时间了,所以我不确定是否可以将 sudo 设置为不提示输入密码(或者即使有 API),但作为后备你可以仅在需要时将 setuid 启用为 root。

[编辑] 看起来sudo有一个 NOPASSWD 模式,所以我认为它应该可以工作,因为你将程序作为外部命令运行。

于 2008-10-29T23:10:23.730 回答
1

传统的方法是创建和使用 setuid 助手来做任何你需要的事情。但是请注意,正确编写 setuid 助手是很棘手的(您必须防范多种攻击向量)。

现代方法是使用一个守护进程(以 root 身份运行,在启动时启动),它监听来自应用程序其余部分的请求。这样,您的攻击面主要限于您选择的任何 IPC(我建议使用 d-bus,这似乎是现代方式)。

最后,如果你正在管理网络接口,你所做的与 network-manager 在现代发行版中所做的非常相似。尝试以某种方式将您正在做的事情与 network-manager 集成(这样它不会与您的操作冲突),或者至少看看它是如何工作的,这将是一个好主意。

于 2008-10-30T00:08:28.480 回答
0

没有一个用户介于“普通”用户和 root 之间。你有root,然后你有用户;用户可以拥有不同级别的能力。如果您想要比“普通”用户更强大但不如 root 强大的东西,您只需创建一个具有您想要的功能的新用户,但不要给它您不希望它拥有的特权。

于 2008-10-29T23:06:28.183 回答
0

我对 Python 不够熟悉,无法告诉您该语言中必要的命令是什么,但您应该能够通过分叉和使用管道在父进程和子进程之间进行通信来完成此操作。类似于以下内容:

  • 通过 sudo 或 suid 以 root 身份运行程序
  • 启动时,程序立即分叉并建立父子进程之间通信的管道
  • 子进程保留根权限,但只是坐在那里等待来自管道的输入
  • 父进程删除 root(将其 uid 更改回运行它的用户的 uid),然后显示 GUI,与用户交互,并处理非特权用户可用的所有操作
  • 当要执行需要root权限的操作时,(非root)父进程将命令沿管道发送到(root)子进程,该子进程执行它并可选地向父进程报告

这可能比独立的守护程序更容易编写,并且运行起来更方便(因为您无需担心守护程序是否正在运行),同时还允许 GUI 和其他东西不需要 root 权限以非 root 身份运行。

于 2008-10-30T00:04:26.507 回答