Данная статья применима к:
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8).
Введение
Polkit (ранее известный как PolicyKit) – система авторизации, позволяющая непривилегированному пользователю выполнять действия, требующие повышенных прав (например, монтирование жёсткого диска, запуск программы от имени другого пользователя). При этом сам пользователь не наделяется повышенными правами, что отличается от использования команд sudo и su.
При получении запроса от пользователя привилегированная программа обращается к менеджеру авторизации – системной службе polkitd. Менеджер авторизации решает – можно ли выполнить действие, запрошенное пользователем. Если менеджер авторизации разрешил, то привилегированная программа выполняет действие, запрошенное пользователем.
Для принятия решения менеджер авторизации polkitd может запросить у пользователя его пароль, чтобы убедиться, что действие запрашивается реальным пользователем. Или может запросить у пользователя пароль администратора, чтобы убедиться, что действие запрашивается реальным администратором. Для запроса пароля используется специальная программа – агент аутентификации.
Общение привилегированных программ и агента аутентификации с менеджером авторизации polkitd осуществляется с помощью системной шины D-Bus.
Описания действий, поддерживаемых привилегированной программой, входят в состав дистрибутива программы.
Поставщик операционной системы и системный администратор могут изменить поведение системы авторизации с помощью правил авторизации.
Официальная документация расположена на странице "polkit Reference Manual".
В набор программ polkit входят:
| Программа | Описание |
|---|---|
| polkitd | Менеджер авторизации. Системная служба |
| pkcheck | Программа для проверки наличия у процесса права на выполнение определённого действия |
| pkaction | Программа для отображения информации о действии |
| 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 следует использовать правила авторизации.
Изменения, сделанные в policy-файлах, будут утеряны при обновлении программ.
Пример описания действия, соответствующего команде "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, только успешная авторизация сохраняется на короткий промежуток времени;
-auth_admin_keep– аналогичноauth_admin, только успешная авторизация сохраняется на короткий промежуток времени.
Указанные значения требований можно изменить с помощью правил авторизации.
Для отображения названий всех установленных polkit-действий используется команда:
Вывод команды:
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 ...
Для вывода информации о действии используется команда:
Пример команды:
Вывод команды:
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
Правила авторизации
Описание правил авторизации
Правила авторизации используются для изменения поведения системы авторизации, заданного действиями в policy-файлах.
Правила хранятся в файлах с расширением .rules. Файлы могут располагаться в каталогах /etc/polkit-1/rules.d/ и /usr/share/polkit-1/rules.d/.
Polkitd читает rules-файлы в порядке следования названий файлов, отсортированных по алфавиту (вначале идут цифры, потом буквы). Если в каталогах присутствуют файлы с одним и тем же названием, то файл из каталога /etc/polkit-1/rules.d/ читается первым.
Правила написаны на языке программирования JavaScript в виде методов глобального объекта polkit.
Поддерживаются методы:
- addRule – для добавления правила авторизации;
- addAdminRule – для указания, кто является администратором;
- log – для вывода дополнительной информации в системный журнал работы. Используется при отладке правил.
- spawn – для запуска вспомогательной сторонней программы. Стандартный вывод этой программы будет возвращён как результат метода spawn.
Polkitd выполняет правила в том порядке, как они идут в rules-файлах. Выполнение правил останавливается на первом же правиле, которое вернёт какое-нибудь значение. Если ни одно правило не вернуло значение, то дальнейшее поведение Polkitd определяется действиями, описанными в policy-файлах.
Более полная информация о правилах и их составлении дана на странице polkit или доступна по команде "man 8 polkit".
Назначение администратора операционной системы (пример использования метода addAdminRule)
В Astra Linux с помощью правила, содержащегося в файле /usr/share/polkit-1/rules.d/50-default.rules, пользователи группы astra-admin назначаются администраторами системы:
polkit.addAdminRule(function(action, subject) {
return ["unix-group:astra-admin"];
});
Отладочное журналирование (пример использования метода log)
Журналирование следует использовать только на время отладки работы системы авторизации polkit.
Сделаем, например, чтобы при вызове команды pkexec в системный журнал выводилась дополнительная информация о действии и о пользователе, запустившем эту команду:
- Создать файл
/etc/polkit-1/rules.d/10-default.rulesс правилом:гдеpolkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.policykit.exec") { polkit.log("action=" + action); polkit.log("subject=" + subject); } });org.freedesktop.policykit.exec– название действия, соответствующего команде pkexec.В ОС Astra Linux, использующей мандатный контроль целостности, после создания какого-либо нового файла с правилом в каталогах
/etc/polkit-1/rules.d/и/usr/share/polkit-1/rules.d: polkitd перестаёт работать, а в системном журнале появляется запись:
polkitd[5403]: Insufficient integrity level of file '/etc/polkit-1/rules.d/10-default.rules'Необходимо настроить мандатный контроль целостности для файла 10-default.rules либо, как временный вариант, разместить правило в уже существующем
rules-файле. - Разрешить службе
polkitdвыводить в системный журнал отладочные сообщения.
Для этого в файле systemd-юнита/usr/lib/systemd/system/polkit.serviceубрать из значения параметраExecStartопцию--no-debug:[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
- Перечитать настройки системного менеджера
systemdи перезапустить службуpolkitd:sudo systemctl daemon-reload
sudo systemctl restart polkit
- Запустить команду:pkexec -u administrator echo "test"
- В системном журнале появятся записи о действии "action=..." и о пользователе "subject=...":
сен 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/ | Каталог policy-файлов с описаниями действий программ. |
/etc/polkit-1/rules.d/ | Каталог rules-файлов с правилами авторизации, созданными системным администратором. |
/usr/share/polkit-1/rules.d/ | Каталог rules-файлов с правилами авторизации, созданными поставщиком операционной системы. |
| /etc/polkit-1/localauthority/ /var/lib/polkit-1/localauthority/ | Каталоги с правилами авторизации в устаревшем pkla-формате. Эти правила будут работать, если установлен пакет polkitd-pkla. Рекомендуется преобразовать правила в актуальный JavaScript-формат. |
| /usr/share/doc/polkitd/examples/ | Каталог содержит примеры правил авторизации. |



