в среде Linux мне нужно убить процесс, который был запущен пользователем user2, если я пользователь user1, но не являюсь пользователем sudoers и не использую root. Знаете ли вы, есть ли способ установить это при запуске процесса? Например, список пользователей, которым разрешено убивать процесс?
Дело в том, что одновременные экземпляры одного и того же процесса могут запускаться от разных пользователей, поэтому мне не удобно устанавливать идентификатор группы для процесса. Другие пользователи, не входящие в группу, не смогут запустить второй параллельный процесс.
У меня есть список пользователей, которым разрешено запускать процесс, определенный в базе данных, перед началом процесса я проверяю, есть ли текущий пользователь в списке, и, если да, я запускаю процесс с текущим пользователем. Если второй пользователь разрешил сделать это, хочет убить процесс, я бы хотел, чтобы ему разрешили это сделать, но я не хочу, чтобы это было sudoers.
Поэтому я думал о создании процесса, работающего от имени пользователя root, который получает запрос на удаление процессов от пользователя, проверяет, разрешено ли пользователю запускать / останавливать процесс, и убивает процесс.
Как вы думаете, это может быть лучшим решением?
Ответы:
Извините, но это просто невозможно (так задумано). Однако, если члены общей группы, user1 может записать в файл, который проверяет процесс user2, указывая процессу, что он должен завершиться.
Или user2 может запустить что-то в фоновом режиме, что проверяет файл, а затем отправляет соответствующие сигналы. Затем User1 просто должен записать в этот файл. Это может быть проще, так как это не потребует какой-либо модификации программ user2.
Обычно нет, user1 не может отправлять сигналы POSIX процессу user2.
источник
Если ACL, SELinux или что-то еще не имеют лучшего способа сделать это, то, как я видел, это делается с помощью скрипта SetUID . Как вы можете себе представить, они печально известны своей угрозой безопасности.
Что касается вашего случая, скажите, что procOwner - это имя пользователя для владельца процесса, а userA (uid 1000), userB (uid 1201) и userC (uid 1450) - люди, которым разрешено уничтожать процесс.
killmyproc.bash:
Затем установите владельца и разрешения с помощью:
А также поместите userA, userB и userC в группу
procGroup
.источник
Традиционно - когда какой-либо пользователь приходит и убивает чужие процессы, это предельная уязвимость отказа в обслуживании.
Это может быть сделано, если целевой процесс сотрудничает. Один из способов - отслеживать внешнее событие (например, файл, создаваемый в / var / tmp или сообщение в сокете), инструктируя его убить себя. Если вы не можете написать это для этого, вы можете написать для него оболочку, которая запускает его, а затем выполняет мониторинг, убивая дочерний процесс в случае возникновения события.
источник
Нет, ты не можешь.
Если вы хотите поделиться процессами с другими пользователями, вы должны запустить процесс под общим идентификатором пользователя.
источник
Конечно, вы можете написать программу таким образом, чтобы она грациозно завершала работу, когда получала определенный сигнал (термин, использованный свободно для обозначения «заранее определенного события», а не сигнала POSIX) от определенного (списка) пользователей.
источник
Вы можете написать программу suid, которую могут выполнять только пользователи в определенной группе и которая посылает соответствующий сигнал процессу. Не уверен, что вы хотели исключить suid, хотя.
источник
бит suid не работает со скриптами bash. imho, лучший способ - написать скрипт-оболочку "killservice". Предположим, что ваш сервис работает как пользователь serviceuser
тогда
тогда вам просто нужно добавить правило в / etc / sudoers, чтобы они могли запускать / usr / bin / killserviceworker от имени пользователя serviceuser без запроса пароля:
killserviceworker может выглядеть так:
источник