Если вы дадите пользователю полную свободу действий как root, то он сможет убить почти что угодно. Для более подробного обсуждения и возможных обходных путей см.: обсуждение стека unix sigkill.
Также интересно решение сторожевого таймера, упомянутое @bta. На самом деле доступен программный сторожевой пакет, который можно настроить для отслеживания изменения файлов или выполнения пользовательского сценария. Однако на большинстве стандартных ядер этот сторожевой таймер может быть остановлен пользователем root, или вы можете изменить его конфигурацию. Но другие пользователи должны были бы знать об этом, чтобы избежать этого. Видеть: https://linux.die.net/man/8/watchdog
Но если вам не нужно разрешать полный root-доступ, но вы можете управлять их доступом с помощью механизма sudo, то вы можете установить некоторые команды с явными аргументами для их выполнения и не разрешать ничего, кроме их прав пользователя по умолчанию.
Например, вы можете поставить /бен/убить
в /etc/sudoers
файл, но разрешать только определенные аргументы.
bob ALL=(root) /bin/kill -sigTERM [1-9][0-9][0-9][0-9]
Это позволит пользователю боб выполнить /бен/убить
, но уничтожайте только процессы с PID от 1000 до 9999. Если вы запустите свой монитор достаточно рано, у него будет низкий PID, и его нельзя будет убить таким образом. Пользователь боб конечно, вы все еще можете связываться с вами, убивая ваши собственные пользовательские процессы ...., и что с оберткой PID, это все равно может быть не слишком полезно.
Из полного набора можно вычесть определенные опции. Например, убить все неотрицательные PID, но не разрешать сигнализировать PID, содержащий 1337, и не разрешать уничтожение -1.
bob ALL=(root) /bin/kill -sigTERM *,!/bin/kill *1337*,!bin/kill *-1*
Но это было бы немного неудобно, и вы были бы уверены, что программа не переносит свои целые числа. Насколько я понимаю, Procps kill не работает, но в этом примере все равно можно было бы убить процесс с pid 1337, если бы он был частью группы процессов, в которой он не был лидером. Итак, это показывает, насколько сложно работать с негативами или черными списками.
Лучший вариант, разрешить убивать только определенные процессы по имени
bob ALL=(root) /usr/bin/pkill -sigTERM -f namedprocess
Или только перезапустить конкретную службу
bob ALL=(root) /bin/systemctl перезапустить службу
Пользователь может просмотреть доступные команды sudo с помощью судо -л
Важно, если вы разрешаете определенным программам указывать для них полный путь. А также у пользователя не должно быть прав на удаление или редактирование этой программы, иначе она может быть заменена чем-то другим.