suとsudoを使用して、低特権の子プロセスを安全にフォークする


0

Node.jsを非特権ユーザー(dmitryこの場合)として実行しようとしています。誰かが確認できるか、必要に応じて、以下に表示されている内容を詳しく説明してください。

Ubuntu 12.04とupstartを使用して、次を呼び出すジョブスクリプトを作成しました。

exec sudo -u dmitry /usr/bin/node /home/dmitry/node/linkskeeper/app.js >> /var/log/linkskeeper.sys.log 2>&1

このステートメントは、というファイルに存在し/etc/init/linkskeeper.conf、私は呼び出します

$ sudo service linkskeeper start

これが生成するプロセスを調べると、次のことがわかります。

$ ps aux | grep node
root     28349  0.0  0.2  40908  1672 ?        Ss   16:51   0:00 sudo -u dmitry /usr/bin/node /home/dmitry/node/linkskeeper/app.js
dmitry   28350  2.1  2.1 641784 13268 ?        Sl   16:51   0:00 /usr/bin/node /home/dmitry/node/linkskeeper/app.js

最初のexec呼び出しではpid 28349がrootとして生成さ28350れ、次に特権のないアカウントで生成されるようです。これが正しい物語である場合、それは私にとって理にかなっています。興味深いことに、以下の参考文献[1]では、これはEC2では機能しないはずですが、うまく機能しているようです。

次に、execコマンドを次のように調整します。

exec su - dmitry -c '/usr/bin/node /home/dmitry/node/linkskeeper/app.js 2>&1 >> /home/dmitry/app.log'

私は次を取得します:

$ ps aux | grep node
dmitry   28371  0.0  0.2  37952  1312 ?        Ss   16:57   0:00 su - dmitry -c /usr/bin/node /home/dmitry/node/linkskeeper/app.js 2>&1 >> /home/dmitry/app.log
dmitry   28372  0.0  0.2  19516  1712 ?        S    16:57   0:00 -su -c /usr/bin/node /home/dmitry/node/linkskeeper/app.js 2>&1 >> /home/dmitry/app.log
dmitry   28375  3.2  2.6 639748 15916 ?        Sl   16:57   0:00 /usr/bin/node /home/dmitry/node/linkskeeper/app.js

私はPIDをして、ここで何が起こっているか理解していない283712837228375。それらはすべてに所有されており、ダッシュで始まるにdmitryリストされているコマンドがわかりません28372

Node.jsアプリは両方の呼び出しで正常に動作するように見えることに注意してください。

参照:[1] https://stackoverflow.com/questions/8312171/can-i-run-node-js-with-low-privileges

回答:


1

-su行は、ログインシェルを表します。単一のコマンドを実行するためにログインシェルを用意する必要はありません。とにかく現在のシェルを置き換えるためにExecが使用されます。ハイフンまたは-lオプションなしでsuを使用すると、-su行はなくなります。

例えば:

# su jaroslav -c 'cowsay $USER: moo'

すべてのプロセスはdmitry、suの目的であるため所有されています。ユーザーを変更します。sudoは、常にルートとして実行されるため、異なります(変更方法が異なる性格を想定していることと、suが行う方法と異なることは明確ではありません)。


ありがとう@Ярослав!コマンドでダッシュ(-)をドロップし、新しいログインシェルを呼び出さないと、上記のsuプロセスに示されているコマンドがに変わります。これは、まったく理解できない構文よりも理にかなっています。28372bash -c /usr/bin/node /home/dmitry/node/linkskeeper/app.js 2>&1 >> /home/dmitry/app.log-su -c
ドミトリーミンコフスキー

「1つのシェルを実行するのにログインシェルは必要ない」と言うとき、「1つのプロセスまたはコマンドを実行する」という意味ですか?
ドミトリーミンコフスキー

Nps。構文について奇妙なことは何もありません。1つのコマンドを実行するために追加のシェルは必要ないということです。
ЯрославРахматуллин

最後に、プロセスのrootフォークdmitrysudo例ごと)がsuバリアントよりも多少安全かどうかを知っていますか?再度、感謝します。
ドミトリーミンコフスキー

私は本当にセキュリティの問題に関する権限はありません。sudoで発生する可能性のある問題の1つは、suでrootになるために必要なrootパスワードではなく、ユーザーパスワードを使用して攻撃者がrootアクセスを取得できることです。それとは別に、これら2つは等しく安全であると思います。
ЯрославРахматуллин
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.