4

http://onteria.wordpress.com/2011/05/31/dropping-privileges-using-process-setuid-in-node-js/で説明されているスキームに従い、ノードをルートとして起動してからダウングレードします。ユーザー。このようにして、プロキシを必要とせずに80でリッスンできます。かなり標準的なもの。プロセスを管理するための起動スクリプトがあります(Ubuntuサーバー)。

upstartスクリプトは、stdout / errをログファイル(rootが所有する)にリダイレクトします。内部的には、winstonを使用してコンソールとファイル(これもrootによって所有されます)にログを記録しています。

私の完璧で幸せな世界では、ダウングレードされたユーザーにログファイル(リダイレクトされたstdout / errとwinstonが作成したものの両方)を透過的にchownすることができます。ノードアプリ内からsetuidしたときに、(素朴に)それらをchownしようとしました。これは機能しましたが、二度と書き込まれないことを意味しました。

どうすればこれを達成できますか?これは可能ですか、それとも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 ロガーに追加します。

最後に、ユーザーをダウングレードしたことをログに記録します。このメッセージは と の両方stdouterr.logに表示されますmylogfile.log

私が望んでいたほど美しくはありませんが (プロセスがルートとして実行されている間はファイルのログが記録されません)、ログ ファイルのセキュリティ保護と管理が容易であることを意味します。

于 2012-08-22T03:09:09.577 に答える