如何允许非 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