Доступ пользователей к этим действиям контролируется polkit. В частности, они соответствуют следующим действиям:
org.freedesktop.consolekit.system.stop
org.freedesktop.consolekit.system.restart
org.freedesktop.upower.suspend
org.freedesktop.upower.hibernate
Все эти действия разрешены по умолчанию для активных локальных пользователей (хотя consolekitеще больше ограничивает первые два разрешения, чтобы они работали только тогда, когда в систему вошел единственный пользователь).
Если вы хотите отключить эти действия, создайте файл, /etc/polkit-1/50-local.d/disable-shutdown.pklaсодержащий что-то вроде:
[Disable shutdown/whatever]
Identity=unix-user:*
Action=org.freedesktop.consolekit.system.stop;org.freedesktop.consolekit.system.restart;org.freedesktop.upower.suspend;org.freedesktop.upower.hibernate
ResultAny=no
ResultInactive=no
ResultActive=no
Это должно помешать выполнению этих действий. Дополнительную информацию об этих файлах политики можно найти, запустив man pklocalauthority.
Если вы пытаетесь ограничить rootэто, это будет лишь незначительным неудобством. По определению, rootэто неограниченная учетная запись в соответствии с традиционной UNIX дискреционной системой контроля доступа. Если вы не можете доверять пользователям, которым вы предоставили полный rootдоступ, тогда у вас больше проблем, чем когда они просто выключают систему.
Обратите внимание, что в более поздних версиях Ubuntu кто-то решил нарушить совместимость. Как ответили в Как отключить выключение / перезагрузку из lightdm в 14.04? кажется, что действие изменилось на «org.freedesktop. login1 .reboot» (и тому подобное).
Например в 14.04 добавление следующих строк как /etc/polkit-1/localauthority/50-local.d/restrict-login-powermgmt.pklaработает:
[Disable lightdm PowerMgmt]
Identity=unix-user:*
Action=org.freedesktop.login1.reboot;org.freedesktop.login1.reboot-multiple-sessions;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-multiple-sessions;org.freedesktop.login1.suspend;org.freedesktop.login1.suspend-multiple-sessions;org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=no
ResultInactive=no
ResultActive=no
Кроме того, обратите внимание, что этот метод блокирует только команды перезагрузки / etc, выполненные из GUI. Чтобы заблокировать команды перезагрузки / etc из командной строки, можно использовать molly-guard - как описано в разделе Отключение команды выключения для всех пользователей, даже root - последствия?
shutdownиpm-suspendс/sbin/и/bin/