Рекомендуется запускать службу Linux от имени другого пользователя
службы по умолчанию запускаются как root во время загрузки на моем поле RHEL. Если я правильно помню, то же самое верно и для других дистрибутивов Linux, которые используют сценарии инициализации в /etc/init.d.
как вы думаете, это лучший способ вместо того, чтобы процессы запускались как (статический) пользователь по моему выбору?
единственный метод, к которому я пришел, был использовать что-то вроде:
su my_user -c 'daemon my_cmd &>/dev/null &'
но это кажется немного неопрятным...
есть ли немного магии спрятан это обеспечивает простой механизм для автоматического запуска служб в качестве других, некорневых пользователей?
EDIT: я должен был сказать, что процессы, которые я запускаю в этом случае, являются либо скриптами Python, либо программами Java. Я бы предпочел не писать родную обертку вокруг них, поэтому, к сожалению, я не могу позвонить setuid () как предлагает черный.
8 ответов:
в Debian мы используем
start-stop-daemonутилита, которая обрабатывает pid-файлы, изменяя пользователя, помещая демона в фоновый режим и многое другое.Я не знаком с RedHat, но
daemonутилита, которую вы уже используете (которая определена в/etc/init.d/functions, кстати.) упоминается везде как эквивалентstart-stop-daemon, поэтому либо он также может изменить uid вашей программы, либо способ, которым вы это делаете, уже правильный.если вы посмотрите по сети, есть несколько готовых оберток, которые можно использовать. Некоторые из них даже могут быть уже упакованы в RedHat. Взгляните на
daemonize, например.
рассмотрев все предложения здесь, я обнаружил несколько вещей, которые, я надеюсь, будут полезны другим в моем положении:
хоп прямо в точку меня в
/etc/init.d/functions: в
- некоторые демоны (например, apache) делают это сами по себе, вызывая setuid ()
- вы могли бы использовать права доступа к файлу-файл флаг для запуска процесса от имени другого пользователя.
- конечно, решение, которое вы упомянули, также работает.
если вы собираетесь написать свой собственный демон, то я рекомендую вызвать setuid(). Таким образом, ваш процесс может
- использовать суперпользователя (например, открытые файлы, создать PID-файлы).
- отбросьте свои привилегии root в определенный момент во время запуска.
просто добавить некоторые другие вещи, чтобы следить за:
- Sudo в init.D скрипт не годится, так как ему нужен tty ("sudo: извините, у вас должен быть tty для запуска sudo")
- Если вы демонизируете приложение java, вы можете рассмотреть Java Service Wrapper (который предоставляет механизм для установки идентификатора пользователя)
- Другой альтернативой может быть su -- session-command=[cmd] [user]
на виртуальной машине CENTOS (Red Hat) для сервера svn: отредактировано
/etc/init.d/svnserverчтобы изменить pid на что-то, что svn может написать:pidfile=${PIDFILE-/home/svn/run/svnserve.pid}и
--user=svn:daemon --pidfile=${pidfile} --user=svn $exec $argsоригинальный pidfile был
/var/run/svnserve.pid. Демон не запустился, потому что только root мог писать там.These all work: /etc/init.d/svnserve start /etc/init.d/svnserve stop /etc/init.d/svnserve restart
некоторые вещи, чтобы наблюдать за:
- как вы упомянули, su запросит пароль, если вы уже являетесь целевым пользователем
- аналогично, setuid (2) завершится неудачей, если вы уже являетесь целевым пользователем (на некоторых ОС)
- setuid (2) не устанавливает привилегии или элементы управления ресурсами, определенные в /etc/limits.conf (Linux) или /etc/user_attr (Solaris)
- Если вы идете по маршруту setgid(2)/setuid(2), Не забудьте вызвать initgroups (3) -- Подробнее об этом здесь
обычно я использую /sbin/su для переключения на соответствующего пользователя перед запуском демонов.
Мне нужно было запустить пружину .jar приложение в качестве службы, и нашел простой способ запустить это как конкретный пользователь:
Я изменил владельца и группу моего файла jar на пользователя, которого я хотел запустить. Затем симулировал эту банку в init.D и начал службу.
Так:
#chown myuser:myuser /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar #ln -s /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar /etc/init.d/springApp #service springApp start #ps aux | grep java myuser 9970 5.0 9.9 4071348 386132 ? Sl 09:38 0:21 /bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar
Comments