我正在用 python 编写一个程序,需要编辑 /etc 中的一些文件。有些系统有自己的系统。由于程序是非交互式的,如何在不运行 sudo 的情况下从程序本身获取这些权限?
还不确定我将在哪里自动启动我的程序,但我可能会使用 monit 或类似的工具来实现此目的。
答案1
解决方案是以 root 身份运行程序本身,从而拥有 /etc 中文件的权限。
答案2
当然有两种可能:
- 将文件的权限降低到用户可以访问的级别
- 增加修改应用程序拥有的权限
关于 1) 您可以尝试通过 ACL 添加额外的权限(我强烈反对更改 UNIX 权限,很多程序都有期望,并且它们将在下一次更新等中更改)。
setfacl -m "u:auto_user:rw" /etc/passwd
(您需要在此文件系统上启用扩展 ACL)
使用这种方法,您可能会面临这些访问权限被其他程序使用的风险。例如:如果您添加 apache 用户以允许修改 /etc/passwd,那么任何获得 apache 用户控制权的人现在都可以篡改此文件。用户帐户的强化程度通常低于根级别访问。
关于 2) 您提升了访问此文件的权限。您可以使用 sudo 和 NOPASSWD 变量来执行此操作,但需要小心设置正确的访问权限。类似的东西
auto_user = NOPASSWD: /bin/sed ... /etc/passwd
不安全(sed 可以生成 shell)!最好的解决方案是编写一个专门的程序,它 a) 过滤输入,b) 完全按照您想要的方式执行。
答案3
任何程序(无论是交互式程序,例如vi
,还是非交互式程序,例如sed
)都有一个有效的用户 ID (EUID),系统使用它来决定它可以访问哪些文件以及可以执行哪些操作(读、写和/或执行) 。 (如果 EUID 与文件所有者不同,还有一组组 ID 用于相同目的。如果 EUID 和任何 GID 都不匹配,则访问由“其他”权限位控制。)
如果您的程序以(EUID 0)运行,root
那么它可以访问任何可以访问的内容,尽管仍然可以将其设置为只读。 (当然,root
可以更改此类事物的权限,因此只读仅是建议性的root
。)
允许访问某些用户或程序但不允许访问所有用户或程序的一种常见方法是将文件的所有者更改为为此目的创建的特殊用户。例如,人们经常创建可以编辑适当配置文件的 Web 管理员或数据库管理员用户。
在您的情况下,您可以创建一个特殊用户,更改应该可访问的文件的所有者/etc
,然后使用su
.
另一种方法是将可编辑文件移动到其他位置,并将符号链接放置到/etc
.
无论您如何操作,您都必须确保可以访问文件的用户/UID/GID 受到信任,无论其功能是什么。例如,您不希望非 root 用户能够编辑密码文件,因为他们可以轻松获得 root 权限。