18 янв. 2012 г.

Disable shutdown via ConsoleKit/PolicyKit

При свежей установке терминального сервера (Debian + LXDE + NX) случился пренеприятный косяк - приходящий в терминальный сеанс пользователь внезапно получал возможность остановить и перезагрузить сервер. При этом ни в группе powerdev, ни в sudoers, ни еще где-то записей об этом пользователе не было. Более того, из эмулятора терминала внутри nx-сессии также было невозможно сделать poweroff или reboot. 
Раз проблема проявляется только при взаимодействии с окружением рабочего стола, пришлось покопаться в PolicyKit. Однако, так как опыта тонкой настройки этого сервиса у меня нет, то я решил ограничиться следующим workaround-ом: в файле /etc/dbus-1/system.d/ConsoleKit.conf находим следующие строки:

    <allow send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Manager"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Seat"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Session"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.DBus.Properties" />
    <allow send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="Restart"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="CanRestart"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="Stop"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="CanStop"/>

и меняем на

<deny send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Manager"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Seat"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Session"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.DBus.Properties" />
    <deny send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="Restart"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="CanRestart"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="Stop"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="CanStop"/>


Таким образом все, кто входит в политику default (а это вообще все, ага ;) ), получают запрет на выполнение команд по выключению, перезагрузке, переходу в спящий режим и так далее. Конечно, главным недостатком этого "костыля" является то, что даже локальная X-сессия будет аналогично ограничена в возможности выключить компьютер. Но мы говорим о терминальном сервере, поэтому это некритично.