在工作中,有一个“系统”(python)代理需要执行具有更高级别权限的操作(添加ip路由、设置wifi配置文件、从串行设备读取),但也能够启动该“系统”的其他程序,读/写文件/本地数据库。到目前为止我知道两个选择:
- 将更高级别的权限添加到“默认”用户并以普通用户身份启动。 “默认”用户是工程师登录的用户。
- 创建一个单独的“测试”用户,并通过创建具有这些权限的新组并将组添加到“测试”用户来添加所需的权限。
据我所知,选项 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 提供的链接并在程序内部执行setegid
,seteuid
这允许程序创建具有调用者权限的文件,并执行需要root
.
我遇到的最后一个问题是该程序正在其他终端中启动其他程序,但要么是在看似 root 拥有的 gnome 终端(不同的配置文件并有一个工具栏)中执行的,要么由于 XAUTH 问题根本没有启动。这是通过使用--preserve-env
参数来解决的sudo
。
所以我目前的解决方案是:
- 使用启动程序
sudo --preserve-env <python_env_binary> <python_program>
- (在 python 程序内部)检查是否正在运行
sudo
并且 env 被保留(检查是否geteuid
为 0 并且 $HOME 环境变量不是/root
) - 从 $SUDO_UID 和 $SUDO_GID 获取调用者 ID
- 使用调用者 ID 来设置
setegid
(seteuid
GID 优先!)
让我知道这个解决方案是否有意义。