当前位置 : 主页 > 网页制作 > Nodejs >

node.js – nodejs使用setuid从root降级,日志文件所有权怎么样?

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

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

在我完美和快乐的世界中,我将能够透明地将日志文件(重定向的stdout / err one和winston制作的)文件chown给降级的用户.当我从节点应用程序内部进行setuid时,我已经尝试过(天真地)chowning它们,但这意味着他们再也没有写过.

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

非常感谢!

我最终得到的是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记录器,仅配置了控制台输出(通过使用节点app.js>> stdouterr.log 2>& 1)启动节点将其重定向到stdouterr.log文件.因此,此日志消息仅出现在stdouterr.log上.

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

然后我将我的文件记录添加到winston记录器中.

最后,我登录说我降级了用户.此消息显示在stdouterr.log和mylogfile.log中.

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

网友评论