Por que precisamos ser root no terminal para desligar e reiniciar?

60

Quando instalamos / removemos / atualizamos pacotes ou fazemos qualquer alteração que requeira privilégios administrativos, solicitamos a senha do usuário admin que possui o sudo privileges - isso acontece tanto via GUI como pelo terminal.

No entanto, se tentarmos desligar e reiniciar via terminal, ele reclama que precisamos ser root :

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Mas nunca nos pedem uma senha quando realizamos essas ações por meio da roda dentada no canto superior direito.

Por que existe essa discrepância?

    
por Aditya 19.10.2013 / 20:02

6 respostas

48

O desligamento da roda dentada verifica se você está autorizado a desligar a máquina. Isso é feito por meio do PolicyKit. Em caso de encerramento, esta declaração no arquivo /usr/share/polkit-1/actions/org.freedesktop.consolekit.policy é verificada:

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

O PolicyKit dispara um comando dbus-send . Em caso de desligamento, seria:

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

Existe um daemon rodando em segundo plano com Privilégios-raiz que invoca o comando shutdown para você.

Quando você quiser desligar a máquina "da maneira antiga" via linha de comando ( shutdown, reboot, halt, ... ), então você precisa adicionar o suid-Bit a esses comandos. Mas esteja ciente de que todos em seu sistema, que têm acesso ao shell, podem desligar sua máquina.

    
por chaos 19.10.2013 / 20:46
27

O Ubuntu é uma distribuição do Sistema Operacional GNU / Linux que, por sua vez, pertence à família de sistemas Unix - uma arquitetura comum para uma série de sistemas operacionais modernos.

Tradicionalmente, o Unix costumava ser executado em computadores mainframe. Instalações de computação central que atendem a dozends ou centenas de usuários por meio de terminais remotos. Como todos os usuários dependiam da disponibilidade do mainframe, nenhum usuário tinha autorização para emitir um comando de desligamento. Uma ideia que é fundamental para a arquitetura Unix - o kernel do sistema nunca inicializará um desligamento a menos que a função correspondente seja chamada por um processo de superusuário.

Nos sistemas de desktop contemporâneos, os desenvolvedores passaram por certas dificuldades para tornar o desligamento disponível para o usuário simples de desktop. Uma técnica comum é permitir que o gerenciador de login, que geralmente é executado no contexto de segurança do usuário root, manipule o desligamento e reinicialize. Nesse caso, o shell gráfico envia uma solicitação ao gerenciador de login para desligar o computador. Isso envolve o uso de comunicação entre processos (IPC), geralmente através do serviço dbus.

O policykit acima mencionado estende esse processo fornecendo uma estrutura padronizada por meio da qual o gerenciador de login (ou qualquer programa que forneça o serviço de desligamento) pode verificar quais usuários podem causar um desligamento, e através do qual um administrador pode configurar essas permissões respectivamente .

Alguns ambientes de desktop não usam serviços baseados em IPC, mas sim um conjunto de programas auxiliares para fornecer funções iguais ou semelhantes. Esses programas auxiliares seriam chamados através de mecanismos, permitindo a mudança para o contexto de superusuário, como sudo, suid ou um mecanismo de policykit semelhante ao sudo.

Em qualquer caso, o programa de desligamento tradicional no shell não funciona desta forma, Ele requer que você veja que ele é executado em um contexto de superusuário.

    
por Paul Hänsch 19.10.2013 / 21:29
14

Como o Linux é comumente usado como servidor ou similar, e o SSHing em uma caixa linux, mesmo um laptop normal do Ubuntu, é bastante comum.

A questão é que você pode não querer que as pessoas com acesso SSH consigam desligá-lo, especialmente quando pode haver outros usuários logados remotamente usando-o. Alguém com acesso à GUI - bem, ele pode desligar sozinho de qualquer maneira com o botão de energia física.

Além disso, um usuário conectado remotamente não poderá ativá-lo novamente.

    
por Manishearth 20.10.2013 / 02:43
14
  

Quando eu reinicio via GUI, posso fazer isso sem minha sudo password.

Somente se você for o único conectado. Se houver outros usuários (incluindo usuários do console), talvez seja necessário inserir uma senha de root. Isso é o mesmo no OS X e em versões mais recentes do Windows.

  

Por que isso? O que está acontecendo internamente com o sistema Ubuntu?

O seguinte comando:

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
  

O D-Bus é um mecanismo IPC - um meio de comunicação local entre processos executados no mesmo host.

     

O D-Bus é "mais inteligente" do que os protocolos de passagem de mensagens de baixo nível, como o UDP. Por outro lado, ele carrega mensagens como itens discretos - não fluxos contínuos de dados.

     

O D-Bus possui uma visão estruturada dos dados que carrega e lida com dados em formato binário; números inteiros de várias larguras, cadeias e assim por diante. Como os dados não são apenas "bytes brutos" para o D-Bus, as mensagens podem ser validadas.

     

- Desktop grátis

Por que o comando shutdown não verifica se alguém está logado? Isso parece um recurso sem mercenário para ser honesto. Eu posso imaginar que economizaria tempo às vezes, mas um console consistente é frequentemente preferido. Eu não quero comandos para às vezes exigir uma senha depois de executá-lo, e às vezes não.

    
por Tim 07.02.2016 / 02:58
9

O motivo pelo qual você não precisa ser root para iniciar um desligamento a partir da GUI é, em grande parte, uma questão de conveniência para o usuário típico de desktop. O sistema sabe que você é o usuário logado no console, então se você desligar o computador por engano, você pode ligá-lo novamente.

Para um usuário no shell, você pode muito bem estar logado remotamente, então o sistema requer que você esteja logado como root para emitir um comando shutdown. Isso impede que um usuário comum conectado a um servidor o desligue enquanto outras pessoas o estão usando, e embora não haja necessariamente alguém fisicamente ali para iniciar o backup do computador.

O motivo pelo qual o desligamento não fornece um prompt de GUI para a senha de superusuário é provavelmente simplesmente que não há nenhum utilitário real a ser obtido - se você estiver no console, onde o prompt apareceria, você poderia simplesmente usar o menu cog-wheeel em vez disso. Se você queria ter um prompt de linha de comando para a senha de superusuário para o desligamento, isso já está disponível com o "encerramento do sudo".

    
por Mark Bessey 19.10.2013 / 21:35
5

Em um sistema multiusuário, a última coisa que você deseja é que seus usuários façam login e reinicializem aleatoriamente o servidor a qualquer momento, portanto, a versão de linha de comando do Reboot é um comando somente de superusuário, portanto, você precisa seja root ou tenha direitos de sudo.

Ditto os comandos Halt e PowerOff também.

    
por Jeff Sereno 07.02.2016 / 02:38