普通用户帐户和root之间有什么关系吗?

时间:2008-10-29 23:02:31

标签: python linux root

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

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

7 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

你想要的是一个“小组”

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

有时候,群体管理可能会让人感到恼火,但它应该允许你做任何你想做的事情,而且这是授权的用户,而不是你的程序。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:1)

传统的方法是创建和使用setuid帮助程序来执行您需要的任何操作。但请注意,正确编写setuid帮助程序非常棘手(有几种攻击向量需要防范)。

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

最后,如果您正在管理网络接口,那么您所做的与现代发行版上的网络管理器非常相似。最好是尝试以某种方式将您正在做的事情与网络管理器集成(因此它不会与您的操作冲突),或者至少看看它是如何工作的。

答案 5 :(得分:0)

没有一个用户位于“普通”用户和root之间。你有root,然后你有用户;用户可以拥有不同级别的功能。如果你想要的东西比“普通”用户更强大但不像root那么强大,你只需要创建一个具有你想要的功能的新用户,但是不要给它你不想拥有的权限。 / p>

答案 6 :(得分:0)

我不熟悉Python,告诉你该语言中必要的命令是什么,但你应该能够通过分叉和使用管道在父进程和子进程之间进行通信来实现这一点。有点像:

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

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