2014-09-04 70 views
1

我刚刚被一些互联网文章所证实,使用setuid/setgid切换到较低特权用户可能很重要。由于我正在开发一个网络应用程序,我决定去www-dataNodejs:使用setuid/setgid后监听端口80

因此,我使用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端口,而无需使用something like this?

+0

你可以显示你用来侦听和设置gid/uid的代码吗? – mscdex 2014-09-05 03:09:18

+0

@mscdex:Entrence script:http://git.ingwie.me/ingwie/bird3/blob/master/app.js security_handler.js:http://git.ingwie.me/ingwie/bird3/blob/master /lib/security_handler.js 我现在注释了setuid/setgid调用。 – 2014-09-05 18:05:17

回答

1

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

还要确保您要删除的权限侦听端口80和您致电process.setuid()process.setgid()

实施例:

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'); 
+0

我做到了,而且我仍然遇到同样的错误。还哇,不知道本机功能支持。感谢那一个寿。 :) – 2014-09-05 01:59:34

+1

在降低privs之前,你开始了哪个用户?如果您是root用户或等效用户,您将只能在启动时获取端口80,然后在侦听器站起来后删除priv。 – Joe 2014-09-05 03:53:39

+0

@Joe我以root身份启动:root,然后尝试删除www-data:www-data。 – 2014-09-05 20:31:03

0

是不是setgid的()和setuid的()应该连接后运行,回调响应内?

srv.listen(24, function() { 
console.log('listening'); 

process.setgid('www-data'); 
process.setuid('www-data'); 
    }); 
+0

你可以这样链接吗? process.setgid('www-data')。setuid('www-data') – 2017-11-16 05:39:14