Node Express Unix域套接字权限

时间:2014-01-24 21:30:02

标签: node.js nginx express file-permissions unix-socket

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

  1. 套接字文件在关机时保持存在,因此我必须在重新启动服务器时将其删除,否则我将收到EADDRINUSE错误。
  2. nginx服务器作为nginx用户运行,节点服务器作为节点用户运行。
  3. 当服务器启动时,套接字文件由Express创建,umask将套接字文件的权限设置为755。
  4. setuidgid应用程序将组设置为用户的默认组,在这种情况下都是节点用户名。
  5. 应用程序和daemontools运行脚本的部署脚本在节点服务器实例启动之前执行,因此无法设置文件权限,因为必须在启动过程中重新创建它。
  6. 如果我chgrp和chmod g + w套接字文件,一切正常。有没有办法设置它,以便生成节点应用程序的套接字文件,并使用正确的权限让nginx能够在不损害一个应用程序或另一个应用程序的安全独立性的情况下写入它?我甚至可以将nginx添加到节点用户的组中,如果还有一种方法可以设置套接字文件的权限,那么它就可以组写了。

4 个答案:

答案 0 :(得分:6)

也许我来不及。

作为您自己答案的补充,有一个解决方案,无需将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

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

答案 1 :(得分:3)

我能够通过将nginx添加到节点用户的主要组来实现它:

gpasswd -a nginx node

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

// 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);
  });
});

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

那就是说,我仍然会欣赏任何想法。

答案 2 :(得分:1)

@Bobby的回答让我在nginx中留下了connect() to unix:/run/static0.sock failed (13: Permission denied)。 Chmod 777就是诀窍。这是我的解决方案[建立在他的基础上]:

var fs = require('fs');
var http = require('http');
var process = require('process');
var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

var sock = process.argv[2];

fs.stat(sock, function(err) {
  if (!err) { fs.unlinkSync(sock); }
  http.createServer(app).listen(sock, function(){
    fs.chmodSync(sock, '777');
    console.log('Express server listening on ' + sock);
  });
});

运行如:

$ node server.js /run/static0.sock
Express server listening on /run/static0.sock

答案 3 :(得分:0)

我不知道它是否仍然相关,但我成功连接到unix socket作为节点客户端(服务器在c中)。

对于运行该节点的用户,我只是触及了一个新文件s.sock,当我的服务器启动时,它会监听这个unix套接字。

我的问题是我尝试将服务器作为sudo运行,然后将套接字更改为root权限。

无论如何对我有用的只是运行没有root权限的服务器然后尝试从节点连接到它时我没有。

错误:连接EACCES

希望它有所帮助。