nodejs使用setuid从root降级,那么日志文件的所有权呢?

我大致遵循http://onteria.wordpress.com/2011/05/31/dropping-privileges-using-process-setuid-in-node-js/中描述的scheme,从而我以root身份启动节点,然后降级用户。 这样我就可以听80而不需要代理。 很标准的东西。 我有一个暴发户脚本来pipe理进程(Ubuntu服务器)。

upstart脚本将stdout / errredirect到日志文件(由root拥有)。 我在内部使用winstonlogin到控制台和一个文件(它也被root用户拥有)。

在我的完美和快乐的世界里,我将能够透明地将日志文件(包括redirect的标准输出/ err和Winston的)发送给降级的用户。 我试过(天真地),当我从节点应用程序setuid'd,这工作,但意味着他们再也没有写入。

我怎样才能做到这一点? 这是可能的,或者我应该尝试忍受根(至less有一些)拥有的日志文件?

非常感谢!

我最终得到的是彼得·里昂(Peter Lyons)解决scheme的一个版本(我已经从几个地方删除了下面的内容,所以它可能不会真正运行,但这个想法仍然有效):

 var logger = new (winston.Logger)(); logger.add(winston.transports.Console, { timestamp: true }); // start server and downgrade user httpsServer.listen(443, function() { logger.info('Ready on port 443'); fs.stat(__filename, function(err, stats) { fs.chownSync('stdouterr.log',stats.uid,stats.gid); process.setgid(stats.gid); process.setuid(stats.uid); logger.add(winston.transports.File, { filename: 'mylogfile.log', handleExceptions: true }); logger.info('downgraded to non-root uid', {"uid":stats.uid}); }); }); 

当我已经成功绑定到端口443,我login说。 logger是一个winstonlogging器configuration只有控制台输出(通过使用node app.js >> stdouterr.log 2>&1开始节点获取redirect到stdouterr.log文件)。 所以这个日志消息只出现在stdouterr.log

然后我认为当前文件的所有者和chown stdouterr.log被这个用户所拥有。 然后我设置当前进程的gid和uid(丢弃权限部分)。

然后我添加我的文件logging到winstonlogging器。

最后,我login说我已经降级了用户。 此消息出现在stdouterr.logmylogfile.log

不像我所希望的那样美丽(当进程以root身份运行时没有文件logging),但这意味着日志文件很容易保护和pipe理。