授予非 root 用户对 root 拥有的文件的读取权限?

授予非 root 用户对 root 拥有的文件的读取权限?

如何允许非 root 用户执行的进程读取特定 root 拥有的文件?

我在 Linux/Ubuntu 下运行 node.js。我不想以 root 授权运行我的进程,但必须只读访问几个 root 拥有的文件。

我目前无法读取这些文件(证书密钥文件),除非我通过sudo node ....除了这些文件之外,该进程表现良好,在其自己的应用程序用户 ID 下启动时能够成功运行。

我希望我可以做一些事情,比如为文件设置一个符号链接,设置权限以允许应用程序用户 ID 读取对它们的授权。由于证书文件是由单独的进程自动维护和更新的,因此我宁愿不触摸或复制它们。

...但是“不以 root 身份运行”类别中的任何其他类型的解决方案也受到欢迎。

答案1

您可以添加一个新组,即nodeJS组,将用户添加到该组,然后更改文件的组,最后更改组读取文件的权限。

groupadd nodeJS
usermod userName -g nodeJS
link -s rootOwnedFile linkToRootOwnedFile
chgrp nodeJS linkToRootOwnedFile
chmod g+r linkToRootOwneFile

答案2

这实际上可以通过访问控制列表。这样,即使文件发生更改、添加新文件或文件权限发生更改,您仍然可以使用 Node.js 用户访问它们。只需在证书的父目录上执行以下操作:

setfacl -Rm u:nodeJSUser:rX,d:u:nodeJSUser:rX /path/to/certificates

替代nodeJSUser实际用户。该选项的第一部分-m将设置当前 ACL,逗号后面的所有内容将为新文件设置默认值。-R使其递归。

请注意,如果证书存储在根拥有的目录下且没有执行访问权限(例如chmod 700),则这将不起作用。例如,如果证书存储在/root/certs,因为/root是 chmod 700,则其他用户无法访问该目录内的任何内容,即使他们拥有文件本身的权限。为此,您可以将此目录绑定挂载到另一个目录并从那里访问它。

mkdir /certs
mount --bind /certs /root/certs
setfacl -Rm u:nodeJSUser:rX,d:u:nodeJSUser:rX /certs

相关内容