【问题标题】:How can I access files of different users and retain permission restrictions in Linux using Node.JS?如何使用 Node.JS 在 Linux 中访问不同用户的文件并保留权限限制?
【发布时间】:2014-10-26 13:41:51
【问题描述】:

我正在尝试在 Node.JS 中重新实现现有的服务器服务。该服务可以比较与经典 FTP 服务器:经过身份验证的用户可以读取/创建/修改文件,但仅限于授予匹配系统用户名的权限。

我很确定我不能让 Node.JS 以 root 身份运行并使用 seteuid() 或类似方法切换用户,因为这会破坏并发性。

相反,我可以让我的 Node.JS 进程以 ROOT 身​​份运行并在访问文件时手动检查权限吗?我正在考虑一些系统调用,例如“could user X create a file in directory Y?

否则,我可以通过使用用户组来解决这个问题吗?请注意,服务必须能够删除/修改由真实系统用户创建的文件,这可能不会设置特殊组,以便服务可以访问该文件。

【问题讨论】:

    标签: linux node.js


    【解决方案1】:

    以 root 身份运行节点听起来很危险,但我认为您没有太多选择。出于同样的原因,大多数 FTP 服务器也以 root 身份运行。不过,这意味着您需要非常注意要运行的代码的安全性。

    现在问题来了:

    您在问是否可以在 node.js 中重新实现 UNIX 权限控制。是的,你可以,但不应该!几乎 100% 的机会你会留下漏洞或错过 Unix 核心已经处理好的边缘情况。

    请改用您提到的process.setuid(id)。它不会破坏并发性,但是您现在需要考虑并行并发而不是异步。这是一项额外的工作,但会让您摆脱重新发明 Unix 安全性的头痛。

    或者,如果您要对文件系统进行的所有操作都涉及 shell 命令,那么您可以简单地将它们修改为以下模式:

    runuser -l  userNameHere -c 'command'
    

    【讨论】:

    • 使用process.setuid() 强制我在文件操作期间锁定整个进程,这不是一个选项,因为该服务必须每秒处理由几百个长寿命引起的几百个操作当代联系。我明白你关于重新实现权限轮的观点,但是如果有一个 O/S 函数来解决这个问题,我的问题就会得到解决(但是没有,AFAIK)。
    • 您会为每个连接的用户生成一个新进程,就像过去的美好时光一样。.. :) FTP 服务器就是这样做的,我怀疑是否有解决方法。
    • 这将是困难的,因为该协议是基于 UDP 的...... :-/ 还是谢谢。
    • 可能值得考虑下一个架构:将您的操作代码与服务器分开。以异步方式保持网络代码,像你一样做所有常规的事情。然后,一旦您想要“将目录列为用户 A”,向您的操作模块发送一个异步调用,该模块将从池中提取必要的进程(用户 A 拥有的进程),如果没有,则生成。执行操作,完成后,完成异步调用。这实际上是您在这里遇到的一个有趣的挑战:)
    • 那是个好主意。问题是,这意味着这是一个分布式系统,在多个服务器上具有多个进程来处理负载。整个事情都是关于读取/写入大量文件(实际上是与数据采集设备交换数据),这意味着添加另一层将非常低效。在那种情况下,我宁愿自己做一些基本的权限检查......:-/
    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2012-04-17
    • 2023-03-29
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多