|
Polkit (ранее известный как PolicyKit) – система авторизации, позволяющая непривилегированному пользователю выполнять действия, требующие повышенных прав (например, монтирование жёсткого диска, запуск программы от имени другого пользователя). При этом сам пользователь не наделяется повышенными правами, что отличается от использования команд sudo и su.
При получении запроса от пользователя привилегированная программа обращается к менеджеру авторизации – системной службе polkitd. Менеджер авторизации решает – можно ли выполнить действие, запрошенное пользователем. Если менеджер авторизации разрешил, то привилегированная программа выполняет действие, запрошенное пользователем.
Для принятия решения менеджер авторизации polkitd может запросить у пользователя его пароль, чтобы убедиться, что действие запрашивается реальным пользователем. Или может запросить у пользователя пароль администратора, чтобы убедиться, что действие запрашивается реальным администратором. Для запроса пароля используется специальная программа – агент аутентификации.
Общение привилегированных программ и агента аутентификации с менеджером авторизации polkitd осуществляется с помощью системной шины D-Bus.
Описания действий, поддерживаемых привилегированной программой, входят в состав дистрибутива программы.
Поставщик операционной системы и системный администратор могут изменить поведение системы авторизации с помощью правил авторизации.
Система авторизации polkit не влияет на работу других способов увеличения прав пользователя. Например, у пользователя есть право запуска какой-то программы с помощью команды |
Официальная документация расположена на странице "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. Подробности
Вместе с привилегированной программой, поддерживающей polkit, устанавливается XML-файл "<адрес_получателя_на_D-BUS_шине>.policy". Где <адрес_получателя_на_D-BUS_шине> – это адрес получателя (путь объекта), под которым привилегированная программа регистрируется на системной шине D-BUS. Файл устанавливается в каталоге /usr/share/polkit-1/actions/.
В policy-файле хранятся описания действий, которые может выполнить привилегированная программа. Название действия формируется как "<адрес_получателя_на_D-BUS_шине>.<действие>".
Пример названия файла: "org.freedesktop.hostname1.policy".
Пример названия действия: "org.freedesktop.hostname1.set-hostname".
Название |
Для изменения поведения системы авторизации polkit следует использовать правила авторизации. Изменения, сделанные в |
Для поиска policy-файлов, связанных программой можно использовать команду "dpkg -L <название_пакета>":
dpkg -L systemd | grep policy |
Команда отобразит policy-файлы, установленные для программ, входящих в пакет systemd:
/usr/share/polkit-1/actions/org.freedesktop.hostname1.policy /usr/share/polkit-1/actions/org.freedesktop.locale1.policy /usr/share/polkit-1/actions/org.freedesktop.login1.policy /usr/share/polkit-1/actions/org.freedesktop.network1.policy /usr/share/polkit-1/actions/org.freedesktop.systemd1.policy /usr/share/polkit-1/actions/org.freedesktop.timedate1.policy /usr/share/polkit-1/actions/org.freedesktop.timesync1.policy |
Для поиска программы, с которой связан policy-файл, можно использовать команду "dpkg -S <путь_к_policy-файлу>":
dpkg -S /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy |
Команда отобразит, что файл /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy соответствует одной из программ, входящей в состав пакета systemd:
systemd: /usr/share/polkit-1/actions/org.freedesktop.hostname1.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, только успешная авторизация сохраняется на короткий промежуток времени (по умолчанию 5 минут);auth_admin_keep – аналогично auth_admin, только успешная авторизация сохраняется на короткий промежуток времени (по умолчанию 5 минут).В Astra Linux SE 1.8: для изменения длительности сохранения успешной авторизации auth_self_keep и auth_admin_keep:
/usr/lib/systemd/system/polkit.service к значению параметра ExecStart добавить опцию --default-expiration-time=<длительность_в_минутах>:ExecStart=/usr/lib/polkit-1/polkitd --no-debug --min-ilev-auth-admin=max --default-expiration-time=10 |
systemd, чтобы служба polkitd "подхватила" опцию --default-expiration-time:sudo systemctl daemon-reload |
Для отображения названий всех установленных 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 |
Правила авторизации используются для изменения поведения системы авторизации, заданного действиями в policy-файлах.
Правила хранятся в файлах с расширением .rules. Файлы могут располагаться в каталогах /etc/polkit-1/rules.d/ и /usr/share/polkit-1/rules.d/.
При старте polkitd считывает в память правила из rules-файлов. Файлы читаются в порядке следования их названий, отсортированных по алфавиту (вначале идут цифры, потом буквы). Если в каталогах присутствуют файлы с одним и тем же названием, то файл из каталога /etc/polkit-1/rules.d/ читается первым. Внутри файла правила читаются в том порядке, как они расположены в файле.
Для примера, следующие четыре файла будут прочитаны в порядке:
/etc/polkit-1/rules.d/10-auth.rules;/usr/share/polkit-1/rules.d/10-auth.rules;/etc/polkit-1/rules.d/15-auth.rules;/usr/share/polkit-1/rules.d/20-auth.rules.После добавления, удаления или изменения содержимого rules-файла служба polkitd автоматически заново перечитывает правила из rules-файлов.
Polkitd, получив запрос на проверку права пользователя выполнить действие, начинает выполнять правила в порядке их расположения в памяти. Выполнение правил останавливается на первом же правиле, которое вернёт какое-либо значение. Если ни одно правило не вернуло значение, то дальнейшее поведение Polkitd определяется действиями, описанными в policy-файлах.
Правила написаны на языке программирования JavaScript в виде методов глобального объекта polkit.
polkitДля написания правил используется глобальный объект polkit, который поддерживает несколько методов.
Более полная информация о правилах и их составлении дана на странице polkit или доступна по команде "man 8 polkit".
polkit.addRule( function(action, subject) {...} );Метод добавляет функцию function(action, subject), которая используется для проверки авторизации. Аргументами функциями являются объекты action и subject (см. описание объектов ниже).
В теле функции производится проверка права процесса (пользователя), заданного объектом subject, на выполнение действия, заданного объектом action .
Каждая функция должна возвращать результат проверки в виде одного из атрибутов объекта polkit.Result:
| Атрибут | Значение | Примечание |
|---|---|---|
polkit.Result.NO | "no" | |
polkit.Result.YES | "yes" | |
polkit.Result.AUTH_SELF | "auth_self" | |
polkit.Result.AUTH_SELF_KEEP | "auth_self_keep" | |
polkit.Result.AUTH_ADMIN | "auth_admin" | |
polkit.Result.AUTH_ADMIN_KEEP | "auth_admin_keep" | |
polkit.Result.NOT_HANDLED | null | Решение о доступе процесса (пользователя) к запрашиваемому действию не принято. Polkitd приступит к выполнению следующего по порядку правила |
Значения атрибутов соответствуют значениям элементов allow_* из policy-файлов, содержащих описания действий.
Пример?
polkit.addAdminRule( function(action, subject) {...} );Метод добавляет функцию function(action, subject), которая вызывается, когда требуется аутентифицировать администратора системы.
Функция используется для определения, кто является администратором системы.
Каждая функция должна возвращать массив, который может содержать строки:
| "unix-group:<group>" | ||
| "unix-netgroup:<netgroup>" | ||
| "unix-user:<user>" |
Если функция возвращает null, undefined or does not return a value at all, Polkitd приступит к выполнению следующего по порядку правила.
См. пример ....te
polkit.spawn( ["/путь/к/сторонней/программе/", "аргумент_программы_1", "аргумент_программы_2", ...] );Метод используется для запуска вспомогательной сторонней программы. Стандартный вывод этой программы будет возвращён как результат метода spawn.
polkit.log( message );Метод применяется для вывода дополнительной информации в системный журнал работы. Используется при отладке правил.
Метод используется не самостоятельно, а вызывается изнутри функции function(action, subject).
Параметр метода "message" – строка, которая будет выведена в системный журнал.
Для формирования строки "message" могут использоваться объекты action и subject (см. описание ниже).
См. пример использования метода log.
actionВнутрь функции function(action, subject) передаётся параметр action, который является объектом с информацией о действии, относительного которого проводится проверка.
Объект поддерживает один атрибут:
action.id – название проверяемого действия. pkexec значением атрибута action.id будет "org.freedesktop.policykit.exec".Объект поддерживает метод:
action.lookup( "<название_переменной>" ); – вывод значения переменной, установленной привилегированной программой.<название_переменной> отсутствует, то метод action.lookup вернёт неопределённое значение.pkexec устанавливает переменную program, содержащую путь до команды, запускаемой от имени другого пользователя. Для получения значения этой переменной используется метод action.lookup("program").При использовании объекта action без указания атрибута или метода, будут выведены одной строкой: название действия и переменные привилегированной программы.
Например, для настройки "polkit.log("action=" + action);" при запуске команды "pkexec -u administrator echo 33333" в журнал будет выведено:
окт 22 00:55:27 astra-28739 polkitd[18387]: action=[Action id='org.freedesktop.policykit.exec' program='/usr/bin/echo' user.display='administrator' command_line='/usr/bin/echo 33333' user='administrator' polkit.message='Authentication is needed to run `$(program)' as user $(user.display)' polkit.gettext_domain='polkit-1' user.gecos=''] |
Внутрь функции function(action, subject) передаётся параметр subject, который является объектом с информацией о процессе (пользователе) чьи права проверяются.
Атрибуты объекта:
| Атрибут | Тип | Описание |
|---|---|---|
subject.pid | int | Идентификатор процесса |
subject.user | string | Имя учётной записи пользователя |
subject.groups | string[] | Массив групп, в которых состоит пользователь |
subject.seat | string | Место, с которым связан объект subject. Пустое значение, если место не является локальным – например, если к локальному компьютеру подключился удалённый пользователь с помощью SSH |
subject.session | string | Сеанс, с которым связан объект subject |
subject.system_unit | string | Название systemd-юнита (если такой есть), к которому относится процесс pid |
subject.local | boolean | Истина, если место seat является локальным |
subject.no_new_privileges | boolean | Значение устанавливается, только если атрибут |
subject.active | boolean | Истина, если сеанс session активен |
Методы объекта:
| Метод | Возвращаемое значение |
|---|---|
subject.isInGroup( "<название_группы>" ); | Истина, если объект subject состоит в группе <название_группы> |
subject.isInNetGroup( "<название_сетевой_группы>" ); | Истина, если объект subject состоит в сетевой группе <название_сетевой_группы> |
При написании правил необходимо учитывать порядок следования правил относительно друг друга. Процесс обработки правил останавливается после первого правила, вернувшего результат.
В ОС Astra Linux, использующей мандатный контроль целостности, после создания какого-либо нового файла с правилом в каталогах Необходимо настроить мандатный контроль целостности для файла 10-default.rules либо, как временный вариант, разместить правило в уже существующем |
В Astra Linux в файле /usr/share/polkit-1/rules.d/50-default.rules содержится правило:
astra-admin назначаются администраторами системы:polkit.addAdminRule(function(action, subject) {
return ["unix-group:astra-admin"];
}); |
Журналирование следует использовать только на время отладки работы системы авторизации 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.polkitd выводить в системный журнал отладочные сообщения./usr/lib/systemd/system/polkit.service убрать из значения параметра ExecStart опцию "--no-debug":ExecStart=/usr/lib/polkit-1/polkitd --min-ilev-auth-admin=max |
systemd, чтобы служба polkitd "подхватила" удаление опции "--no-debug":sudo systemctl daemon-reload |
polkitd, чтобы она начала выводить отладочные сообщения в системный журнал:sudo systemctl restart polkit |
Для проверки вывода информации в журнал:
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] |
Правило:
hostnamectl hostname <имя_узла>" без ввода пароля:polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.hostname1.set-hostname") {
return polkit.Result.YES;
}
return polkit.Result.NOT_HANDLED;
}); |
Действие для команды "hostnamectl hostname <имя_узла>" описано в файле /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy.
Вместе с пакетом polkitd устанавливается файл /usr/share/doc/polkitd/50-local-allow.rules с нижеприведённым примером правила.
Правило:
sudo;systemctl restart apt-daily" без ввода пароля;50-local-allow.rules правило задано для службы apt-cacher-ng, которая отсутствует в Astra Linux;policy-файлах:polkit.addRule(function(action, subject) {
if (
subject.isInGroup("sudo")
&& action.id == "org.freedesktop.systemd1.manage-units"
&& action.lookup("unit") == "apt-daily.service"
&& action.lookup("verb") == "restart"
) {
return polkit.Result.YES;
}
return polkit.Result.NOT_HANDLED;
}); |
Действия для команды systemctl описаны в файле /usr/share/polkit-1/actions/org.freedesktop.systemd1.policy.
Вместе с пакетом polkitd устанавливается файл /usr/share/doc/polkitd/50-local-deny.rules с нижеприведённым примером правила.
Правило:
guest;hostnamectl для изменения настроек узла. 50-local-deny.rules правило задано для программы PackageKit, которая отсутствует в Astra Linux;policy-файлах:polkit.addRule(function(action, subject) {
if (subject.user !== "guest") {
return polkit.Result.NOT_HANDLED;
}
if (action.id == "org.freedesktop.NetworkManager.settings.modify.system") {
return polkit.Result.NO;
}
if (action.id.indexOf("org.freedesktop.hostname1.") == 0) {
return polkit.Result.NO;
}
return polkit.Result.NOT_HANDLED;
}); |
Действие для изменения сетевых настроек в программе NetworkManager описано в файле /usr/share/polkit-1/actions/org.freedesktop.NetworkManager.policy.
Действия для команды hostnamectl описаны в файле /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy.
Правило:
group1;hostnamectl hostname <имя_узла>" без ввода пароля;/usr/sbin/gparted" с вводом пароля администратора;polkit.addRule(function(action, subject) {
if ( ! subject.isInGroup("group1") ) {
return polkit.Result.NOT_HANDLED;
}
if (action.id == "org.freedesktop.hostname1.set-hostname") {
return polkit.Result.YES;
}
if (action.id == "org.gnome.gparted") {
return polkit.Result.AUTH_ADMIN;
}
return polkit.Result.NO;
}); |
Действие команды "hostnamectl hostname <имя_узла>" описано в файле /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy.
Действие программы GParted описано в файле /usr/share/polkit-1/actions/org.gnome.gparted.policy.
| Каталог | Описание |
|---|---|
| /usr/share/polkit-1/actions/ | Каталог policy-файлов с описаниями действий программ |
/etc/polkit-1/rules.d/ | Каталоги rules-файлов с правилами авторизации, созданными поставщиком операционной системы или системным администратором |
| /etc/polkit-1/localauthority/ /var/lib/polkit-1/localauthority/ | Каталоги с правилами авторизации в устаревшем pkla-формате. Эти правила будут работать, если установлен пакет polkitd-pkla (устанавливается автоматически при установке ОС по умолчанию). В будущих версиях ОС возможен отказ от поддержки pkla-формата, из-за чего потребуется переписать правила в JavaScript-формате |
| /usr/share/doc/polkitd/examples/ | Каталог содержит примеры правил авторизации: 50-local-allow.rules и 50-local-deny.rules, описание которых дано в статье |