在node.js中,我将如何遵循最小特权原则?

想象一下 ,执行两个主要function的Web应用程序:

  1. 从需要更高权限的文件中读取数据
  2. 从需要较低特权的文件中读取数据

我的假设:要允许读取这两个文件,我需要使用可以读取这两个文件的帐户运行节点。

如果节点在可以访问这两个文件的帐户下运行,那么由于Web应用程序代码中存在安全漏洞,不能读取任何需要更高权限的文件的用户可能会读取这些文件。 这将导致我想象中的Web应用程序世界的灾难性后果。

理想情况下,节点进程可以使用一小部分权限运行,然后在访问系统资源之前临时升级这些权限。

问题:节点能否临时升级权限? 或者,还有更好的方法?

如果没有,我正在考虑运行两个不同的服务器(一个具有较高权限,一个具有较低权限),然后在转发请求之前将它们放在代理服务器之后进行身份validation/授权。

谢谢。

       

网上收集的解决方案 "在node.js中,我将如何遵循最小特权原则?"

这确实是一个棘手的案件。 最后文件权限是一种元数据。 我的build议不是直接访问这些文件,而是build立在数据库表格之间的文件之间,或者是将用户types映射到文件的任何东西,以及如果文件存在的话就把文件传送给用户。

这意味着所谓的Web应用程序不能简单地绕过文件系统权限。 你甚至可以设置它,使所说的文件没有服务器可读的权限,而只能在两者之间读取。 它所能做的只是拨打电话,并查看具有给定权限的用户是否可以访问这些文件。 这样,您可以在多个Web应用程序之间共享。 同样因为层之间的内容非常具体,您可以强制执行一组非常有限的调用。

现在,如果一个较低权限的用户以某种方式访问​​一个更高权限的用户帐户,他们将能够看到该文件,并且没有办法真正解决locking用户帐户的问题。 但是这是开发过程的一部分。

不,我怀疑node.js是否可以保证最小特权。

可以想象的是,如果node.js以root身份运行,它可以通过系统调用来操作系统特权,以允许或限制对特定资源的访问,但是再次以root身份运行将会破坏原始目标。

一个可能的解决scheme可能是运行三个节点的实例,一个代理(没有特别的权限)将呼叫引导到一个或另外两个运行在不同权限级别的服务器。 (呃,就像你已经提到的那样,我真的需要在跳入战斗之前阅读post的结尾!)