Usługi domyślnie uruchamiają się root
w czasie rozruchu na moim urządzeniu RHEL. Jeśli dobrze pamiętam, to samo dotyczy innych dystrybucji Linuksa, które używają skryptów inicjujących w /etc/init.d
.
Jak myślisz, jaki jest najlepszy sposób, aby zamiast tego uruchomić procesy jako (statyczny) użytkownik według mojego wyboru?
Jedyną metodą, do której doszedłem, było użycie czegoś takiego:
su my_user -c 'daemon my_cmd &>/dev/null &'
Ale to wydaje się trochę nieporządne ...
Czy ukryto jakąś magię, która zapewnia łatwy mechanizm automatycznego uruchamiania usług jako użytkownicy inni niż root?
EDYCJA: Powinienem był powiedzieć, że procesy, które uruchamiam w tym przypadku, to skrypty w Pythonie lub programy Java. Wolałbym nie pisać wokół nich natywnego opakowania, więc niestety nie mogę wywołać setuid (), jak sugeruje Black .
Odpowiedzi:
W Debianie używamy
start-stop-daemon
narzędzia, które obsługuje pliki pid, zmienia użytkownika, umieszcza demona w tle i wiele więcej.Nie jestem zaznajomiony z RedHatem, ale
daemon
narzędzie, którego już używasz (które jest zdefiniowane w/etc/init.d/functions
, przy okazji) jest wymieniane wszędzie jako odpowiednikstart-stop-daemon
, więc albo może zmienić uid twojego programu, albo sposób, w jaki to robisz to już jest poprawne.Jeśli rozejrzysz się po sieci, jest kilka gotowych opakowań, których możesz użyć. Niektóre mogą być już zapakowane w RedHacie. Spójrz na
daemonize
przykład.źródło
/etc/init.d/skeleton
. Dodaj zmienne UID, GID i wdo_start()
użyciu:start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $UID:$GID -- $DAEMON_ARGS
daemon()
jest zdefiniowany w/etc/rc.d/init.d/function
obu moich polach RHEL i CentOS.Po przejrzeniu wszystkich sugestii tutaj odkryłem kilka rzeczy, które mam nadzieję będą przydatne dla innych na moim stanowisku:
hop ma rację, wskazując mnie z powrotem
/etc/init.d/functions
:daemon
funkcja pozwala już ustawić alternatywnego użytkownika:Jest to realizowane przez zawijanie wywołania procesu
runuser
- więcej na ten temat później.Jonathan Leffler ma rację: w Pythonie jest setuid:
Nadal jednak nie sądzę, aby można było ustawiać z poziomu JVM.
Ani z wdziękiem
su
nierunuser
obsługuj przypadku, w którym prosisz o uruchomienie polecenia jako użytkownik, którym już jesteś. Na przykład:Aby obejść to zachowanie
su
irunuser
, zmieniłem mój skrypt startowy na coś takiego:Dziękuję wszystkim za pomoc!
źródło
Jeśli zamierzasz napisać własnego demona, to polecam wywołanie setuid (). W ten sposób twój proces może
źródło
Dodam tylko kilka rzeczy, na które trzeba uważać:
źródło
na maszynie wirtualnej CENTOS (Red Hat) dla serwera svn: edytowane,
/etc/init.d/svnserver
aby zmienić pid na coś, co może zapisać svn:i dodana opcja
--user=svn
:Oryginalny plik pid to
/var/run/svnserve.pid
. Demon nie został uruchomiony, ponieważ tylko root mógł tam pisać.źródło
Kilka rzeczy, na które należy uważać:
Generalnie używam / sbin / su, aby przełączyć się na odpowiedniego użytkownika przed uruchomieniem demonów.
źródło
Spróbuj wykonać następujące czynności w skrypcie startowym:
U mnie zadziałało.
źródło
setuid: command not found
Musiałem uruchomić aplikację Spring .jar jako usługę i znalazłem prosty sposób, aby uruchomić to jako określony użytkownik:
Zmieniłem właściciela i grupę mojego pliku jar na użytkownika, jako którego chciałem uruchomić. Następnie dowiązałem symbolicznie ten jar w init.d i uruchomiłem usługę.
Więc:
źródło