Безопасное разветвление дочернего процесса с низким уровнем привилегий с 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
Похоже, что начальный exec
колл порождает пид 28349
как корень, который в свою очередь порождает 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
Я не понимаю, что здесь происходит с пидс 28371
, 28372
а также 28375
, Все они принадлежат dmitry
и я не понимаю команду, указанную для 28372
, который начинается с тире.
Я должен отметить, что приложение Node.js, кажется, прекрасно работает с обоими вызовами.
Ссылки: [1] https://stackoverflow.com/questions/8312171/can-i-run-node-js-with-low-privileges
1 ответ
Строка -su представляет оболочку входа. Вам не нужно иметь оболочку входа в систему для запуска одной команды. Exec в любом случае используется для замены текущей оболочки. Используйте su без дефиса или опции -l, и строка -su должна исчезнуть.
Например:
# su jaroslav -c 'cowsay $USER: moo'
Все процессы принадлежат dmitry
потому что это цель су. Это меняет пользователя. Sudo отличается тем, что он всегда запускается с правами root (я не совсем уверен, как он меняется, предполагает разные личности и чем это отличается от того, что делает su).