|
Polkit (ранее известный как PolicyKit) – система авторизации, позволяющая непривилегированному пользователю выполнять действия, требующие повышенных прав (например, монтирование жёсткого диска, запуск программы от имени другого пользователя). При этом сам пользователь не наделяется повышенными правами, что отличается от использования команд sudo и su.
При получении запроса от пользователя привилегированная программа обращается к менеджеру авторизации – системной службе polkitd. Менеджер авторизации решает – можно ли выполнять действие, запрошенное пользователем. Если менеджер авторизации разрешил, то привилегированная программа выполняет действие, запрошенное пользователем.
Для принятия решения менеджер авторизации polkitd может запросить у пользователя его пароль, чтобы убедиться, что действие запрашивается реальным пользователем. Или может запросить у пользователя пароль администратора, чтобы убедиться, что действие запрашивается реальным администратором. Для запроса пароля используется специальная программа – агент аутентификации.
Общение привилегированных программ и агента аутентификации с менеджером авторизации polkitd осуществляется с помощью системной шины D-Bus.
Описания действий, поддерживаемых привилегированной программой, входят в состав дистрибутива программы.
Системный администратор и поставщик операционной системы могут донастроить систему авторизации с помощью правил авторизации.
Официальная документация расположена на странице "polkit Reference Manual".
В набор программ polkit входят:
| Программа | Описание |
|---|---|
| polkitd | Менеджер авторизации. Системная служба |
| pkcheck | Программа для проверки наличия у процесса права на выполнение определённого действия |
| pkaction | Программа для вывода описания polkit-действия |
| pkexec | Программа для запуска команды от имени другого пользователя |
| pkttyagent | Текстовой агент аутентификации |
Алгоритм работы системы авторизации polkit:
polkitd, чтобы проверить право пользователя на выполнение запрошенного действия.polkitd исходя из хранящихся описаний действий и правил авторизации:polkitd получено разрешение, то привилегированная программа выполняет действие, запрошенное программой пользователя.
Рисунок 1. Схема работы системы авторизации polkit
Агент аутентификации автоматически запускается при старте пользовательского сеанса.
Когда требуется аутентифицировать пользователя, тогда открывается окно агента. В окне отображается информация для чего требуется ввести пароль, а также поле для ввода пароля пользователя.
Внешний вид агента зависит от рабочего стола пользователя. Так, в Astra Linux SE для рабочего стола Fly используется агент /usr/lib/x86_64-linux-gnu/libexec/polkit-kde-authentication-agent-1.

Рисунок 2. Окно агента аутентификации polkit-kde-authentication-agent-1
Если требуется ввести пароль администратора, а не пользователя сеанса, то в окне также отображается для какого пользователя требуется ввести пароль.

Рисунок 3. Окно агента аутентификации polkit-kde-authentication-agent-1. Отображается пользователь, чей пароль требуется ввести.
При нажатии на кнопку "Подробности >>" отображается дополнительная информация о запрошенном действии.

Рисунок 4. Окно агента аутентификации polkit-kde-authentication-agent-1. Подробности
Вместе с программой, поддерживающей polkit-авторизацию, устанавливается файл с описанием действий, выполняемых программой.
Не следует вносить какие-либо изменения в файлы Для изменения поведения системы авторизации polkit необходимо использовать правила авторизации (см. соответствующий подраздел). |
Для использования polkit привилегированная программа должна иметь набор действий. Каждое действие соответствует операции, которую пользователь может запросить выполнить у привилегированной программы. Действия описываются в XML-файлах с расширением .policy, которые устанавливаются в каталог /usr/share/polkit-1/actions/.
Для привилегированной программы, использующей polkit, в каталоге /usr/share/polkit-1/actions/ храниться файл с расширением .policy. В файле описаны действия, выполняемые программой.
Пример файла org.freedesktop.hostname1.policy с описанием действия, соответствующего команде "host":namectl hostname <имя_узла>
<?xml version="1.0" encoding="UTF-8"?> <!--*-nxml-*-->
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"https://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<!--
SPDX-License-Identifier: LGPL-2.1-or-later
...
-->
<policyconfig>
<vendor>The systemd Project</vendor>
<vendor_url>https://systemd.io</vendor_url>
<action id="org.freedesktop.hostname1.set-hostname">
<description gettext-domain="systemd">Set hostname</description>
<message gettext-domain="systemd">Authentication is required to set the local hostname.</message>
<defaults>
<allow_any>auth_admin_keep</allow_any>
<allow_inactive>auth_admin_keep</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
</action>
...
</policyconfig> |
В файле *.policy отдельное действие описывается в блоке action. Название действия указывается в атрибуте id элемента action.
В элементе description дано описание действия. Возможна локализация описания.
В элементе message дано сообщение, которое отображается в окне агента аутентификации, когда у пользователя запрашивается пароль. Возможна локализация сообщения.
В блоке defaults описываются требования к авторизации пользователей:
Для вывода названий всех установленных polkit-действий используется команда:
pkaction |
Вывод команды:
com.hp.hplip.installplugin com.redhat.tuned.active_profile com.redhat.tuned.auto_profile com.redhat.tuned.disable com.redhat.tuned.get_all_plugins com.redhat.tuned.get_instances ... |
Для вывода информации о действии используется команда:
pkaction -v -a <название_действия> |
Пример команды:
pkaction -v -a com.hp.hplip.installplugin |
Вывод команды:
com.hp.hplip.installplugin: description: Install a plug-in into a HP printer message: System policy prevents installation of a printer plug-in vendor: HP Development Company vendor_url: http://hplip.net/ icon: implicit any: no implicit inactive: no implicit active: auth_admin |
Изначально поведение системы авторизации polkit определяется действиями, заданными в файлах *.policy. Поведение системы авторизации можно изменить с помощью правил авторизации.
Правила хранятся в файлах с расширением .rules. Файлы могут располагаться в каталогах /etc/polkit-1/rules.d/ и /usr/share/polkit-1/rules.d/.
Правила написаны на языке программирования JavaScript. Для взаимодействия с polkitd используется глобальный объект polkit, который поддерживает методы:
Более полная информация о правилах и их составлении дана на странице polkit или доступна по команде "man 8 polkit".
Файл /usr/share/polkit-1/rules.d/50-default.rules содержит правило, которым пользователи группы astra-admin назначаются администраторами системы:
polkit.addAdminRule(function(action, subject) {
return ["unix-group:astra-admin"];
}); |
Прим. работает в Astra 1.8.3.7 Орёл, не работает в 1.8.3.7 Смоленск. - окт 16 11:27:46 astra-57029 polkitd[4481]: Insufficient integrity level of file '/etc/polkit-1/rules.d/10-default.rules'
Использовать только для отладки!
Сделаем, чтобы при вызове команды pkexec в системный журнал выводилась дополнительная информация о действии и пользователе, запросившем это действие.
Для этого:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.policykit.exec") {
polkit.log("action=" + action);
polkit.log("subject=" + subject);
}
}); |
[Unit] Description=Authorization Manager Documentation=man:polkit(8) [Service] Type=dbus BusName=org.freedesktop.PolicyKit1 ExecStart=/usr/lib/polkit-1/polkitd --min-ilev-auth-admin=max |
sudo journalctl -f |
pkexec -u administrator echo "test" |
сен 22 12:51:44 astra-28739 polkitd[7867]: action=[Action id='org.freedesktop.policykit.exec' program='/usr/bin/echo' user.display='administrator' command_line='/usr/bin/echo test' user='administrator' polkit.message='Authentication is needed to run `$(program)' as user $(user.display)' polkit.gettext_domain='polkit-1' user.gecos=''] сен 22 12:51:44 astra-28739 polkitd[7867]: subject=[Subject pid=4297 user='administrator' groups=administrator,tty,dialout,cdrom,floppy,audio,dip,video,plugdev,users,netdev,lpadmin,scanner,astra-admin,astra-console seat=null session='7' local=false active=true] |
| /usr/share/polkit-1/actions/ | |
| /usr/share/polkit-1/rules.d/ | |
| /etc/polkit-1/rules.d/ | |
| /etc/polkit-1/localauthority/ /var/lib/polkit-1/localauthority/ | Debian 13: For consistency with upstream and other distributions, the polkit ... as changed the syntax and location for local policy rules. You should now write local rules for customizing the security policy in JavaScript, and place them at /etc/polkit-1/rules.d/*.rules. Previously, rules could be written in pkla format, and placed in subdirectories of /etc/polkit-1/localauthority or /var/lib/polkit-1/localauthority. However, .pkla files should now be considered deprecated, and will only continue to work if the polkitd-pkla package is installed. ...so any local policy overrides will need to be migrated to the JavaScript format. |
| /usr/share/doc/polkitd/examples/ |