Лучшая практика для запуска службы Linux от имени другого пользователя

Ваш последний комментарий только подтвердил мое подозрение. Я не знаю, как вы попали в эту папку, но это не совсем клон репозитория прошивки.

Следуйте https://github.com/marcelstoer/docker-nodemcu-build#clone-the-nodemcu-firmware-repository , и все будет хорошо.

git clone --recurse-submodules https://github.com/nodemcu/nodemcu-firmware.git

137
задан Community 23 May 2017 в 12:26
поделиться

4 ответа

На Debian мы используем start-stop-daemon утилита, которая обрабатывает изодромные с предварением файлы, изменяя пользователя, помещая демона в фон и многое другое.

Я не знаком с Redhat, но daemon утилита, которую Вы уже используете (который определяется в /etc/init.d/functions, btw.) упоминается везде как эквивалент start-stop-daemon, так или это может также изменить uid Вашей программы или способ, которым Вы делаете, это уже - корректное.

Если Вы смотрите по всей сети, существует несколько готовых оберток, которые можно использовать. Некоторые могут даже быть уже упакованы в Redhat. Взгляните на daemonize, например.

67
ответ дан 23 November 2019 в 23:35
поделиться

После рассмотрения всех предложений здесь, я обнаружил несколько вещей, которые я надеюсь, будет полезно для других в моем положении:

  1. транзитный участок является правильным указать на меня назад на /etc/init.d/functions: daemon функция уже позволяет Вам устанавливать альтернативного пользователя:

    daemon --user=my_user my_cmd &>/dev/null &
    

    Это реализовано путем обертывания вызова процесса с runuser - больше на этом позже.

  2. Jonathan Leffler прав: в Python существует setuid:

    import os
    os.setuid(501) # UID of my_user is 501
    

    Я все еще не думаю, что Вы можете setuid из JVM, как бы то ни было.

  3. Ни один su ни runuser корректно обработайте случай, где Вы просите выполнять команду как пользователь, Вы уже. Например:

    [my_user@my_host]$ id
    uid=500(my_user) gid=500(my_user) groups=500(my_user)
    [my_user@my_host]$ su my_user -c "id"
    Password: # don't want to be prompted!
    uid=500(my_user) gid=500(my_user) groups=500(my_user)
    

К обходному решению то поведение su и runuser, Я изменил свой init сценарий на что-то как:

if [[ "$USER" == "my_user" ]]
then
    daemon my_cmd &>/dev/null &
else
    daemon --user=my_user my_cmd &>/dev/null &
fi

Спасибо все для Вашей справки!

52
ответ дан 23 November 2019 в 23:35
поделиться
  • Некоторые демоны (например, апач) делают это собой путем вызова setuid ()
  • Вы могли использовать флаг setuid-файла для выполнения процесса как другой пользователь.
  • Конечно, решение Вы упомянули работы также.

Если Вы намереваетесь записать Вашему собственному демону, то я рекомендую назвать setuid (). Таким образом, Ваш процесс может

  1. Используйте его полномочия пользователя root (например, откройте файлы журнала, создайте изодромные с предварением файлы).
  2. Отбросьте его полномочия пользователя root в определенный момент во время запуска.
5
ответ дан 23 November 2019 в 23:35
поделиться

Некоторые вещи, на которые следует обратить внимание:

  • Как вы упомянули, su запросит пароль, если вы уже являетесь целевым пользователем.
  • Аналогично, setuid (2) завершится ошибкой, если вы уже являетесь целевым пользователем (в некоторых ОС )
  • setuid (2) не устанавливает привилегии или элементы управления ресурсами, определенные в / etc / limits.
2
ответ дан 23 November 2019 в 23:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: