我正在开发一个代表用户pipe理networking接口的应用程序,它会调用几个需要root进行更改的外部程序(如ifconfig)。 (具体来说就是改变一个本地接口的IP地址等等)。在开发过程中,我一直以root(ugh)的forms运行IDE,并以root身份运行debugging器(double-ugh)。 有没有一种好的方式让最终用户在非root账户下运行这些? 我强烈地不喜欢GTK,wxPython,Python和我的应用程序以root身份运行时提供的攻击面的大小。
我已经看了function,但他们看起来不完整,我不知道我是否能够在Python中使用它们,特别是如果他们在线程的基础上。 我没有探索的唯一select是一个守护进程,它具有setuid位设置,并代表UI的所有根types的东西。 我很犹豫在项目早期就介绍了这种复杂性,因为以root身份运行对于用户来说并不是一个破坏者。
守护进程的想法有很多优点,尽管它引入了复杂性。 只要这些操作不需要以root身份进行某些用户界面交互,守护进程允许您控制允许和不允许的操作。
但是,您可以使用SUDO在ROOT和普通用户之间创建一个受控的折中方案…只需将SUDO访问权限授予所需的特定工具即可。 通过仅允许“允许的”根启动来减少攻击面。
你想要的是一个“小组”
您创建一个组,指定要执行该操作的帐户属于该组,然后指定要访问的资源是该组的成员。
有时小组管理可能有些恼人,但它应该允许你做任何你想做的事情,而这是授权的用户,而不是你的程序。
(如果你想让你的程序获得授权,你可以创建一个特定的用户来运行它,并给这个用户适当的组成员资格,然后在你的程序中对该组执行操作,而不给予正在运行的用户能力。)
您可以为您的应用程序创建和分发selinux策略。 Selinux允许你需要的那种细粒度的访问。 如果你不能或不会使用selinux,那么守护进程就是要走的路。
我不会全程运行应用程序作为根,但你可能想要探索使你的应用程序setuid根,或setuid一些id可以成为根使用像sudo特定的应用程序。 您可能可以设置一个无法登录的帐户,使用setuid来更改您的程序ID(需要的时候暂时),并设置sudo来不提示输入密码,但始终允许访问该帐户以执行特定任务。
这样,你的程序在正常运行时没有特殊的权限,只需要在需要的时候提升它的权限,并且被sudo限制只运行某些程序。
因为我已经做了很多的Unix开发工作,所以我不确定是否可以设置sudo来不提示输入密码(或者即使有一个API),但作为一个后备,你可以只有在需要时才启用setuid。
[编辑]看起来像sudo有一个NOPASSWD模式,所以我认为它应该工作,因为你运行程序作为外部命令。
传统的方法是创建和使用setuid助手来做任何你需要的。 请注意,然而,正确写一个setuid帮手是棘手的(有几个攻击媒介你必须防范)。
现代的方法是使用守护进程(以root用户身份运行,在启动时启动)监听来自应用程序其余部分的请求。 这样,你的攻击面大多局限于你选择的IPC(我建议d-bus,这似乎是现代的方式)。
最后,如果你正在管理网络接口,你所做的和网络管理器在现代发行版上所做的非常相似。 或者尝试以某种方式将你正在做的和网络管理器整合起来(这样就不会和你的操作冲突),或者至少看看它是如何工作的。
“正常”用户和root用户之间没有一个用户。 你有根,然后你有用户; 用户可以具有不同级别的功能。 如果你想要的东西比“普通”用户更强大,但是不像root用户那么强大,你只需要创建一个新的用户来满足你想要的功能,但是不要给它一个你不想拥有的权限。
我对Python并不熟悉,不能用这种语言告诉你必要的命令是什么,但是你应该能够通过分支和使用管道来实现父进程和子进程之间的通信。 有些东西是:
这可能比独立的守护进程更容易编写,而且更便于运行(因为不需要担心守护进程是否正在运行),同时也允许GUI和其他不需要根权力作为非根运行。