В нашем продукте мы создали службы с помощью 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
Я знаю, что мы не должны отменять запуск файла во время выполнения. Я планировал выполнить эти шаги в моем разделе rpm script% post,
//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
В некоторых статьях предлагалось воссоздать файл блокировки в папке log / main. Есть ли другой более чистый способ сделать это без перемещения «основного» каталога? Если нет, безопасно ли выполнять вышеуказанные шаги?
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. Это позволит любому читать файлы, но только пользователю или группе писать в них.