4

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

upstart 脚本将 stdout/err 重定向到日志文件(由 root 拥有)。在内部,我使用 winston 登录到控制台和一个文件(该文件也归 root 所有)。

在我完美而快乐的世界中,我将能够透明地将日志文件(重定向的 stdout/err 和 winston 制作的)透明地发送给降级的用户。当我从节点应用程序内部进行设置时,我尝试(天真地)咀嚼它们,这有效,但意味着它们再也不会被写入。

我怎样才能做到这一点?这是可能的还是我应该尝试使用(至少一些)root 拥有的日志文件?

非常感谢!

4

1 回答 1

1

我最终得到的是 Peter Lyons 解决方案的一个版本(我已经从几个地方剪切了以下内容,所以它可能实际上并没有运行;这个想法虽然有效):

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 时,我会记录下来。logger是一个仅配置了控制台输出的 winston 记录器(通过使用启动节点将其重定向到 stdouterr.log 文件node app.js >> stdouterr.log 2>&1)。所以这个日志信息只出现在stdouterr.log.

然后我确定当前文件的所有者并 chown stdouterr.log 由该用户拥有。然后我设置当前进程的gid和uid(删除权限部分)。

然后我将我的文件日志添加到winston logger。

最后,我登录说我已经降级了用户。此消息同时出现在stdouterr.logmylogfile.log中。

不像我希望的那么漂亮(进程以 root 身份运行时没有文件日志记录),但这意味着日志文件易于保护和管理。

于 2012-08-22T03:09:09.577 回答