O acesso do usuário a essas ações é controlado pelo polkit. Em particular, eles correspondem às seguintes ações:
-
org.freedesktop.consolekit.system.stop
-
org.freedesktop.consolekit.system.restart
-
org.freedesktop.upower.suspend
-
org.freedesktop.upower.hibernate
Todas essas ações são permitidas por padrão para usuários locais ativos (embora consolekit
restrinja ainda mais as duas primeiras permissões para trabalhar somente quando há um único usuário logado no sistema).
Se você quiser desabilitar essas ações, crie um arquivo /etc/polkit-1/50-local.d/disable-shutdown.pkla
contendo algo como:
[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
Isso deve impedir que essas ações sejam concluídas. Mais informações sobre esses arquivos de políticas podem ser encontradas executando man pklocalauthority
.
Se você está tentando restringir root
, isso será apenas um pequeno inconveniente. Por definição, root
é uma conta irrestrita de acordo com o tradicional sistema de controle de acesso discricionário do UNIX. Se você não pode confiar nos usuários para os quais você concedeu o root
total de acesso, então você tem problemas maiores do que eles simplesmente desligando o sistema.
Note que em versões posteriores do Ubuntu alguém decidiu quebrar a compatibilidade. Como respondido em Como desabilitar o desligamento / reinicialização do lightdm em 14.04? a ação parece ter mudado para "org.freedesktop. login1 .reboot" (e semelhantes).
Por exemplo, em 14.04, adicionando as seguintes linhas como /etc/polkit-1/localauthority/50-local.d/restrict-login-powermgmt.pkla
works:
[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
Além disso, note que este método bloqueia somente os comandos reboot / etc emitidos a partir da GUI. Para bloquear os comandos reboot / etc a partir da linha de comando, pode-se usar o molly-guard - como explicado em Desativando o comando de desligamento para todos os usuários, mesmo as conseqüências raiz?