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

65

Quando instalamos / removemos / atualizamos pacotes ou fazemos alterações que exijam privilégios administrativos, é solicitada a senha do usuário administrador que possui os sudoprivilégios - isso ocorre via GUI e no terminal.

prompt via GUI

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 executamos essas ações por meio da roda dentada no canto superior direito.

menu de roda dentada

Por que existe essa discrepância?

Aditya
fonte
5
Boa pergunta .. Você sabe o que eu ia perguntar o mesmo. Meu cenário era desligar o Ubuntu com teclas de atalho. i, e sempre que pressiono alguma tecla atribuída, como ctrl + super + s, ele executa o comando, sudo shutdown -h nowmas o problema é que, sem a permissão de acesso shutdown, nunca funciona. Porque onde / como solicitará a senha para entrar depois de pressionar a tecla de atalho .. Espero que você entenda minha situação .. :)
Saurav Kumar
veja também: askubuntu.com/questions/1190/…
Takkat
Veja também: unix.stackexchange.com/questions/18503/…
amyassin 26/10/2013

Respostas:

50

O desligamento na roda dentada verifica se você tem permissão para desligar a máquina. Isso é feito via PolicyKit. Em caso de desligamento, esta instruçã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 aciona um dbus-sendcomando. 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

Há um daemon em execução em segundo plano com privilégios de root que chama o comando shutdown para você.

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

caos
fonte
14
Uma opção um pouco mais segura seria permitir o desligamento sem senha dos sudoers, etc. Isso é fácil: insira sudo visudo, adicione %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, salve e saia. Dessa forma, uma reinicialização da linha de comando ainda exigirá sudo reboot, mas você não precisará digitar sua senha.
Sebastian Thürrschmidt 22/10/2013
27

O Ubuntu é uma distribuição do GNU / Linux Operationg System, que por sua vez pertence à família de sistemas Unix - uma arquitetura comum para vários sistemas operacionais modernos.

Tradicionalmente, o Unix costumava ser executado em computadores mainframe. Instalações de computação central que atendem a dúzias ou centenas de usuários por meio de terminais remotos. Como todos os usuários confiaram na disponibilidade do mainframe, nenhum usuário foi autorizado a emitir um comando de desligamento. Uma idéia 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 algumas dificuldades para disponibilizar o desligamento para o mero usuário de desktop. Uma técnica comum é permitir que o gerenciador de login, que geralmente é executado no contexto de segurança do usuário root, lide com o desligamento e a reinicialização. Nesse caso, o shell gráfico emite 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 kit de políticas mencionado acima estende esse processo, fornecendo uma estrutura padronizada através da qual o gerenciador de login (ou qualquer programa que fornece o serviço de desligamento) pode verificar quais usuários têm permissão para causar um desligamento e através do qual um administrador pode configurar essas permissões, respectivamente.

Alguns ambientes de área de trabalho não usam serviços baseados em IPC, mas um conjunto de programas auxiliares para fornecer as mesmas funções ou funções semelhantes. Esses programas auxiliares seriam chamados por meio de mecanismos, permitindo mudar para o contexto do superusuário, como sudo, suid ou um mecanismo do kit de políticas semelhante ao sudo.

De qualquer forma, o programa de desligamento tradicional burro no shell não funciona dessa maneira. É necessário que você veja que ele é executado em um contexto de superusuário.

Paul Hänsch
fonte
14

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

O problema é que você pode não querer que as pessoas com acesso SSH possam desligá-lo, principalmente quando houver outros usuários conectados remotamente usando-o. Alguém com acesso à GUI - bem, ele pode desligá-la por conta própria com o botão de energia físico.

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

Manishearth
fonte
Não me ocorreu naquele momento em que fiz essa pergunta, mas suponho que sejam opções no Ubuntu para instalar pacotes da GUI em um servidor remoto e usar o servidor remoto sobre a GUI em vez da linha de comando. (Semelhante ao modo como a Área de trabalho remota do Windows ou o Teamviewer funciona). Isso invalidaria a suposição de que alguém usando o Ubuntu sobre GUI pode desligar com o botão de energia físico.
Aditya
@aditya que precisa do servidor configurado dessa forma, que o administrador deve decidir fazer
Manishearth
Sim. Exigiria privilégios de root para poder instalar os pacotes e configurar conforme necessário. Mas esse cenário me veio à mente ao ler sua resposta ontem e eu pensei que eu iria compartilhar com você :-)
Aditya
14

Quando eu reinicio via GUI, posso fazer isso sem a minha sudosenha.

Somente se você for o único logon. Se houver outros usuários (incluindo usuários do console), talvez seja necessário digitar uma senha root. É o mesmo no OS X e nas versões mais recentes do Windows.

Por que é que? O que está acontecendo internamente no 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 em execução no mesmo host.

O D-Bus é "mais inteligente" 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 integrais de várias larguras, seqüências de caracteres 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 shutdowncomando não apenas verifica se alguém está logado? Parece uma característica pouco mercantil para ser honesto. Eu posso imaginar que às vezes economizaria tempo, mas geralmente é preferível um console consistente. Não quero que os comandos às vezes exijam uma senha após executá-la, e às vezes não.

Meus pronomes são He / Him

Tim
fonte
Há também versão mais curta através aplicativo qdbus
Sergiy Kolodyazhnyy
Ao desligar / sair de um DE (GNOME neste caso), não é solicitada a sudosenha do usuário / root nem com outro usuário conectado via GDM nem com outro usuário conectado via tty.
kos
@ kos hu, isso é estranho. Essa imagem é de Gnome 3, e eu estou logado no gui e tty
Tim
Quero dizer, recebo a mesma mensagem, mas clicar em "Desligar" prossegue e desliga o sistema. Também pedi a Fabby para testar isso e ele também faz o mesmo, sem saber ao certo o que é isso.
kos
@kos ohh. Hu espere.
Tim
9

O motivo pelo qual você não precisa ser root para iniciar um desligamento a partir da GUI é uma questão de conveniência para o usuário típico da área de trabalho. O sistema sabe que você é o usuário conectado ao console; portanto, se você desligar o computador por engano, presumivelmente poderá ativá-lo novamente.

Para um usuário no shell, é bem possível que você esteja conectado remotamente, portanto o sistema exige que você esteja conectado como root para emitir um comando de desligamento. Isso impede que um usuário comum conectado a um servidor o desligue enquanto outras pessoas o estão usando, e enquanto não há necessariamente alguém fisicamente lá para iniciar o backup do computador.

O motivo pelo qual o desligamento não fornece um prompt da GUI para a senha de superusuário provavelmente é simplesmente o fato de não haver utilidade real a ser adquirida - se você estiver no console, onde o prompt apareceria, você pode simplesmente usar o comando cog- em vez disso. Se você deseja ter um prompt de linha de comando para a senha de superusuário para desligamento, isso já está disponível com "sudo shutdown".

Mark Bessey
fonte
5

Em um sistema multiusuário, a última coisa que você deseja é que seus usuários efetuem login e possam reinicializar aleatoriamente o servidor a qualquer momento. Portanto, a versão da linha de comando de Reinicialização é um comando apenas de superusuário, portanto, você precisa ser root ou tem direitos de sudo.

O mesmo vale para os comandos Halt e PowerOff.

Jeff Sereno
fonte
2
Obrigado pela sua resposta, eu entendo que eu, como usuário de uma máquina usada por dezenas, não deveria ser capaz de reinicializar a máquina, mas o que o Ubuntu (ou praticamente todas as distribuições de área de trabalho) faz quando escolhi reiniciar pelo mouse em vez do teclado? Eles permitem isso sem privilégios.
As7
3
Componentes como systemctl, loginctl, systemd, diretivas do sistema, etc, permitem que o usuário conectado no momento acesse determinadas funções raiz sem exigir explicitamente o acesso raiz para tornar a experiência da área de trabalho mais amigável, mas elas não necessariamente chamam a linha de comando comandos para executar essas tarefas.
Jeff Sereno