普通用户账户和root之间有什么吗?

3 投票
7 回答
1363 浏览
提问于 2025-04-11 09:31

我正在开发一个应用程序,用来管理用户的网络接口,这个程序需要调用一些外部工具(比如 ifconfig),而这些工具需要以管理员身份才能进行更改。(具体来说,就是修改本地接口的 IP 地址等。)在开发过程中,我一直以管理员身份运行开发环境(真是让人头疼),调试器也是以管理员身份运行(更让人不爽)。有没有什么好的办法让最终用户在非管理员账户下运行这些程序呢?我非常不喜欢当我的应用程序以管理员身份运行时,GTK、wxPython、Python 以及我的应用程序所带来的安全风险。

我考虑过使用能力(capabilities),但感觉这些东西还不成熟,我不确定在 Python 中是否能用,尤其是如果它们是基于线程的。我唯一没有探索的选项是一个设置了 setuid 位的守护进程,它可以代表用户界面处理所有需要管理员权限的操作。我对在项目早期引入这样的复杂性有些犹豫,因为以管理员身份运行对用户来说并不是一个致命的问题。

7 个回答

1

传统的方法是创建一个特权助手程序来完成你需要的操作。不过,要注意的是,正确编写这样的特权助手程序是很复杂的,因为你需要防范多种攻击方式。

现代的方法是使用一个守护进程(以管理员身份运行,在开机时启动),它会监听来自其他应用程序的请求。这样,你的攻击面就主要限制在你选择的进程间通信方式上(我建议使用d-bus,这似乎是现代的做法)。

最后,如果你在管理网络接口,你所做的事情和现代操作系统中的网络管理器非常相似。最好是尝试将你的工作与网络管理器整合起来(这样就不会和你的操作冲突),或者至少看看网络管理器是如何工作的。

3

你需要的是一个“组”。

你可以创建一个组,然后指定想要执行某个操作的账户属于这个组,接着再指定你想要访问的资源也是这个组的成员。

有时候管理组可能会让人觉得麻烦,但这样做可以让你实现任何想要的操作,授权的是用户,而不是你的程序。

(如果你想让你的程序获得授权,可以创建一个特定的用户来运行它,并给这个用户适当的组成员资格,然后在你的程序中切换到这个组来执行操作,而不需要给正在运行的用户额外的权限。)

7

你关于守护进程的想法很不错,尽管它带来了一些复杂性。只要这些操作不需要以管理员身份进行用户界面的交互,守护进程就可以帮助你控制哪些操作是允许的,哪些是不允许的。

不过,你可以使用SUDO来在管理员和普通用户之间找到一个平衡点……只需给需要特定工具的用户授予SUDO权限。这可以减少安全风险,因为这样只允许“被允许”的管理员操作。

撰写回答