两个 setuid 程序/usr/bin/bar
和/usr/bin/baz
共享一个配置文件foo
。配置文件的模式是0640
,因为它包含敏感信息。一个程序以bar:bar
(即,作为用户酒吧,团体酒吧);另一个作为baz:baz
.更改用户不是一个选择,甚至改变小组也不是更好的选择。
我希望将单个配置文件硬链接为/etc/bar/foo
和/etc/baz/foo
。但是,这会失败,因为据我所知,该文件必须属于root:bar
或root:baz
.
可能的解决方案:创建一个新组barbaz
,其成员为bar
和baz
。让foo
属于root:barbaz
.
对我来说,这看起来是一个相当严厉的解决方案。有没有更简洁、更简洁的方法来foo
在两个程序之间共享配置文件?
目前,我维护着该文件的两个相同的副本。这可行,但显然是错误的。什么才是正确的?
参考信息:我对 Unix 组没什么经验,对 setgid(2) 也没有经验。
答案1
您可以使用 ACL,以便两个组中的人员都可以读取该文件。
chgrp bar file
chmod 640 file
setfacl -m g:baz:r-- file
现在bar
和baz
组都可以读取该文件。
例如,这是 bin:bin 拥有的文件,模式为 640。
$ ls -l foo
-rw-r-----+ 1 bin bin 5 Aug 17 12:19 foo
这+
意味着 ACL 已设置,让我们看一下。
$ getfacl foo
# file: foo
# owner: bin
# group: bin
user::rw-
group::r--
group:sweh:r--
mask::r--
other::---
我们可以看到这一行group:sweh:r--
:这意味着组中的人sweh
可以阅读它。
嘿,这就是我!
$ id
uid=500(sweh) gid=500(sweh) groups=500(sweh)
是的,我可以读取该文件。
$ cat foo
data
答案2
您可能需要重新考虑这些陈述:
可能的解决方案:创建一个新组 barbaz,其成员为
bar
和baz
。让foo
属于root:barbaz
.对我来说,这看起来是一个相当严厉的解决方案。有没有更简洁、更简洁的方法来
foo
在两个程序之间共享配置文件?
为何要如此严厉地创建一个新团体?与 ACL 相比,这样做具有以下优点:
/usr/bin/bar
尽管您已将其表述为命令和 的假设/usr/bin/baz
,但这两个程序可以共享配置文件是相关的。这表明这些程序自然相关。为他们创建一个新组似乎描述了一种实际存在的关系,并且应该触发行为(例如读取公共配置文件的权限)。- 通过分组解决这个问题可以移植到每一个Unix,这意味着您可以在任何 Unix 或类 Unix 系统上依赖相同的机制,以完全相同的方式工作。 ACL 要复杂得多,并且可移植性可能是一个问题。
就我个人而言,我认为 ACL 是一种严厉的解决方案,而分组则是更简单、传统的 Unix 方式。
答案3
我认为这将是访问控制列表 (ACL) 的典型用途。将两个用户(或组)添加到配置文件的 ACL:
/etc/foo root:root rw------- # Traditional Unix ownership and permission for foo
$ setfacl -m user:bar:rw- /etc/foo # 允许用户 bar 读写 foo $ setfacl -m user:baz:rw- /etc/foo # 还允许用户 baz 读写 foo
您可能必须先安装 acl 软件包。