Запрет пользователям выключать/перезагружать компьютер при помощи PolicyKit

Не вдаваясь в подробности, откуда есть пошло у меня желание такое сварганякать просто расскажу, как это сделать.

Проблема:

Ubuntu по умолчанию позволяет любому пользователю выключить или перезагрузить компьютер в любой момент. Если в данный компьютер в системе работают несколько пользователей, система скромно об этом предупредит и предоставит две кнопочки «Ок» и «Отмена», что на деле означает «Гнать их в шею» и «Ладно, хай работают». Для домашнего десктопа нормально.
В случае же, когда Ubuntu используется как сервер, вырубать её никто не должен.

Решение:

Ubuntu, как и большая часть современных дистрибутивов использует для административных дел PolicyKit, значит простым chmod o-x /sbin/shutdown обойтись не получится, PolicyKit всё равно на прописанные действия получает нужные привилегии.
Объясняем ему, как нужно себя вести: создаём файл /etc/polkit-1/localauthority/50-local.d/99-disallow-shutdown.pkla и вписываем в него следующее:

[Disallow shutdown]
Identity=unix-group:users
Action=org.freedesktop.consolekit.system.stop;org.freedesktop.consolekit.system.restart
ResultAny=no
ResultInactive=auth_admin
ResultActive=no

Подробнее:
Identity — список пользователей (unix-user) и групп (unix-group), к которым будет применятся правило. Правила можно перечислять через точку с запятой, например: Identity=unix-user:vasya;unix-group:users;unix-group:guests
Action — список действий, к которым будет применяться правило (список можно получиться командой pkaction). Тоже перечисляем через точку с запятой.
ResultActive — что делать, если вызвавший действие входит в список Identity. Принимает значения:
yes (исполнить действие),
no (не исполнять действие),
auth_self (запросить пароль пользователя и исполнить действие при правильном вводе),
auth_self_keep (запросить пароль пользователя, исполнить действие при правильном вводе и больше не спрашивать пароль до конца сессии),
auth_admin (запросить пароль администратора и исполнить действие при правильном вводе),
auth_admin_keep (запросить пароль администратора, исполнить действие при правильном вводе и больше не спрашивать пароль до конца сессии).
ResultInactive — что делать, если пользователь не входит в список Identity. Значения см. ResultActive.
ResultAny — действие, исполняемое в любом случае. Значения см. ResultActive.

В данном случае, если пользователь группы users попытается выключить или перезагрузить компьютер у него ничего не выйдет. Пользователя любой другой группы система спросит пароль администратора.

Подсмотрено на http://superuser.com/questions/354678/what-is-the-correct-way-to-prevent-non-root-users-from-issuing-shutdowns-or-rebo

Добавить комментарий