Доступ пользователей к этим действиям контролируется 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/