У меня есть userA и userB, которые запускают процессы:
userA@server:~$ ./some_command.sh &
[1] 30889
Затем у меня есть веб-приложение, работающее как userC, которое управляет этими процессами (приостановка, возобновление, завершение и завершение).
Как я могу дать разрешение пользователю C сделать это? В целях безопасности я не хочу давать пользователю права root.
У меня есть полный контроль над пользователем C. Одна из возможностей - изменить идентификатор пользователя на такой же, как у userA, но как насчет userB?
Обновление: управление процессами выполняется с помощью стороннего модуля, поэтому невозможно применить sudo без значительной перезаписи.
Практика, когда пользователи делятся uid, очень не одобряется.
Предложения:
sudo
команда. Это решение goto для «как запустить команду от имени другого пользователя»: вы указываете записи в /etc/sudoers
файл, указывающий, каким пользователям (или группам и т. д.) разрешено запускать команды от имени разных пользователей и при каких обстоятельствах. Его конфигурацию также можно поместить в каталог LDAP.sudo
абстракция. (т.е. роль, которая позволяет пользователю выполнять sudo su - oracle
получить оракул shell) Это заставляет пользователей входить в систему как они сами, прежде чем стать пользователем приложения, и оставляет лучший контрольный след.screen
или tmux
, хотя некоторая абстракция между учетными записями для входа в систему и общими учетными записями приложений все же рекомендуется. Вы должны попытаться избежать этого, если только процессы имеют какое-то конечное взаимодействие.Setuid для исполняемых файлов, запускаемых пользователями A / B, для пользователя C.
?
Прибыль
Я бы предложил комбинацию Monit и sudo для управления заданиями ...
Monit будет обрабатывать запуск / остановку / статус приложения.
Sudo с правами Monit даст вам возможность сотрудничества.
Видеть: разрешить пользователю запускать определенное действие по мониторингу
Вероятно, лучше всего использовать процесс прокси под userA / userB, читающий файлы управления для каждого PID.
some_command.sh
:
thecommand &
CTL=/var/run/%1.ctl
echo %1 > $CTL
while read -n 1 cmd; do
case $cmd in
k)
kill %1
exit $?
;;
s)
kill -TSTP %1
;;
...
done < $CTL
Вы могли бы заставить рабочие процессы читать управляющие файлы ... но тогда они не могли бы продолжить, не так ли.