なぜ Upstart ジョブは sudo では動作するのに、setuid では動作しないのでしょうか?

なぜ Upstart ジョブは sudo では動作するのに、setuid では動作しないのでしょうか?

Node.js アプリケーション用の Upstart ジョブがあり、nodeではなくユーザーとして Node を実行するようにしたいと考えています。ジョブ設定で をroot使用すると、ジョブを開始しようとするたびに が表示されます。ただし、 を省略してを使用すると、期待どおりに動作します。setuidmy-app stop/waitingsetuidexecsudo

システム ユーザーとして作成しましたnode。私の知る限り、関連するファイルとディレクトリはすべてそのユーザーからアクセスできます。使用している Upstart のバージョンは 1.12.1 です。

設定setuid:

script
  setuid node
  chdir /var/app/my-app
  exec nodejs server.js
end script

次のような構成と比較するとsudo:

script
  chdir /var/app/my-app
  exec sudo -u node nodejs server.js
end script

setuidUpstart の動作と、sudo一方が失敗して他方が成功する動作との間にはどのような違いがありますか?

答え1

スタンザはブロックsetuid内ではなくscriptグローバルです。これがジョブが失敗する原因である可能性があります。

setuidを使用すると、全てジョブフェーズはユーザーが指定したユーザーとして実行され、変更することはできません。デーモンのみを別のユーザーとして実行したい場合は、これを避けて代わりにsudoを使用してくださいstart-stop-daemon。これは、デーモンをフォークする場合に特に重要です。Ubuntuのアップスタートクックブック詳細については、第11.43.2章を参照してください。

関連情報