2.4.11 Работа с политиками Polkit
Политики polkit
Определение администраторов в Polkit
Правила polkit
Журналирование действий polkit
Примеры действий, требующих подтверждения в Polkit
Монтирование разделов и работа с носителями без запроса пароля
Управление сетевыми подключениями без запроса пароля
Монтирование устройств с запросом пароля
Разрешение монтирования определённых USB-накопителей
Изменение Network Manager для администратора
Polkit-правило, разрешающее вносить изменения в утилиту управления принтерами без запроса пароля
Окружение
- Версия ОС: 7.3
- Конфигурация ОС: Рабочая станция, Сервер графический
- Редакция ОС: Стандартная
- Архитектура: x86_64
- Версия ПО: polkit-125-3
Polkit (ранее PolicyKit) — библиотека для UNIX-подобных операционных систем. API-библиотеки используется для предоставления непривилегированным процессам возможности выполнения действий, требующих прав администратора. Использование Polkit противопоставляется использованию таких систем, как sudo, но не наделяет процесс пользователя правами администратора, а позволяет точно контролировать, что разрешено, а что запрещено.
Вы можете подробнее ознакомиться с работой политик Polkit, просмотрев наши обучающие видео:
-
на RuTube — Работа с политиками Polkit;
-
в Яндекс.Дзен — Работа с политиками Polkit;
-
в VK Видео — Работа с политиками Polkit.
На наших каналах вы также сможете найти много другой полезной информации.
Политики polkit
Политики Polkit хранятся в файлах /usr/share/polkit-1/actions/*.policy. Каждая политика — это xml-файл с описанием запросов к Polkit. Каждый запрос имеет секции defaults с тегами:
-
<allow_any>— запрос от любого пользователя; -
<allow_inactive>— запрос от неактивного пользователя; -
<allow_active>— запрос от активного пользователя.
Внутри каждого тега указывается значение:
-
yes— предоставить разрешения; -
no— заблокировать разрешения; -
auth_self— пользователь должен ввести свой пароль для аутентификации; -
auth_self_keep— пользователь должен ввести свой пароль для аутентификации один раз за сессию, разрешение предоставляется для всей сессии; -
auth_admin— пользователь должен ввести пароль администратора при каждом запросе; -
auth_admin_keep— пользователь должен ввести пароль администратора, разрешение предоставляется для всей сессии.
Пример:
sudo nano /usr/share/polkit-1/actions/org.mate.system-log.policy
Пример содержимого секции defaults:
<defaults> <allow_any>no</allow_any> <allow_inactive>no</allow_inactive> <allow_active>auth_admin</allow_active> </defaults>
Определение администраторов в Polkit
В Polkit права администратора назначаются через файл /etc/polkit-1/rules.d/50-default.rules:
sudo nano /etc/polkit-1/rules.d/50-default.rules
Пример содержимого файла:
polkit.addAdminRule(function(action, subject) {
return ["unix-group:wheel"];
});
В данном случае все пользователи, входящие в группу wheel, считаются администраторами и получают соответствующие права в Polkit.
Правила polkit
Менять напрямую политики нельзя, так как при обновлении системы они будут удалены.
Необходимо создавать собственные правила в /etc/polkit-1/rules.d/ в формате *.rules. Файлы обрабатываются в порядке алфавита, поэтому для указания приоритета в начале имени файла используют цифры. Алгоритм создания правила (все действия выполняются с правами администратора):
1. Определите идентификатор действия (action id), которое требуется изменить:
pkaction
Доступные действия делятся на:
-
универсальные,
-
привязанные к среде рабочего стола,
-
привязанные к определенному приложению.
Для просмотра деталей определенного действия выполните команду:
pkaction -v -a org.freedesktop.udisks2.filesystem-mount-system
где org.freedesktop.udisks2.filesystem-mount-system замените на нужное действие.
2. Создайте новый файл с политикой:
sudo nano /etc/polkit-1/rules.d/<приоритет>-<описание>.rules
где:
-
<приоритет>— число 01–99. Файлы обрабатываются в порядке возрастания номера; чем меньше число, тем раньше применяется правило (например, 99 для локальных правил); -
<описание>— название правила (на латинице, без пробелов). Например:storage-mount.
3. Вставьте следующее содержимое:
polkit.addRule(function(action, subject) {
if (action.id == "<идентификатор_действия>" &&
subject.isInGroup("<группа>"))
{
return polkit.Result.YES;
}
});
где:
<идентификатор_действия>— точное название действия, полученное командой pkaction. Например:org.freedesktop.UDisks2.
subject.isInGroup("<группа>")— изменение политики для нескольких пользователей, находящихся в группе. Например:- для локальной группы local, в которую входят пользователи user1, user2 и user3, указывается правило вида
subject.isInGroup("local"); - для доменной группы, в которую входят пользователи dom_user1, dom_user2 и dom_user3, указывается правило вида
subject.isInGroup("<пользователи_домена>"); - для отдельных пользователей домена, которым требуется настроить доступ или правило, можно создать отдельную группу и поместить в неё нужных пользователей, в таком случае в правиле следует указать
subject.isInGroup("<название_новой_отдельной_группы_доменных_пользователей>");
Result.YES— при выполнении условия правила будет предоставлять разрешение.
Журналирование действий polkit
Используя правила polkit, можно также делать записи в системный журнал. Метод polkit.log() записывает сообщение в системный журнал, используется при отладке правил.
Создайте файл:
sudo nano /etc/polkit-1/rules.d/60-logging.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 — это разрешение на запуск программ от имени root через polkit.
В параметре action передается объект с информацией о совершенном процессе и связанные с этим действием параметры (например, если запрошенное действие — монтирование съемного диска, то в параметре action будут переданы серийный номер диска, его ID, файловая система и т.д.).
В параметре subject передается объект с информацией о пользователе, запустившем процесс. Этот объект имеет следующие атрибуты:
id— идентификатор процесса;user— имя пользователя;groups— список групп, в которые входит пользователь;seat— местонахождение субъекта (пустое значение, если местонахождение не локальное);session— сессия субъекта;local—true, только если местонахождение имеет локальный характер;active—true, только если сеанс активен.
Примеры действий, требующих подтверждения в Polkit
Пользователи часто сталкиваются с запросом пароля при:
-
монтировании разделов в файловом менеджере,
-
создании нового подключения в NetworkManager,
-
извлечении USB-накопителей или лотка оптического привода.
Эти операции контролируются схемами Polkit, которые описывают предустановленные доступные действия:
org.freedesktop.udisks2.filesystem-mount-system— разрешение на монтирование файловых систем системных устройств;org.freedesktop.udisks2.filesystem-mount-other-seat— разрешение на монтирование файловых систем с устройств, подключенных в другое место;org.freedesktop.udisks2.eject-media-other-seat— разрешение на извлечение лотка оптического привода;org.freedesktop.udisks2.power-off-drive-other-seat— разрешение на извлечение USB-накопителей;org.freedesktop.NetworkManager.settings.modify.system— разрешение на создание и модификацию системных сетевых соединений.
Монтирование разделов и работа с носителями без запроса пароля
Настройте правила для пользователей системной группы xgrp, чтобы запрос пароля не выполнялся при монтировании разделов и создании новых подключений. Для этого выполните следующую последовательность действий (все операции требуют прав администратора):
1. Создайте файл /etc/polkit-1/rules.d/99-udisk2_mount.rules:
sudo nano /etc/polkit-1/rules.d/99-udisk2_mount.rules
2. Добавьте следующее содержимое:
polkit.addRule(function(action, subject)
{
if (
(action.id == "org.freedesktop.udisks2.filesystem-mount-system" ||
action.id == "org.freedesktop.udisks2.filesystem-mount-other-seat" ||
action.id == "org.freedesktop.udisks2.eject-media-other-seat" ||
action.id == "org.freedesktop.udisks2.power-off-drive-other-seat")
&& subject.isInGroup("xgrp")
)
{
return polkit.Result.YES;
};
});
Группа xgrp приведена в качестве примера. Укажите группу или пользователя в зависимости от требований:
- для одного пользователя:
subject.user == "<имя_пользователя>"
- для группы пользователей (локальной или доменной):
subject.isInGroup("<название_группы>")
- для локальной группы local, в которую входят пользователи user1, user2 и user3, указывается правило вида:
subject.isInGroup("local")
- для доменной группы, в которую входят пользователи dom_user1, dom_user2 и dom_user3, указывается правило вида:
subject.isInGroup("<пользователи_домена>")
- можно создать отдельную группу для доменных пользователей и добавить в неё нужных участников. В этом случае в правиле указывается:
subject.isInGroup("<название_новой_группы_доменных_пользователей>")
Управление сетевыми подключениями без запроса пароля
Для управления сетевыми подключениями без запроса пароля выполните следующий алгоритм действий:
1. Создайте файл /etc/polkit-1/rules.d/99-networkmanager.rules:
sudo nano /etc/polkit-1/rules.d/99-networkmanager.rules
2. Добавьте в него следующее содержимое:
polkit.addRule(function(action, subject)
{
if (action.id == "org.freedesktop.NetworkManager.settings.modify.system" && subject.isInGroup("xgrp"))
{
return polkit.Result.YES;
};
});
3. Создайте системную группу xgrp (если её ещё нет):
sudo groupadd -r xgrp
4. Добавьте пользователя в группу xgrp:
sudo gpasswd -a <имя_пользователя> xgrp
Для применения изменений пользователь должен завершить сеанс и войти в него снова.
Монтирование устройств с запросом пароля
Рассмотрим пример создания правила, разрешающего пользователю выполнять монтирование и извлечение устройств с запросом пароля (при указании polkit.Result.AUTH_SELF — будет запрошен пароль текущего пользователя, polkit.Result.AUTH_ADMIN — администратора). Также рассмотрим добавление записи в системный журнал при подключении съемного устройства о том, какое устройство было подключено и каким пользователем.
1. Создайте файл /etc/polkit-1/rules.d/99-udisk2_mount.rules:
sudo nano /etc/polkit-1/rules.d/99-udisk2_mount.rules
Добавьте в него следующее содержимое:
polkit.addRule(function(action, subject)
{
polkit.log("action "+ action);
polkit.log("subject "+ subject);
if (action.id == "org.freedesktop.udisks2.filesystem-mount-system")
{
return polkit.Result.AUTH_SELF;
};
if (action.id == "org.freedesktop.udisks2.filesystem-mount")
{
return polkit.Result.AUTH_SELF;
};
if (action.id == "org.freedesktop.udisks2.filesystem-mount-other-seat")
{
return polkit.Result.AUTH_SELF;
};
});
2. Для проверки работы политики подключите USB-накопитель к компьютеру. Появится окно с подтверждением подлинности пользователя. Необходимо ввести пароль пользователя для монтирования.
Определите серийный номер USB-накопителя, выполнив:
lsblk --nodeps -o name,serial,model,vendor
Просмотреть факты подключения определенного носителя можно, выполнив команду:
journalctl | grep "SerialNumber: E0D55EA574BEE52129D21523"
где E0D55EA574BEE52129D21523 замените на серийный номер USB-накопителя.
Разрешение монтирования определённых USB-накопителей
Создайте файл /etc/polkit-1/rules.d/30-mount.rules:
sudo nano /etc/polkit-1/rules.d/30-mount.rules
Добавьте в него следующее содержимое:
polkit.addRule(function(action, subject) {
polkit.log("action "+ action);
if (action.id == "org.freedesktop.udisks2.filesystem-mount")
{
if (action.lookup("drive.serial") == "04GS1F3LBIBDWU05" || action.lookup("drive.serial") == "E0D55EA574BEE52129D21523")
return polkit.Result.YES;
else
return polkit.Result.NO;
};
});
Во втором случае вместо параметра NO — запрещено, можно указать AUTH_ADMIN — разрешено с вводом пароля администратора.
В данном примере разрешается монтирование USB-накопителей с серийными номерами 04GS1F3LBIBDWU05 или E0D55EA574BEE52129D21523.
Основной список доступных параметров можно получить с помощью команды:
pkaction --action-id org.freedesktop.udisks2.filesystem-mount --verbose
Изменение Network Manager для администратора
Создайте файл /etc/polkit-1/rules.d/60-sysvinit-nm.rules:
sudo nano /etc/polkit-1/rules.d/60-sysvinit-nm.rules
Добавьте в него следующее содержимое:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.NetworkManager.settings.modify.system")
{
return polkit.Result.AUTH_ADMIN;
}
});
После сохранения файла и перезагрузки системы изменение сетевых подключений через Network Manager будет доступно только администратору.
Polkit-правило, разрешающее вносить изменения в утилиту управления принтерами без запроса пароля
Создайте файл /etc/polkit-1/rules.d/40-allow-printers.rules:
sudo nano /etc/polkit-1/rules.d/40-allow-printers.rules
Добавьте в него следующее содержимое:
polkit.addRule(function(action, subject)
{
if (action.id == "org.opensuse.cupspkhelper.mechanism.all-edit") {
return polkit.Result.YES;
}
});
Ниже рассмотрено создание polkit-правила для группы пользователей, которое разрешает пользователям указанной группы вносить изменения в настройки утилиты по управлению принтерами (system-config-printer).
Создайте файл /etc/polkit-1/rules.d/40-allow-changing-printers.rules:
sudo nano /etc/polkit-1/rules.d/40-allow-changing-printers.rules
Добавьте в него следующее содержимое:
polkit.addRule(function(action, subject)
{
if (action.id == "org.opensuse.cupspkhelper.mechanism.all-edit" && subject.isInGroup("users"))
{
return polkit.Result.YES;
}
});
Указанная в созданном правиле группа users используется в качестве примера. При настройке правила укажите название вашей группы или имени пользователя в зависимости от требований:
- если необходимо изменить поведение политики для одного пользователя, пропишите
subject.user == "<имя_пользователя>"; - если необходимо изменить поведение политики для нескольких пользователей, входящих в одну группу как локальную, так и доменную, пропишите
subject.isInGroup("<название_группы>").
Например, для локальной группы local, в которую входят пользователи user1, user2 и user3, указывается правило вида subject.isInGroup("local"); для доменной группы, в которую входят пользователи dom_user1, dom_user2 и dom_user3, указывается правило вида subject.isInGroup("<пользователи_домена>"). Для определенных пользователей домена, которым необходимо настроить доступ или правило, можно создать отдельную группу и добавить в неё нужных пользователей, в таком случае в правиле следует указать subject.isInGroup("<название_новой_отдельной_группы_доменных_пользователей>").
Дата последнего изменения: 20.02.2026
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.