正常用户帐户和根目录之间是否存在某些内容?

问题描述:

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

我已经调查能力,但它们看起来半生不熟的,我不知道如果我能在Python中使用,特别是如果他们是一个线程的基础上。我没有探索过的唯一选择是守护进程,它设置了setuid位并代表UI执行所有根类型的工作。我很犹豫在项目早期就介绍了这种复杂性,因为以root身份运行对于用户来说并不是一个破坏者。

你有关守护进程的想法有很大的优点,尽管它引入了复杂性。只要这些操作不需要一些用户界面交互作为根,守护进程允许您控制允许和不允许的操作。

但是,你可以使用sudo来创建ROOT和普通用户之间的受控妥协......只是授予sudo访问到用户的问题,因为他们需要的专用工具。通过仅允许“允许的”根启动来减少攻击面。

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

+0

在我的示例中,如何授予用户执行控制网络接口等功能的能力?或者更一般地说,为了学习向用户授予什么功能,我要查找什么? – 2008-10-29 23:09:03

+0

sudo - 使用sudoers授予对特定程序的访问权限并以root身份运行它们。 – tvanfosson 2008-10-29 23:21:08

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

我不运行应用程序作为专职根,但你可能想探索使您的应用程序是setuid root,或者setuid的一些ID,可以使用类似sudo的针对特定应用成为root。您可以设置无法登录的帐户,使用setuid更改您的程序ID(需要时暂时),并设置sudo以不提示输入密码,但始终允许访问该帐户以执行特定任务。

这样正常运行时,你的程序没有特权,只有提升它的权限,必要时,由须藤仅限于运行某些程序。

因为我已经做了很多的Unix开发,所以我不确定是否可以设置sudo来不提示输入密码(或者即使有API也是如此),但是作为一个后备,你可以启用setuid只在需要的时候才能生根。

[编辑]好像sudo有NOPASSWD模式,所以我认为它应该工作,因为你正在运行的程序的外部命令。

你想要的是一个“集团”

您创建一个组,指定该帐户想要做的动作所属的组,然后指定您希望获得的资源是一个成员组。

有时候分组管理可种刺激,但它应该让你做任何你想要的,这是一个被授权,而不是你的程序的用户。 (如果你想让你的程序获得授权,你可以创建一个特定的用户来运行它,并为该用户提供适当的组成员资格,然后在你的程序中对该组执行操作,以执行操作而不给予运行用户能力。)

我还没有与Python熟悉告诉你必要的命令将在语言的东西,但你应该能够通过派生和使用管道父子进程之间进行通信,以实现这一目标。沿着线的东西:

  • 经由须藤或SUID运行该程序作为根
  • 在启动时,程序立即叉并建立了一个管的父母和孩子之间的通信处理
  • 子进程保留根功率,但只是坐在那里从管
  • 父进程滴根等待输入(改变其UID回到那个运行它的用户),则显示GUI,与用户交互,并处理所有的操作,其可用于非特权用户
  • 当操作要执行需要根特权,(非根)父进程发送一个命令向下管道到(根)子方法,该方法执行它和有选择地报告回父

这可能比独立的守护进程更容易编写,并且运行更方便(因为您不必担心守护进程是否正在运行),同时还允许GUI和其他事物不需要根权力作为非根权限运行。

传统的做法是创建和使用一个setuid帮手做任何你需要的。请注意,然而,正确编写setuid助手很棘手(有几个攻击媒介需要防范)。

现代化的方法是使用一个守护进程(以root身份运行,开始启动),它侦听来自应用程序的其余请求。这样,你的攻击面大多局限于你选择的任何IPC(我建议d-bus,这似乎是现代的方式)。

最后,如果你正在管理网络接口,你在做什么是非常相似的一个现代化的配送所做的网络管理员。或者尝试以某种方式整合你在网络管理器中所做的事情(所以它不会与你的操作冲突),或者至少看看它是如何工作的。