Konfigurowanie usługi systemowej do działania z dostępem do konta root

21

Mam usługę w postaci aplikacji node.js skonfigurowanej z Systemd na Raspbian Jessie i używa ona własnego konta użytkownika. Jednak stwierdzam, że usługa nie działa poprawnie, ponieważ nie ma niezbędnych uprawnień. Jeden z zainstalowanych modułów węzła wymaga dostępu do konta root. Jeśli uruchomię aplikację ręcznie za pomocą sudo, wszystko działa dobrze.

Czy istnieje sposób, aby poinformować systemd o uruchomieniu usługi za pomocą sudo?

Łukasz
źródło
2
Jak wygląda plik jednostki, dodaj go do pytania? Zwykle systemduruchamia pliki jednostek z prawami administratora.
Thomas

Odpowiedzi:

31

powiedzieć systemd, aby uruchomił usługę sudo?

sudo nie ma z tym nic wspólnego.

Zazwyczaj instruujesz systemd, aby uruchamiał usługę jako określony użytkownik / grupa z wytycznymi User=i Group=w [Service]sekcji pliku jednostkowego.

Ustaw je jako root (lub usuń, ponieważ domyślnie działa jako root).

HBruijn
źródło
Miałem to skonfigurowane do używania określonego użytkownika, ponieważ korzystałem z przewodnika, aby go skonfigurować. Jednak w moim przypadku nie było to właściwe. Usunąłem to, aby domyślnie działało jako root, a teraz wszystko działa!
Łukasz
2
Uruchamianie jako root to nie to samo, co uruchamianie z User=root. Zobacz moją odpowiedź.
Mark Stosberg
Gdzie można edytować ten plik?
Matthew
15

Aby usunąć, systemdusługi systemowe domyślnie działają jako root, ale nadal istnieje różnica między domyślnym zachowaniem a uruchomieniem usługi systemowej User=root.

Jak udokumentowano w Zmiennych środowiskowych w procesach spawnowanych , zmienne te są ustawiane tylko, jeśli User=są ustawione:

$USER, $LOGNAME, $HOME, $SHELL

Testowałem, aby potwierdzić to odkrycie. Więc jeśli chcesz uruchomić usługę systemową jako root, która potrzebuje jednej z powyższych zmiennych, musisz ustawić User=root.

Mark Stosberg
źródło
Dziękuję Ci! To była jedyna rzecz, która działała dla mnie w aplikacji, którą mam
Pedro Torres
NB Jeśli ustawisz Użytkownik = root powinieneś również ustawić group = korzeń :) superuser.com/a/1452367/39364
rogerdpack
2

rozwiązanie tymczasowe, ale sprawiło, że działało w mgnieniu oka:

/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'

Może działać z użytkownikiem, który ma uprawnienia sudo w pliku jednostki systemowej w następujący sposób:

[Unit]
Description=Rails Webserver
After=syslog.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/var/www/webserver
ExecStart=/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'
Restart=always
KillSignal=SIGQUIT

[Install]
WantedBy=multi-user.target
daino3
źródło
Ma to wiele problemów: po pierwsze, dwie pierwsze odpowiedzi wyjaśniają, dlaczego korzystanie z użytkownika, a następnie sudo jest niepotrzebne, i wskazują właściwy sposób, aby to zrobić. Po drugie, i tak nie powinieneś uruchamiać swojej aplikacji jako root. Po trzecie, twoja aplikacja internetowa powinna znajdować się za normalnym serwerem internetowym, takim jak nginx.
Michael Hampton
Nie będę się z tobą nie zgadzał co do twoich punktów. Ale jeśli ktoś, tak jak ja, chciałby zbudować serwer tak szybko, jak tylko potrafisz, jest to realna opcja, która działa.
daino3,
Prawie tak szybko jak to możliwe. Oczywiście użycie sudonieco spowolni uruchamianie. I to jest niepotrzebne.
Michael Hampton
@MichaelHampton Próbuję napisać backdoor, więc uważam, że ta odpowiedź jest pomocna!
P. Soutzikevich,
1

W tym przypadku uruchom go jako użytkownik systemu. Domyślnie usługa działa jako root.

Umut
źródło