Bezpieczne rozgałęzianie niskoprzywilejowanego procesu potomnego za pomocą su vs. sudo

0

Próbuję uruchomić Node.js jako nieuprzywilejowany użytkownik ( dmitry w tym przypadku). Mając nadzieję, że ktoś może potwierdzić lub, jeśli to konieczne, proszę rozwinąć to, co widzę poniżej:

Korzystając z Ubuntu 12.04 i nowszej wersji, napisałem skrypt zadania, który wywołuje:

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

To oświadczenie żyje w pliku o nazwie /etc/init/linkskeeper.conf i wzywam

$ sudo service linkskeeper start

Kiedy sprawdzam procesy, które się pojawiają, widzę:

$ 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

Wydaje się, że początkowy exec wywołanie spawn pid 28349 jako root, który z kolei pojawia się 28350 z kontem nieuprzywilejowanym. Jeśli jest to właściwa narracja, ma to dla mnie sens. Co ciekawe, odniesienie [1] poniżej mówi, że to nie powinno działać na EC2, ale wydaje się działać dobrze.

Następnie dostosowuję exec polecenie do:

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

Otrzymuję następujące informacje:

$ 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

Nie rozumiem, co tu się dzieje z pids 28371, 28372 i 28375. Wszystkie są własnością dmitryi nie rozumiem polecenia wymienionego dla 28372, który zaczyna się kreską.

Powinienem zauważyć, że aplikacja Node.js działa poprawnie z obydwoma wywołaniami.

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

Dmitry Minkovsky
źródło

Odpowiedzi:

1

Linia -su reprezentuje powłokę logowania. Naprawdę nie musisz mieć powłoki logowania, aby uruchomić jedno polecenie. Exec jest używany do zastąpienia bieżącej powłoki i tak. Użyj su bez myślnika lub opcji -l, a linia -su powinna zniknąć.

Na przykład.:

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

Wszystkie procesy są własnością dmitry ponieważ taki jest cel su. Zmienia użytkownika. Sudo jest inny, ponieważ zawsze działa jako root (nie jestem do końca pewien, jak zmieniają się różne osobowości i jak różni się od tego, co robi su).

Ярослав Рахматуллин
źródło
Dziękuję @ Ярослав! Upuszczenie myślnika ( - ) i nie wywołuje nowej powłoki logowania w su polecenie zmienia polecenie pokazane w procesie 28372 powyżej do bash -c /usr/bin/node /home/dmitry/node/linkskeeper/app.js 2>&1 >> /home/dmitry/app.log, co ma więcej sensu niż -su -c składnia, której w ogóle nie rozumiem.
Dmitry Minkovsky
kiedy mówisz „Nie musisz mieć powłoki logowania, aby uruchomić pojedynczą powłokę”, czy masz na myśli „uruchomienie jednego procesu lub polecenia”?
Dmitry Minkovsky
Nps. W składni nie ma nic dziwnego, tak jak chciałem powiedzieć, że nie potrzebujesz dodatkowej powłoki, aby uruchomić jedno polecenie.
Ярослав Рахматуллин
Wreszcie wiesz, czy root rozwidlenie a dmitry proces (za sudo przykład) jest jakoś mniej lub bardziej bezpieczny niż su wariant? Dzięki jeszcze raz.
Dmitry Minkovsky
Naprawdę nie jestem autorytetem w sprawach bezpieczeństwa. Jednym z możliwych problemów z sudo jest to, że pozwala atakującemu uzyskać dostęp roota za pomocą hasła użytkownika, a nie hasła roota, które jest potrzebne, aby stać się rootem z su. Poza tym zakładam, że te dwa są równie bezpieczne.
Ярослав Рахматуллин