Более чистый способ перезапустить сервисы daemontools
В нашем продукте мы создали сервисы, использующие daemontools. Один из моих сервисов выглядит так,
/service/test/run
/service/test/log/run (has multilog command to log into ./main dir)
/service/test/log/main/..
Весь процесс и его каталоги принадлежат пользователю root. Теперь есть требование безопасности, чтобы изменить, как это,
1. Service should run in non-root user.
2. Log main directory should be readable only to user and groups.
Для этого мне нужно изменить файл 'run' в каталоге 'log'. Также мне нужно изменить права доступа к основному каталогу.
Обратите внимание, что все эти файлы в "/service" принадлежат test-1.0-0.rpm. Когда я обновляю свой rpm, он переопределяет существующий файл запуска и получает такую ошибку,
multilog: fatal: unable to lock directory ./main: access denied
Я знаю, что мы не должны переопределять файл 'run' во время выполнения. Я планировал выполнить эти шаги в моем разделе%post скрипта rpm,
//Stop service
svc -d /service/test/log
//Moving the main directory
mv /service/test/log/main /service/test/log/main_old
//Updated run file has code to create main with limited permissions.
//Start service
svc -u /service/test/log
В некоторых статьях они предлагали воссоздать файл "lock" в "log/main". Есть ли какой-либо другой более чистый способ сделать это, не перемещая "главный" каталог? Если нет, безопасно ли идти с вышеуказанными шагами?
1 ответ
1. Service should run in non-root user.
Достаточно просто. Вы должны скопировать определение службы в каталог службы в доме "пользователя". Например, скажем, вы создаете пользователя, мы будем называть его niftyuser
, Скажем так, ваш сервис называется niftyservice
, Таким образом, вы должны скопировать определение вашей службы в каталог, контролируемый этим пользователем; для обсуждения (и не обязательно, что вы хотите это сделать), скажем, вы будете использовать niftyuser
домашний каталог. Так,
cp -Rav /etc/service/niftyservice /home/niftyuser/service/niftyservice
создаст определение сервиса. Затем вам нужно будет запустить проверку службы в каталоге этого пользователя, но запустить его с учетными данными пользователя. Если бы вы написали это как скрипт, это выглядело бы примерно так:
#!/bin/sh
exec setuidgid niftyuser svscan /home/niftyuser/service
Результатом будет дерево сервисов, которое контролируется этим пользователем. Обратите внимание, что, сделав этот скрипт, вы можете втиснуть поддерево вашего управляемого пользователем процесса в главное дерево процессов... вы можете увидеть пример runit, как это выглядит, так как runit был вдохновлен daemontools.
2. Log main directory should be readable only to user and groups.
Честно говоря, я просто делаю /service/(service-name)/log/main
символическая ссылка на фактический каталог, т.е. /service/niftyservice/log/main
указывает на /var/log/niftyservice
, В сценарии запуска для каталога журнала укажите ./main
как цель; это означает, что вы можете настроить определение один раз и перемещаться по журналу по мере необходимости, просто изменив символическую ссылку. И, наконец, чтобы ответить на вопрос (2), вы должны установить права пользователя и группы для /var/log/niftyservice
при необходимости и установите режим 775. Это позволит любому читать файлы, но только пользователь или группа могут писать в них.