Por que não consigo executar o desligamento quando a permissão é rwxr-xr-x?

33

Estou em /sbin e vejo que shutdown tem permissões rwxr-xr-x . Isso não significa que qualquer um pode executá-lo?

    
por Korgan Rivera 04.12.2013 / 11:55

4 respostas

76

Qualquer pessoa pode executar shutdown , mas o acionamento de um sistema requer privilégios de root. Mas shutdown não é setuid, e, portanto, somente o root pode com êxito executá-lo. O programa shutdown é bom o suficiente para verificar seus privilégios e avisar se houver algum problema, mas mesmo que ele tenha tentado ingenuamente um desligamento do sistema, nada acontecerá.

GLENDOWER: I can call spirits from the vasty deep.
HOTSPUR: Why, so can I, or so can any man; But will they come when you do call for them?
(from Henry IV)

shutdown não é diferente de /bin/rm . Todos podem executá-lo, mas um usuário comum não pode remover /etc ou o diretório pessoal de outro usuário.

Especificamente: Apenas um processo executado com privilégios de root (UID efetivo 0) pode direcionar o sistema init para interromper os serviços do sistema , encerrar todos os processos do usuário e emitir a chamada de sistema que realmente interrompe a máquina. (Se shutdown fosse setuid, ele seria executado como root, não importando quem invocasse; mas não é.)

Que tal chamar shutdown de uma GUI, por ex. com controle-alt-del? É importante perceber que, nesse caso, shutdown é iniciado diretamente por init e ele é executado com privilégios de root. Portanto, todos os usuários que chegam ao console podem desativá-lo. Se isso não for desejável, control-alt-delete executará shutdown -a . (Veja a documentação que @ some1 citou em sua resposta). Isso diz ao shutdown para verificar se o usuário atualmente logado está autorizado a executá-lo. Mas isso é relevante apenas porque shutdown está sendo executado como root neste cenário.

    
por 04.12.2013 / 12:30
15

O binário shutdown em si verifica se o seu UID é 0.

Veja a saída strace de:

strace /sbin/shutdown -r -h now
...
...
geteuid()                               = 10001
setuid(10001)                           = 0
getuid()                                = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1)                           = ?
    
por 04.12.2013 / 12:10
5

Sim! Todo mundo pode executar esse comando. Como você disse, você pode executá-lo, mas está enfrentando uma mensagem "Precisa ser root", não um permission denied . O comando shutdown verifica seu UID para ver se você é root ou não.

    
por 04.12.2013 / 12:06
-1

Parece que o desligamento verificará uma lista de acesso se você sinalizar com -a:

ACCESS CONTROL
       shutdown can be called from init(8) when the magic keys CTRL-ALT-DEL are pressed, by creating an appropriate entry in /etc/inittab. This means that every‐
       one who has physical access to the console keyboard can shut the system down. To prevent this, shutdown can check to see if an authorized user  is  logged
       in  on  one of the virtual consoles. If shutdown is called with the -a argument (add this to the invocation of shutdown in /etc/inittab), it checks to see
       if the file /etc/shutdown.allow is present.  It then compares the login names in that file with the list of people that are logged in on a virtual console
       (from /var/run/utmp). Only if one of those authorized users or root is logged in, it will proceed. Otherwise it will write the message

       shutdown: no authorized users logged in

       to  the  (physical)  system  console.  The  format  of  /etc/shutdown.allow is one user name per line. Empty lines and comment lines (prefixed by a #) are
       allowed. Currently there is a limit of 32 users in this file.

Como você está chamando-o sem o sinalizador -a, o padrão é permitir apenas o desligamento root.

Se você quiser que usuários adicionais consigam executar o comando, configure esse arquivo e use o sinalizador.

Why can't I execute shutdown when the permission is rwxr-xr-x?

Os bits de permissão não excluem necessariamente o controle de acesso com base em um usuário ou grupo.

    
por 04.12.2013 / 12:12