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

时间:2011-05-15 18:05:24

标签: node.js security

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

  1. 从需要更高权限的文件中提供数据,以便从
  2. 中读取
  3. 从需要较低权限的文件中提供数据,以便从
  4. 中读取

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

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

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

    问题:节点可以临时升级权限吗?或者有更好的方法吗?

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

    感谢。

2 个答案:

答案 0 :(得分:1)

这确实是一个棘手的案例。最后,文件权限是一种元数据。我建议不是直接访问文件,而是在数据库表格形式的文件之间建立一些层,或者将用户类型映射到文件的任何东西,并将文件流传输给用户(如果存在)。

这意味着所谓的Web应用程序不能简单地绕过文件系统权限。您甚至可以设置它,以便所述文件没有服务器可读权限,而只能在层之间读取。它所能做的就是拨打电话,看看具有给定权限的用户是否可以访问这些文件。这使您可以选择在多个Web应用程序之间共享。此外,由于层之间的特殊性质,您可以强制执行一组非常有限的调用。

现在,如果较低特权用户以某种方式获得对较高特权用户帐户的访问权限,他们将能够看到该文件,并且无法真正解决锁定用户帐户的问题。然而,这是开发过程的一部分。

答案 1 :(得分:0)

不,我怀疑node.js开箱即用 - 可以保证最低限度的特权。

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

一种可能的解决方案可能是运行三个节点实例,一个代理(没有特殊权限)来将调用定向到以不同权限级别运行的一个或另外两个服务器。 (嘿,正如你已经提到过的那样。我真的需要在跳入战斗之前阅读帖子的结尾!)