|
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. Подробности
Действия, которые может выполнить привилегированная программа, описываются в XML-файле с расширением .policy. Файл хранится в каталоге /usr/share/polkit-1/actions/.
Для изменения поведения системы авторизации polkit следует использовать правила авторизации. Изменения, сделанные в |
Пример описания действия, соответствующего команде "hostnamectl hostname <имя_узла>", находящегося в файле org.freedesktop.hostname1.policy:
<?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 указываются требования к авторизации пользователей:
allow_any – задаёт требования для любого пользователя. Необязательный элемент.allow_inactive – задаёт требования для пользователей с неактивным пользовательским сеансом. Необязательный элемент.allow_active – задаёт требования для пользователей с активным пользовательским сеансом. Необязательный элемент.allow_any, allow_inactive, allow_active должен содержать одно из значений:no – действие запрещено пользователю;yes – действие разрешено пользователю;auth_self – пользователь должен ввести свой пароль для прохождения авторизации;auth_admin – пользователь должен ввести пароль администратора для прохождения авторизации;auth_self_keep – аналогично auth_self, только успешная авторизация сохраняется на небольшой промежуток времени (e.g. five minutes);auth_admin_keep –аналогично auth_admin, только успешная авторизация сохраняется на небольшой промежуток времени (e.g. five minutes).Для вывода названий всех установленных 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/ |