Debian - 让服务读取受保护的文件

Debian - 让服务读取受保护的文件

首先,操作系统:Debian 10

我创建了一个在启动时运行的 systemd 服务。它需要能够读取需要保护的文件。如果我错了,请纠正我,但让它以 的身份运行似乎是一种不好的做法sudo,所以我认为这是使用 的好机会sudoers。使用visudo我添加了一个组,并授予它访问文件的权限,将系统用户添加到该组。(我还创建了一个同名的系统组,只是用小写字母,并添加了用户。)

_using visudo_
...
User_Alias            _MY-FANCY-GROUP-NAME_=_system-user-name_
MY-FANCY-GROUP-NAME   ALL=NOPASSWD:/path/to/file

然后我编辑了该服务以以该系统用户的身份运行。

...
[Service]
...
User=_system-user-name_
Group=_my-fancy-group-name_
...

但是,它在启动时失败code=exited, status=1/FAILURE)。我不明白为什么。ls -l显示该服务归以下人员所有root

-rw-r--r-- 1 root root ...

ps似乎说它是由我的用户(不是我创建的系统用户)。

我想这里有两个问题:

1) 我觉得我做错了什么,但我不知道是什么。我在这里做错了什么?

2)对我来说,授予服务访问该文件的权限的最佳方法是什么?

谢谢!

答案1

仅以 sudo 身份运行似乎是一种不好的做法,因此我认为这是使用 sudoers 的好机会。使用 visudo 我添加了一个组,并授予它访问文件的权限。

首先,sudo 和 sudoers 实际上是同一件事。其次,sudoers 的工作方式并非如此。

Sudo 只是一个切换用户账户的工具。这意味着没有“以 sudo 身份运行”之类的事情——如果您使用例如sudo myprogram以 root 身份启动程序,那么它只是以 root 身份运行。

这也意味着 /etc/sudoers才不是实际上授予对文件的访问权限。 sudoers 条目不由内核应用,也不由除“sudo”命令本身之外的任何其他命令应用。并且 sudoers 中列出的别名不会成为系统组 - 它们仅充当同一配置文件中的宏。

/etc/sudoers 中条目所做的唯一一件事是允许指定的用户帐户运行sudo thissudo that- 运行所有的在某些不同的用户帐户下运行程序(通常是 root 但不一定)。

请注意,大多数配置示例并未列出任意文件,而是列出了可执行文件的路径。例如,如果您的 sudoers 文件包含 eg ALL = NOPASSWD: cat /path/to/file,则用户帐户将能够运行sudo cat /path/to/file并读取其标准输出……但它仍然无法读取文件直接地

ls -l 显示该服务由 root 所有:

-rw-r--r-- 1 root root ...

谁拥有 .service 文件并不重要,它们只是保存 systemd 的配置。谁拥有实际的可执行文件也不重要(除非后者设置了“setuid”位,rws但您的情况并非如此)。

对于系统服务('/etc/systemd/system' 中的服务),服务管理器始终只使用中指定的帐户[Service] User=,如果未指定,它将使用 root。

但是 ps 似乎说它是由我的用户(而不是我创建的系统用户)执行的。

systemd 可能仍在使用以前的配置,因为它拒绝加载新配置——它无法验证该组是否确实存在。您只提到将组添加到 /etc/sudoers,但这是错误的位置——系统组只能通过或通过将它们添加到 /etc/group 来my-fancy-group-name创建。groupadd

请注意,systemd 不会自动重新加载更改。如果您之前版本的 .service 文件有,它将保留,直到您运行并重新启动实际服务 - 或者直到您重新启动系统。User=my-usersudo systemctl daemon-reload

2)对我来说,授予服务访问该文件的权限的最佳方法是什么?

chgrp使用或为文件分配一个组chown您实际上已经使用“groupadd”创建了该组,然后您可以将文件 chgrp 到该组并授予其读取权限:

groupadd my-fancy-group-name
chown :my-fancy-group-name /etc/ponies.conf
chmod g+w /etc/ponies.conf

服务的用户帐户不需要是该组的成员,因为您已在服务的 Group= 设置中明确指定了它。但是,如果您确实想将其添加为永久成员,请使用gpasswd -a它(再次编辑 /etc/group)。

如果文件已经分配了另一个组,而您不想更改,您也可以使用文件 ACL。它们的工作原理大致相同,只是可以有多个用户和多个组:

setfacl -m u:system-user-name:r <file>
-or-
setfacl -m g:my-fancy-group-name:r <file>

(小注释:虽然存在 ACL,但传统的“组”权限具有不同的含义,并且要更改传统的权限位,您需要setfacl -m g::rx而不是chmod g=rx例如。)

相关内容