首先,操作系统: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 this
或sudo 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-user
sudo 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
例如。)