使用 su 与 sudo 安全地分叉低权限子进程

使用 su 与 sudo 安全地分叉低权限子进程

我正在尝试以非特权用户身份运行 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

看起来初始调用会以 rootexec身份生成 pid ,而后者又会以非特权帐户生成。如果这是正确的叙述,那么对我来说是合理的。有趣的是,下面的参考文献 [1] 表示这在 EC2 上不应该起作用,但似乎可以正常工作。2834928350

然后我将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和 是怎么回事28371。它们都归 拥有,而且我不明白 列出的命令,它以破折号开头。2837228375dmitry28372

我应该注意到 Node.js 应用程序似乎在这两个调用中都能正常工作。

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

答案1

-su 行表示登录 shell。您实际上不需要登录 shell 来运行单个命令。Exec 无论如何都用于替换当前 shell。使用不带连字符或 -l 选项的 su,-su 行应该会消失。

例如:

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

所有进程都归 su 所有,dmitry因为这是 su 的目的。它会更改用户。Sudo 有所不同,因为它始终以 root 身份运行(我不太清楚它如何更改以假设不同的个性,以及这与 su 所做的有何不同)。

相关内容