Polkit (PolicyKit) - это библиотека для операционных систем, основанных на UNIX. Её API предназначено для предоставления непривилегированным процессам возможности выполнять действия, требующие административных прав. Использование Polkit отличается от подхода, использующего систему sudo. При этом процесс пользователя не получает полные административные права, а позволяет точно регулировать, что разрешено, а что запрещено.
Polkit может контролировать отдельные действия, такие как запуск GParted: при этом он проверяет имя пользователя и принадлежность оного к группе, например, является ли он членом группы wheel. Далее Polkit проверяет, какими правами наделены пользователи данной группы (есть ли вообще права на запуск?) и, если всё сходится (пользователь в нужной группе и у группы есть соответствующие права), требует ввести пароль для идентификации пользователя.
Определения Polkit можно разделить на два вида:
/usr/share/polkit-1/actions
. Каждое действие имеет набор разрешений по умолчанию (например, для действия GParted нужно идентифицироваться как администратор)./usr/share/polkit-1/rules.d
./etc/polkit-1/rules.d
предназначен для локальной конфигурации.Polkit дополняет существующие системы разрешений в Linux, такие как членство в группах или административные права, не заменяя их. Файлы .rules определяют набор пользователей, указывают на определенные действия из файлов actions, и устанавливают ограничения на выполнение этих действий этими пользователями. Например, файл правил может отменить стандартное требование проходить аутентификацию в качестве администратора для всех пользователей при использовании GParted, указав, что некоторым конкретным пользователям это не требуется. Еще один пример: определенному пользователю может быть запрещено использовать GParted.
Действия (actions) определены в XML-файлах .policy, расположенных в каталоге /usr/share/polkit-1/actions. Для каждого действия указан набор разрешений по умолчанию.
Действия, доступные через polkit, зависят от установленных пакетов. Некоторые из них используются в нескольких средах рабочего стола (org.freedesktop.*), некоторые специфичны для конкретной среды рабочего стола (org.gnome.*), а некоторые специфичны для одной программы (org.xfce.thunar). Вывести список всех действий, определённых в /usr/share/polkit-1/actions можно, выполнив команду pkaction.
Все политики находятся в /usr/share/polkit-1/actions/ в формате *.policy Каждая политика представляет собой xml-файл, в котором описываются запросы к polkit.
Каждое действие определяется в теге <action> в файле .policy. Например, файл org.freedesktop.UDisks2.policy содержит несколько действий. Пример действия:
<action id="org.freedesktop.udisks2.filesystem-mount-system">
<description>Mount a filesystem on a system device</description>
<description xml:lang="ru">Монтировать файловую систему на системном устройстве</description>
<message>Authentication is required to mount the filesystem</message>
<message xml:lang="ru">Для монтирования файловой системы требуется подтверждение подлинности пользователя</message>
<message>Authentication is required to mount the filesystem</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
</action>
Элементы, которые используются внутри действия:
Каждый из элементов allow_any, allow_inactive и allow_active может содержать следующие значения:
Изменять напрямую действия (
/usr/share/polkit-1/actions
) нельзя, для этого следует создавать собственные правила/etc/polkit-1/rules.d/
в формате *.rules.
Определить какую политику необходимо изменить, для этого найти в /usr/share/polkit-1/actions/
требуемую.
Запустить редактирование нового файла правила:
sudo nano /etc/polkit-1/rules.d/99-rules_custom.rules
polkit.addRule(function(action, subject)
{
if (action.id == "policy" && <условие>)
{
return polkit.Result.YES;
};
});
где:
Пример:
/* Разрешить пользователям из группы admin запускать GParted без аутентификации */
polkit.addRule(function(action, subject) {
if (action.id == "org.gnome.gparted" &&
subject.isInGroup("admin")) {
return polkit.Result.YES;
}
});