18

в среде Linux мне нужно убить процесс, который был запущен пользователем user2, если я являюсь пользователем user1, не являясь пользователем sudoers и не используя root. Знаете ли вы, есть ли способ установить это при запуске процесса? Например, список пользователей, которым разрешено убивать процесс?

Дело в том, что одновременные экземпляры одного и того же процесса могут запускаться от разных пользователей, поэтому мне не удобно устанавливать идентификатор группы для процесса. Другие пользователи, не входящие в группу, не смогут запустить второй параллельный процесс.

У меня есть список пользователей, которым разрешено запускать процесс, определенный в базе данных, перед началом процесса я проверяю, есть ли текущий пользователь в списке, и, если да, я запускаю процесс с текущим пользователем. Если второй пользователь разрешил сделать это, хочет убить процесс, я бы хотел, чтобы ему разрешили это сделать, но я не хочу, чтобы это было sudoers.

Поэтому я думал о создании процесса, выполняющегося от имени пользователя root, который получает запрос на удаление процессов от пользователя, проверяет, разрешено ли пользователю запускать / останавливать процесс, и убивает процесс.

Как вы думаете, это может быть лучшим решением?

7 ответов7

12

Извините, но это просто невозможно (так задумано). Однако, если члены общей группы, user1 может записать в файл, который проверяет процесс user2, указывая процессу, что он должен завершиться.

Или user2 может запустить что-то в фоновом режиме, что проверяет файл, а затем отправляет соответствующие сигналы. Затем User1 просто должен записать в этот файл. Это может быть проще, так как не потребует никаких модификаций программ user2.

Условно нет, user1 не может отправлять сигналы POSIX процессу user2.

9

Если ACL, SELinux или что-то еще не имеют лучшего способа сделать это, то, как я видел, это делается с помощью скрипта SetUID . Как вы можете себе представить, они печально известны своей угрозой безопасности.

Что касается вашего случая, скажите, что procOwner - это имя пользователя для владельца процесса, а userA (uid 1000), userB (uid 1201) и userC (uid 1450) - люди, которым разрешено уничтожать процесс.

killmyproc.bash:

#!/bin/bash
case ${UID} in
1000|1201|1450) ;;
*) echo "You are not allowed to kill the process."
   exit 1;;
esac

kill ${PROCESS_ID}
# PROCESS_ID could also be stored somewhere in /var/run.

Затем установите владельца и разрешения с помощью:

chown procOwner:procGroup killmyproc.bash
chmod 6750 killmyproc.bash

А также поместите userA, userB и userC в группу procGroup .

2

Традиционно - когда какой-либо пользователь приходит и убивает чужие процессы, это предельная уязвимость отказа в обслуживании.

Это может быть сделано, если целевой процесс сотрудничает. Одним из способов было бы для него отслеживать внешнее событие (например, файл, создаваемый в /var /tmp или сообщение в сокете), инструктируя его убить себя. Если вы не можете написать это для этого, вы можете написать для него оболочку, которая запускает его, а затем выполняет мониторинг, убивая дочерний процесс в случае возникновения события.

1

Нет, ты не можешь.

Если вы хотите поделиться процессами с другими пользователями, вы должны запустить процесс под общим идентификатором пользователя.

1

Конечно, вы можете написать программу таким образом, чтобы она грациозно завершилась, когда она получает определенный сигнал (термин, который используется для обозначения «заранее определенного события», а не сигнала POSIX) от определенных (списка) пользователей.

1

Вы можете написать программу suid, которую могут выполнять только пользователи в определенной группе и которая посылает соответствующий сигнал процессу. Не уверен, что вы хотели исключить suid, хотя.

0

бит suid не работает со скриптами bash. imho, лучший способ - написать скрипт-оболочку "killservice". Предположим, что ваш сервис работает как пользователь serviceuser

#!/bin/bash
sudo -u serviceuser /usr/bin/killserviceworker

затем

# addgroup servicekiller
# chown root:servicekiller /usr/bin/killservice
# chmod 750 /usr/bin/killservice
# adduser bob servicekiller

затем вам просто нужно добавить правило в /etc /sudoers, чтобы они могли запускать /usr /bin /killserviceworker от имени пользователя serviceuser без запроса пароля:

servicekiller        ALL = (serviceuser:serviceuser) NOPASSWD: /usr/bin/killserviceworker

killserviceworker может выглядеть так:

#!/bin/bash
kill ${cat /run/service.pid}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .