Como o gnome reinicia sem privilégios de root?

7

Estou lendo o livro desenvolvimento do kernel do Linux , no capítulo 5 "Implementação da chamada do sistema", página 77, diz

For example, capable(CAP_SYS_NICE) checks whether the caller has the ability to modify nice values of other processes. By default, the superuser possesses all capabilities and nonroot possesses none. For example, here is the reboot() system call. Note how its first step is ensuring that the calling process has the CAP_SYS_REBOOT . If that one conditional statement were removed, any process could reboot the system.

No entanto, no meu Debian Sid eu posso reiniciar minha máquina usando o gnome ou executando / sbin / reboot sem sudo ou su. Como isso é possível?

Talvez com o systemctl?

ls -l /sbin/reboot 
lrwxrwxrwx 1 root root 14 Jun 28 04:23 /sbin/reboot -> /bin/systemctl

EDIT: Meus grupos de usuários

[damian@xvz:~]$ groups 
damian sudo wireshark bumblebee

EDIT 2: permissões do systemctl

[damian@xvz:~]$ ls -l /bin/systemctl 
-rwxr-xr-x 1 root root 626640 Jun 28 04:23 /bin/systemctl
    
por osdamv 17.07.2015 / 21:32

1 resposta

10

Isso é feito por meio de um gerente de autorização chamado polkit :

polkit provides an authorization API intended to be used by privileged programs (“MECHANISMS”) offering service to unprivileged programs (“SUBJECTS”) often through some form of inter-process communication mechanism.

Com systemd e polkit usuários com sessão não remota podem emitir comandos relacionados à energia. Você pode listar todas as ações polkit registradas e obter detalhes sobre qualquer uma delas com pkaction (invocado sem argumentos, listará todos os IDs de ação). Nesse caso em particular, o ID da ação é org.freedesktop.login1.reboot , portanto, se você executar:

pkaction --action-id org.freedesktop.login1.reboot --verbose

a saída deve ser algo como:

org.freedesktop.login1.reboot:
  description:       Reboot the system
  message:           Authentication is required for rebooting the system.
  vendor:            The systemd Project
  vendor_url:        http://www.freedesktop.org/wiki/Software/systemd
  icon:              
  implicit any:      auth_admin_keep
  implicit inactive: auth_admin_keep
  implicit active:   yes

Aqui, active: yes significa que o usuário na sessão ativa está autorizado a reinicialize o sistema (detalhes sobre autorizações implícitas em polkit page). Você pode verificar se sua sessão está ativa com:

loginctl show-session $XDG_SESSION_ID --property=Active
Active=yes
    
por 17.07.2015 / 22:08