Node Express Unix域套接字权限

Bob*_*bby 9 file-permissions nginx unix-socket node.js express

我正在运行一个nginx服务器和一个节点表达web服务器,使用daemontools,setup通过Unix Domain Sockets进行通信.只有一些问题:

  1. 套接字文件在关闭时保持存在,因此我必须在重新启动服务器时将其删除,否则我将收到EADDRINUSE错误.
  2. nginx服务器作为nginx用户运行,节点服务器作为节点用户运行.
  3. 当服务器启动时,套接字文件由Express创建,umask将套接字文件的权限设置为755.
  4. setuidgid应用程序将组设置为用户的默认组,在这种情况下都是节点用户名.
  5. 应用程序和daemontools运行脚本的部署脚本在节点服务器实例启动之前执行,因此无法设置文件的权限,因为必须在启动过程中重新创建它.

如果我chgrp和chmod g + w套接字文件,一切正常.有没有办法设置它,以便生成节点应用程序的套接字文件,并使用正确的权限让nginx能够在不损害一个应用程序或另一个应用程序的安全独立性的情况下写入它?如果还有一种方法可以设置套接字文件的权限,那么我甚至可以将nginx添加到节点用户的组中,以便它可以组写.

Pat*_*ron 8

也许我来不及了.

作为您自己答案的补充,有一个解决方案,不必将nginx用户添加到节点组.

仅为套接字文件创建目录,将其分配给节点用户和www-data(或nginx所属的任何组)组,并在该目录上设置group-id位(SGID).

mkdir -p /var/lib/yourapp/socket
chown nodeuser:nginxgroup /var/lib/yourapp/socket
chmod g+rxs /var/lib/yourapp/socket
Run Code Online (Sandbox Code Playgroud)

在此目录中创建的所有文件将自动归nginxgroup组所有.


Bob*_*bby 5

通过将nginx添加到节点用户的主组中,我可以使它工作:

gpasswd -a nginx node
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令启动快递服务器:

// Create the server
fs.stat(listen, function(err) {
  if (!err) { fs.unlinkSync(sock); }
  http.createServer(app).listen(sock, function(){
    fs.chmodSync(sock, '775');
    console.log('Express server listening on ' + listen);
  });
});
Run Code Online (Sandbox Code Playgroud)

我真的不觉得这是一个有效的解决方案,只是破解。Express并不是在考虑删除和设置文件权限的基础上构建的,这尤其使我感到烦恼,不得不将nginx用户添加到节点用户的主要组中。如果nginx帐户遭到破坏,那么可以想象,攻击者可以访问应用程序的所有源代码,并且可以利用套接字尝试对代码进行无休止的攻击。我能做的最好的事情是为节点用户将umask设置为077,并尝试在每个文件上使用chmod 600并在每个目录上使用chmod 700获得100%的覆盖率,或者将组设置为非默认用户。一切。

话虽如此,我仍然会感激任何想法。