Nodejs:在使用setuid / setgid之后在端口80上监听

我刚刚得到一些互联网文章的说服,使用setuid / setgid切换到较低特权用户可能是重要的。 由于我正在开发一个networking应用程序,我决定去www-data

因此,我使用userid NPM模块来计算www-data的用户和组ID,然后更改为它。 但是,当我这样做 – 而且完全没有关系 – 我得到以下(在这个例子中,安全处理程序在代码的非常非常底部执行):

 2014-09-04T23:07:05.812Z - info: BIRD3 Security -> Changed to www-data:www-data (33:33) events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EACCES at errnoException (net.js:904:11) at Server._listen2 (net.js:1023:19) at listen (net.js:1064:10) at net.js:1146:9 at dns.js:72:18 at process._tickCallback (node.js:419:13) at Function.Module.runMain (module.js:499:11) at startup (node.js:119:16) at node.js:906:3 

正如你所看到的,只要我改变了我的权限级别,它也会降低80端口的可访问性。

有没有办法如何实现安全性,但继续使用端口80,而不使用这样的东西?

你不需要第三方模块来做到这一点。 process.setgid()process.setuid()都接受ID或组名/用户名。

还要确保在端口80上侦听之后放弃权限,并在process.setgid() 之前调用process.setuid()

例:

 var net = require('net'); var srv = net.createServer(function(s) { }); srv.listen(24, function() { console.log('listening'); }); process.setgid('www-data'); process.setuid('www-data'); 

在callback响应中,setgid()和setuid()是否应该在连接之后运行?

  srv.listen(24, function() { console.log('listening'); process.setgid('www-data'); process.setuid('www-data'); });