Как кнопка питания выключает компьютер без разрешения root?

36

Когда я пытаюсь выключить компьютер из командной строки или терминала, у меня должны быть права root:

amy@amy:~$ shutdown now
shutdown: Need to be root

а также

amy@amy:~$ halt
halt: Need to be root

но при выключении с помощью графического интерфейса пользователя, т.е. кнопки выключения или аппаратного выключения, у меня не запрашивается пароль для этого. Что это отключает для графического интерфейса, и почему ему не нужны пароль или привилегии root?

Я использую Ubuntu 11.04 Natty.

amyassin
источник
1
потому что если злоумышленник имеет физический доступ к вашему компьютеру, вы уже потеряли. Попытка помешать кому-либо, находящемуся в пределах досягаемости от ящика, сделать почти все, в лучшем случае является тактикой затягивания и в большинстве случаев создает больше неудобств для повседневных пользователей, чем для злоумышленника. Именно по этой причине большинство дистрибутивов Linux будут выдавать вам приглашение с правами суперпользователя при строгом обращении во время загрузки.
Джозеф Роджерс

Ответы:

33

Аппаратная кнопка питания запускает событие ACPI, которое acpid(демон ACPI) замечает и реагирует на него; в этом случае, выключив систему, хотя вы можете сделать так, как хотите. Демон ACPI работает от имени пользователя root, поэтому у него есть разрешение на выключение системы. Среды рабочего стола (например, gdmдля Gnome) обычно также запускаются с правами суперпользователя, поэтому я подозреваю, что они работают одинаково - у вас нет разрешения на выключение системы, но вы можете сказать, gdmчто хотите выключить ее, и она может сделать это на вашего имени

Михаил Мрозек
источник
это безопасно ?? «Вы могли бы сделать это, что вы хотите.
amyassin
7
Чтобы acpidсделать что-то отличное от уже существующего, вам нужно быть пользователем root, поэтому у вас уже есть разрешение на небезопасные действия. Также можно использовать системы MAC, такие как SELinux, для защиты acpid, ограничивая действия, которые им разрешено делать, даже если они работают от имени пользователя root.
Уоррен Янг
5
@amyassin Ну, чтобы изменить то, что он делает, вам нужны права суперпользователя; обычный пользователь не может сказать ему, что делать. Но acpidнастраивается, он может запускать разные сценарии в зависимости от аппаратных событий, которые он видит (например, я acpidзаблокировал компьютер, когда нажимаю кнопку питания)
Майкл Мрозек
7
@amyassen Если кто-то имеет физический доступ к вашей машине, тогда уже слишком поздно беспокоиться о безопасности - если кнопка питания не вызывает постепенного выключения, он может просто выдернуть шнур питания и вызвать постепенное выключение.
Шадур
3
Указанное «вредоносное программное обеспечение» должно было бы получить права root-пользователя и SUID, чтобы сообщить init о необходимости завершения работы при завершении работы - и опять же, к тому времени, когда он достигнет этой точки, у вас возникнут более серьезные проблемы, чем возможное завершение работы.
Шадур
11

В ответе Майкла правильно обсуждаются функции системы при использовании аппаратного переключателя питания, но большинство рабочих сред фактически используют dbusдля этой цели, а не делают это сами. Например, GNOME использует dbus's org.freedesktop.Hal.Device.SystemPowerManagement.Shutdownпри нажатии кнопки выключения. Когда он отправляется, он dbusвыполняет некоторые проверки, чтобы определить, авторизован ли пользователь, отправляющий сообщение, на выполнение выключения, и если это так, он выключает систему.

Вы можете подражать этому с помощью dbus-send. Например, чтобы завершить работу вашей системы dbus, используйте что-то вроде этого:

dbus-send --system --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
Крис Даун
источник