一个文件要属于两个用户。怎么样?硬链接失败


32

两个setuid程序/usr/bin/bar/usr/bin/baz共享一个配置文件foo。配置文件的模式为0640,因为它包含敏感信息。一个程序的运行方式为bar:bar(即,作为用户栏,);另一个为baz:baz更改用户不是一种选择,即使更改组也不可取。

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

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

对我来说,这似乎是一个繁重的解决方案。是否没有更整洁,更简单的方法foo在两个程序之间共享配置文件?

目前,我正在维护文件的两个相同副本。这有效,但是显然是错误的。什么是对的?

有关信息:我对Unix组几乎没有经验,对setgid(2)也没有经验。


这个问题通常是分阶段的。在我的特定情况下,这两个程序恰好是Exim4和Dovecot,这两个邮件处理程序可以共享密码和TLS证书。
thb

8
Ubuntu(&我认为Debian)解决方案是该ssl-cert小组,这几乎就是您的barbaz小组。标准是将所有私钥设置为该ssl-cert组拥有,并将与需要访问它们的程序相关联的UID放入该组中。
abligh

1
@abligh:有趣。我的系统是Debian 8 jessie。显然,存在一个软件包ssl-cert,该软件包的postinst脚本在安装时会创建您要说的群组。我一直不知道ssl-cert建议使用 Apache2(安装在我的主机上)ssl-cert。各种进出口和Dovecot的包不这样做,但后缀(不安装我的主机上)依赖ssl-cert。由于使用Apache,我的主机上确实有一个ssl-cert组,但是该组还没有成员。谢谢你的建议。
thb

5
将程序设置为setgid,而不是setuid。Setuid程序不是一个好主意,因为如果它们遭到破坏,则可以替换二进制文件,从而创建特洛伊木马。(例外:setuid root,因为那里您别无选择。)
Gilles'SO-别再作恶了'

1
wiki.dovecot.org/HowTo/EximAndDovecotSASL是否可以解决您的具体情况?
MvG

Answers:


50

您可以使用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

23

您可能需要重新考虑以下语句:

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

对我来说,这似乎是一个繁重的解决方案。是否没有更整洁,更简单的方法foo在两个程序之间共享配置文件?

为什么要费力地创建一个新小组?与ACL相比,这样做具有以下优点:

  • 尽管您使用命令/usr/bin/barand 将此假设为假设/usr/bin/baz,但是这两个程序可以共享一个配置文件很重要。这表明程序是自然相关的。为他们创建一个新组似乎在描述一种实际存在的关系,并且应该触发行为(例如读取公共配置文件的权限)。
  • 通过组解决此问题对于每个 Unix 都是可移植的,这意味着您可以在任何Unix或类似Unix的系统上依靠相同的机制,以完全相同的方式工作。ACL更加复杂,可移植性可能成为一个问题。

我个人将ACL视为繁重的解决方案,将组视为更简单的传统Unix方式。


16

我认为这将是访问控制列表(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-package。


3

设置文件的模式0660(或即使0440不需要写入)和所有权bar:baz。然后,一个进程可以由于用户权限而访问文件,另一个进程则由于组权限而访问。即使在没有ACL的文件系统上也可以使用。


2

由于尚未提及,因此我将提交。即使这可能不是您想要的,也可能是其他有类似问题的人的答案。

“新”“云”方式是由配置管理系统(例如Chefpuppetansible)处理所有配置。然后,服务器上有两个不同但相同的文件就没关系,因为这两个文件都是配置管理系统中单个文件的副本。

这样做的主要优点是配置已版本化(以及所有其他配置),并且部署新的相同或几乎完全相同的服务器变得非常容易,可以自动进行其他操作。

(记录下来,由于您未使用配置管理,因此我将使用@drg的答案中的组系统)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.