一个文件想要属于两个用户。如何?硬链接失败

一个文件想要属于两个用户。如何?硬链接失败

两个 setuid 程序/usr/bin/bar/usr/bin/baz共享一个配置文件foo。配置文件的模式是0640,因为它包含敏感信息。一个程序以bar:bar(即,作为用户酒吧,团体酒吧);另一个作为baz:baz.更改用户不是一个选择,甚至改变小组也不是更好的选择。

我希望将单个配置文件硬链接为/etc/bar/foo/etc/baz/foo。但是,这会失败,因为据我所知,该文件必须属于root:barroot:baz.

可能的解决方案:创建一个新组barbaz,其成员为barbaz。让foo属于root:barbaz.

对我来说,这看起来是一个相当严厉的解决方案。有没有更简洁、更简洁的方法来foo在两个程序之间共享配置文件?

目前,我维护着该文件的两个相同的副本。这可行,但显然是错误的。什么才是正确的?

参考信息:我对 Unix 组没什么经验,对 setgid(2) 也没有经验。

答案1

您可以使用 ACL,以便两个组中的人员都可以读取该文件。

chgrp bar file
chmod 640 file
setfacl -m g:baz:r-- file

现在barbaz组都可以读取该文件。

例如,这是 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,其成员为barbaz。让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 软件包。

答案4

我会提交这个,因为它还没有被提及。尽管这可能不是您想要的,但这可能是其他有类似问题的人的答案。

“新”“云”方式是让所有配置由一个配置管理系统(例如厨师,木偶, 或者安西布尔)。服务器上有两个不同但相同的文件并不重要,因为它们都是配置管理系统中单个文件的副本。

这样做的主要优点是您的配置是版本化的(以及所有其他配置),并且部署新的相同或几乎相同的服务器变得如此容易,以至于可以自动化。

(根据记录,由于您没有使用配置管理,所以我会使用组系统,如 @drg 的答案)。

相关内容