Запуск привилегированных приложений с pkexec (PolicyKit)
Добавлено: 20 июл 2018, 16:13
предположим, что нам периодически необходимо запускать текстовый редактор от рута без участия терминала.
Тут самое время в очередной всплакнуть по
Для этого достаточно только описать его разрешения в отдельном xml-конфиге. для
Краткое пояснение по значениям полей блока
несмотря на обилие строк в XML, по факту, для разных приложений, если не требуется настраивать тонкие политики - в данном шаблоне будут правиться только строки
Вот и все, в общем-то
Для запуска редактора с нужными правами достаточно выполнить
окошко с полиси
В завершении можно отметить, что большинство приложений как и
но в мышетыкательных сценариях run as root может вполне пригодиться 
UPD. Для любителей старых привычек - можно сделать симлинк с
Тут самое время в очередной всплакнуть по
gksu
, но не будем, т.к. выпилили его вполне обснованно- последняя на сегодня версия 2.02 была выпущена еще в 2009 году, после чего патчилась уже мейнтенерами дистрибутивов
- На сегодня известна как минимум одна немолодая уязвимость данного пакета, компрометирующая безопасность системы
- В отличии от sudo - подменялся идентификатор пользователя, и корректировал права и владельца по умолчанию.
- На странице проекта gksu кррасуется мощная надпись "gksu is being replaced by PolicyKit"
- Выпилен сначала из debian testing, следом не вошел в очередной LTS Ubuntu 18.04 и LM 19, Arch Linux выкинул пакет из основного репозитория в AUR
Для этого достаточно только описать его разрешения в отдельном xml-конфиге. для
xed
- cоздадим файлик /usr/share/polkit-1/actions/org.gnome.xed.policy
Код: Выделить всё
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<vendor>The Linux Mint Russian Community</vendor>
<vendor_url>https://linuxmint.com.ru/</vendor_url>
<icon_name>xed</icon_name>
<action id="org.gnome.xed">
<description gettext-domain="xed">Run xed as root</description>
<message gettext-domain="xed">Authentication is required to run the Xed Editor as root</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>auth_admin</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/xed</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>
Краткое пояснение по значениям полей блока
<policyconfig>
- vendor - название разработчика программного обеспечения (вендора) или имя проекта (необязательный элемент).
- vendor_url - URL проекта или вендора (необязательный элемент).
- icon_name - имя значка, представляющего проект или вендора (необязательный элемент).
- action - это элемент, который содержит внутри себя другие элементы. В открывающем тэге action обязательно указывается идентификатор действия - id, который передается по шине D-Bus.
Элементов action в одном файле может быть несколько. Внутри элемента action можно найти:- description - краткое описание действия, понятное человеку. Элементов description может быть несколько, например, для разных языков.
- message - понятное оператору сообщение, которое будет появляться в окне запроса авторизации, если она потребуется. Элементов message может быть несколько, например, для разных языков.
- defaults - этот элемент определяет необходимость и тип авторизации по умолчанию для действия, указанного в элементе action.
Здесь возможно использование трех необязательных элементов, определяющих неявные разрешения для клиентов, работающих в локальной консоли:- allow_any - для любых клиентов;
- allow_inactive - для клиентов неактивных сеансов;
- allow_active - для клиентов активных сеансов;
Элементы allow_any, allow_inactive и allow_active могут содержать следующие значения:- no - действие не разрешается;
- yes - действие разрешается;
- auth_self - требуется аутентификация от имени владельца сеанса;
- auth_admin - требуется аутентификация от имени суперпользователя, что является более серьезным ограничением, чем предыдущий вариант;
- auth_self_keep - то же, что и auth_self, но разрешение имеет силу в течение некоторого небольшого периода времени (например, пять минут);
- auth_admin_keep - то же, что и auth_admin, но разрешение имеет силу в течение некоторого небольшого периода времени (например, пять минут);
несмотря на обилие строк в XML, по факту, для разных приложений, если не требуется настраивать тонкие политики - в данном шаблоне будут правиться только строки
action id
, description
, message
и exec.path
Вот и все, в общем-то

pkexec xed
(этот вызов можно использовать в кнопках запуска и пунктах меню)окошко с полиси
org.gnome.xed
запросит пароль и отдаст приложение
Если же мы хотим разрешить пользователю запускать данный экземпляр софта вовсе без запроса пароля - то проставим поле <allow_active>yes</allow_active>
, и программа будет запущена привилегированной сразу и без лишних вопросов. Аккуратней с такими разрешениями, желательно не перестараться в угоду своей лени 
В завершении можно отметить, что большинство приложений как и
xed
норм отработает от sudo appname
, а те которые действительно требовали для запуска этих манипуляций - уже обычно несут в пакете файлы полиси, например Gparted (ранее работавший от gksu):
Код: Выделить всё
chocobo@desktop:~$ dpkg -S gparted | grep polkit
gparted: /usr/share/polkit-1/actions/org.gnome.gparted.policy

UPD. Для любителей старых привычек - можно сделать симлинк с
pkexec
на gksu
, чтоб было почти "как раньше" 
sudo ln /usr/bin/pkexec /usr/bin/gksu