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

34

Estou dentro /sbine vejo que shutdowntem permissões rwxr-xr-x. Isso não significa que alguém possa executá-lo?

Korgan Rivera
fonte
11
qual é o comando que você executou e qual é o erro que você recebe?
slayedbylucifer
Acho que ele está falando sobre o shutdowncomando.
Vinz
Corri ./shutdown +30. Eu recebo "desligamento: precisa ser root". No entanto, se as permissões dizem que alguém pode executar, por que preciso ser root?
Korgan Rivera
Estou supondo que alguém possa desligar a máquina. Assim como em uma GUI, qualquer um pode desligá-la também. Mas se você está dizendo que precisa ser root, então eu não sei. Boa pergunta embora.
precisa saber é o seguinte
4
@ Kevdog777: Em um GUI PolicyKit gerencia isso. É um daemon com privilégios de root que verifica se você tem permissão para usar shutdown.
Vinz

Respostas:

76

Qualquer pessoa pode executar shutdown, mas acionar um desligamento do sistema requer privilégios de root. Mas shutdownnão é setuid e , portanto, somente o root pode executá-lo com êxito . O shutdownprograma é bom o suficiente para verificar seus privilégios e informá-lo se houver algum problema, mas mesmo que tentasse ingenuamente um desligamento do sistema, nada aconteceria.

GLENDOWER: Eu posso chamar espíritos das profundezas dos vasos.
HOTSPUR: Por que eu também posso, ou qualquer homem; Mas eles virão quando você os chamar?
(de Henrique IV)

shutdownnão é diferente de /bin/rm. Todos podem executá-lo, mas um usuário comum não pode remover /etcou o diretório inicial de outro usuário.

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

Que tal chamar shutdownde uma GUI, por exemplo, com control-alt-del? É importante perceber que, nesse caso, shutdowné iniciado diretamente inite executado com privilégios de root. Portanto, todo mundo que caminha até o console pode desligá-lo. Se isso não for desejável, control-alt-delete será executado shutdown -a. (Veja a documentação que @ some1 citou em sua resposta). Isso indica shutdownpara verificar se o usuário conectado no momento está autorizado a executá-lo. Mas isso é relevante apenas porque shutdownestá sendo executado como raiz nesse cenário.

alexis
fonte
2
Esclarecimento: Qualquer pessoa pode executar o programa shutdown, mas esse programa não pode realmente acionar o desligamento do sistema, a menos que o usuário atual tenha privilégios de root. Direita?
LarsH #
11
É praticamente isso. Os programas são executados com os privilégios do usuário que está chamando, a menos que estejam configurados. Desligar o sistema requer privilégios de root, portanto você também não pode escrever seu próprio programa (exceto pela exploração de falhas de segurança etc.).
Alexis4
O que significa "desligar não está configurado"?
Iain Samuel McLean Elder
11
@Iain, normalmente os programas são executados com as permissões do usuário que os invoca. Este também é o caso com shutdown. Um programa setuid é executado com as permissões do usuário que possui o executável. Por exemplo, /etc/passwdé executado com permissões de root para permitir que você modifique o arquivo de senha. Veja a página de manual para chmod.
Alexis
Isso deveria ter sido " /usr/bin/passwdexecutado com permissões de root"! /etc/passwdnão é executável (é o "arquivo de senhas" que está sendo modificado).
Alexis
15

O shutdownpróprio binário 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)                           = ?
caos
fonte
4
+1 por mostrar o uso do strace ... isso é útil. No entanto, não vejo como esse rastreamento mostra que shutdownverifica se o seu UID é 0. #
LarsH /
11
Você não verá isso na saída strace, pois apenas relata chamadas do sistema. Você pode deduzir que, quando um getuid é seguido de perto, escrevendo a mensagem de erro com a qual o código era semelhante if(getuid() != 0) printf("Need to be root");. Qual, de fato, o código fonte mostra que é.
precisa
5

Sim ! Todo mundo pode executar esse comando. Como você disse, você pode executá-lo, mas se depara com uma mensagem "Precisa ser root", e não com um permission denied. O shutdowncomando verifica UIDse você é root ou não.

Vinz
fonte
-1

Parece que o desligamento verificará uma lista de acesso se você a 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á atualmente chamando sem o sinalizador -a, o padrão é permitir apenas o desligamento da raiz.

Se você deseja que outros usuários possam 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.

some1
fonte
Chamar a -apartir da linha de comando não fará diferença: shutdown -aainda deve ser executado com permissões de root (que initfornece control-alt-del).
Alexis4