Bifurcando com segurança um processo filho com pouco privilégio com su vs. sudo

0

Estou tentando executar o Node.js como um usuário não privilegiado ( dmitry neste caso). Esperando que alguém possa confirmar ou, se necessário, por favor, explique o que estou vendo abaixo:

Usando o Ubuntu 12.04 e o upstart, eu escrevi um script de trabalho que chama o seguinte:

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

Esta declaração reside em um arquivo chamado /etc/init/linkskeeper.conf e eu invoco

$ sudo service linkskeeper start

Quando examino os processos que isso gera, vejo:

$ 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

Parece que a chamada exec inicial gera pid 28349 como root, o que, por sua vez, gera 28350 com a conta sem privilégios. Se esta é a narrativa correta, faz sentido para mim. Curiosamente, a referência [1] abaixo diz que isso não deve funcionar no EC2, mas parece funcionar bem.

Depois, ajustei o comando exec para:

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

Eu recebo o seguinte:

$ 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

Eu não entendo o que está acontecendo aqui com pids 28371 , 28372 e 28375 . Todos são de propriedade de dmitry e não entendo o comando listado para 28372 , que começa com um traço.

Devo observar que o aplicativo Node.js parece funcionar bem com as duas invocações.

Referências: [1] link

    
por Dmitry Minkovsky 25.11.2012 / 18:13

1 resposta

1

A linha -su representa um shell de login. Você realmente não precisa ter um shell de login para executar um único comando. Exec é usado para substituir o shell atual de qualquer maneira. Use su sem o hífen ou opção -l e a linha -su deve desaparecer.

Por exemplo:

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

Todos os processos são de propriedade de dmitry , porque essa é a finalidade do su. Isso muda o usuário. O Sudo é diferente porque sempre é executado como root (não sei exatamente como isso muda as diferentes personalidades e como isso é diferente do que o su faz).

    
por 25.11.2012 / 19:03