是否可以以 root 身份写入/覆盖文件/文件夹而不更改该文件/文件夹的权限?

是否可以以 root 身份写入/覆盖文件/文件夹而不更改该文件/文件夹的权限?

假设我创建了一个系统用户帐户,以便在非 root 身份下运行服务。这些服务访问一些包含许多文件的文件夹,并且系统帐户拥有此文件夹/文件。由于我必须执行一些将更新此文件夹内容的命令,因此我必须使用 root,因为系统帐户无法登录……但这样做,更新/新的文件现在将归 root 所有。并且以系统用户身份运行的服务在尝试访问该文件夹/文件时可能会停止工作。

那么最好的解决方案是什么?每次以 root 身份运行命令后,我都必须重置权限?还是最好将登录和 sudo 权限授予该帐户?或者有没有办法以 root 身份运行命令而不更改现有权限?

希望我的问题清楚。

谢谢

答案1

如果你确实只是想与无法照常登录的另一个用户一起运行 shell,那么可以使用 sudo 甚至 su 轻松完成:

[tom@archlinux ~]$ sudo useradd -r test -s /bin/false
[tom@archlinux ~]$ sudo -u test -s
[test@archlinux tom]$ exit
[tom@archlinux ~]$ 
[tom@archlinux ~]$ su -c "useradd -r test -s /bin/false"
Password: 
[tom@archlinux ~]$ su
Password: 
[root@archlinux tom]# exec su test -s /bin/bash
[test@archlinux tom]$ exit
[tom@archlinux ~]$ 

答案2

如果您更新文件,则不太可能会修改所有权。但是,如果您以 root 身份登录,则可能会对新文件归 root 所有这一想法产生疑问。

一个选项是在文件创建后更改所有权。这可能会造成“竞争条件”,即使风险很小,但如果可能的话,只要不造成不太可能出现的问题,就有合理的理论依据。

另一种选择可能是以 root 身份将所需的新文件作为存档文件上传,然后 chown 该文件,然后以最终用户身份提取该文件。

听起来,认真考虑以您希望文件归其所有的帐户身份登录可能是一个好主意。这样您就不会出现竞争条件。我意识到一般的做法是不希望服务帐户登录。但是您想要做的是通过发明一种解决方法,即以其他用户(root)身份登录,将该一般建议发挥到极致。然后,您会对所采用的方法的逻辑影响产生一些担忧。使用不直接的解决方法可能更容易导致问题,因此比拥有能够登录的帐户更具风险。

作为一般原则,不要将一些普遍适用的建议推向极端,即在所有情况下都严格应用该建议,包括那些可能会造成不必要的重大问题的情况。

请记住,您可能能够登录此帐户,然后使用 sudo,但仍然受到限制。 sudo 可以设置为仅允许特定命令(或以某些特定文本开头的命令)。我有时会创建一个只能使用特定 SSH 密钥登录的帐户,然后可以使用 sudo 并仅运行提供的特定命令。然后可以将运行该命令的控制权交给拥有该安全保护的 SSH 密钥的任何人。

听起来,依赖“组所有者”权限(通常简称为“组权限”)可能对您也有好处。您还可以从使用其他帐户中受益,例如“服务帐户”和“用于更新的帐户”(除了或代替使用众所周知的潜在危险“根”帐户)。

答案3

服务帐户通常没有密码。这可以防止它们被登录,但不一定能阻止访问。常见的访问机制包括:

  • 使用“su”或其变体之一通过根进程(例如 systemd 或启动脚本)启动服务。
  • 使用“cron”执行计划的活动。
  • 添加规则可让特定用户以该用户身份运行命令。这可以限制为特定命令,如 sudo 文档所述。
  • 使用带有授权密钥的 ssh 允许远程(或本地)访问。有机制可以限制可以运行哪些命令以及可以连接的远程位置。
  • 该服务可能为用户提供访问其文件的机制。

如果服务帐户正在运行应用程序,那么该应用程序应该拥有它需要创建或删除文件的任何目录。它还应该对其所需的任何文件具有适当的访问权限。

在您的案例中,我会将存储库上的用户更改为服务帐户,并在该用户处运行拉取请求。或者为了更安全,在与 node.js 运行相同的组中创建第二个服务帐户以拥有文件。然后使用 sudo 拉取文件。

相关内容