向程序授予权限的正确方法

向程序授予权限的正确方法

在工作中,有一个“系统”(python)代理需要执行具有更高级别权限的操作(添加ip路由、设置wifi配置文件、从串行设备读取),但也能够启动该“系统”的其他程序,读/写文件/本地数据库。到目前为止我知道两个选择:

  1. 将更高级别的权限添加到“默认”用户并以普通用户身份启动。 “默认”用户是工程师登录的用户。
  2. 创建一个单独的“测试”用户,并通过创建具有这些权限的新组并将组添加到“测试”用户来添加所需的权限。

据我所知,选项 1 并不是非常“安全”的做事方式。
选项 2 在一般文件权限和启动新终端方面存在困难(X11 显示问题)。如果我确实设法启动这些程序,它们将使用“测试”用户,并且默认用户将无法访问这些程序创建的所有文件。 “系统”还应该能够自动设置该用户,并且代理需要能够通过我们的 UI 启动/停止,因此必须从“默认”用户启动并需要输入密码(或者需要保存在“系统”文件中)。

是否值得这么麻烦地选择选项 2,还是应该选择选项 1?我还应该指出,这个“系统”将在工作中的许多计算机中使用,所以它不仅仅是我的个人计算机。

答案1

尝试下放与操作系统相关的操作(例如配置路由)的权限将需要对文件权限进行大量修改。 OTOH 配置非特权用户访问数据文件的权限是我们每天都会做的事情。

授予程序权限

程序运行所使用的权限是从调用它的用户继承的。有一些例外,但您应该避免它们,直到您对 Linux/Unix 有更多了解(特别是 setuid、MAC 和功能)。

如果您尝试更改权限以允许更改路由,则可能会危及系统的安全性,并且更改可能会在下次应用升级时恢复。

这两个不同的事情需要两种不同的解决方案。

首先,路由和 wifi 配置:为此将 sudo 配置为 root。如果可能,将行为打包到非交互式 shell 脚本中 - 这将有助于防止 sudo 后门。

给“默认”用户

我们不知道“默认用户”在您的系统上意味着什么。

对于数据访问(即不由您的 Linux 发行版维护的文件),您需要定义一个模型来描述应具有不同类型访问权限的用户类别,然后使用标准组来允许该访问。添加与人类不相符的交互式用户帐户是一种反模式。为实际存在的用户添加/删除组。

提示:chmod g+s $DIRNAME将保留在 $DIRNAME 中创建的任何新文件/目录的组所有权。

答案2

我尝试使用chmod g+s $DIRNAME@symcbean,但它只设置文件组,并且我没有找到设置用户的选项。此外,即使组与登录用户相同,iirc 文件仍然以 RO 模式打开。

我关于使用sudo内部 ENV 运行 python 程序的最初声明似乎是错误的,因为我通过提供 python ENV 二进制文件的完整路径成功地做到了这一点。我阅读了 @telcoM 提供的链接并在程序内部执行setegidseteuid这允许程序创建具有调用者权限的文件,并执行需要root.

我遇到的最后一个问题是该程序正在其他终端中启动其他程序,但要么是在看似 root 拥有的 gnome 终端(不同的配置文件并有一个工具栏)中执行的,要么由于 XAUTH 问题根本没有启动。这是通过使用--preserve-env参数来解决的sudo

所以我目前的解决方案是:

  1. 使用启动程序sudo --preserve-env <python_env_binary> <python_program>
  2. (在 python 程序内部)检查是否正在运行sudo并且 env 被保留(检查是否geteuid为 0 并且 $HOME 环境变量不是/root
  3. 从 $SUDO_UID 和 $SUDO_GID 获取调用者 ID
  4. 使用调用者 ID 来设置setegidseteuidGID 优先!)

让我知道这个解决方案是否有意义。

相关内容