Polkit Политики polkit Правила polkit Журналирование действий polkit Примеры Монтирование раздела и создание нового подключения без запроса пароля Монтирование устройств с запросом пароля Разрешение монтирования определённых usb-flash-накопителей Изменение Network Manager для администратора Polkit-правило разрешающее вносить изменения в утилиту управления принтерами без запроса пароля
Polkit (прежнее название: PolicyKit) — библиотека для UNIX-подобных операционных систем. API библиотеки используется для предоставления непривилегированным процессам возможности выполнения действий, требующих прав администратора. Использование Polkit противопоставляется использованию таких систем, как sudo, но не наделяет процесс пользователя правами администратора, а позволяет точно контролировать, что разрешено, а что запрещено.
Вы можете подробнее ознакомиться с работой политик Polkit, просмотрев наши обучающие видео:
на RuTube — Работа с политиками Polkit;
в Яндекс.Дзен — Работа с политиками Polkit;
в VK Видео — Работа с политиками Polkit.
На наших каналах вы также сможете найти много другой полезной информации.
Все политики находятся в /usr/share/polkit-1/actions/ в формате *.policy. Каждая политика представляет собой xml-файл, в котором описываются запросы к polkit. Каждый запрос имеет три условия, прописанных в секции defaults:
Внутри каждого тега прописывается возвращаемое значение. Используются следующие варианты значений:
admin - в РЕД ОС определён в правиле /etc/polkit-1/rules.d/50-default.rules:
polkit.addAdminRule(function(action, subject) { return ["unix-user:root"]; });
Менять напрямую политики нельзя, так как при обновлении системы они будут удалены. Необходимо создавать собственные правила в /etc/polkit-1/rules.d/ в формате *.rules. Правила выполняются в порядке названия по алфавиту, поэтому вначале пишутся цифры, чтобы указать приоритет правила. Алгоритм создания правила (все действия выполняются с правами пользователя root):
nano /etc/polkit-1/rules.d/99-vashe_pravilo.rules
polkit.addRule(function(action, subject) { if (action.id == "policy" && <ваше_условие>) { return polkit.Result.YES; }; });
где
subject.user == "<имя_пользователя>"
subject.isInGroup("<название_группы>")
Например, для локальной группы local, в которую входят пользователи user1, user2 и user3, указывается правило вида subject.isInGroup("local"); для доменной группы, в которую входят пользователи dom_user1, dom_user2 и dom_user3, указывается правило вида subject.isInGroup("пользователи домена"). По желанию для конкретных пользователей домена, которым необходимо настроить доступ или правило, можно создать отдельную группу и поместить в неё нужных пользователей, в таком случае в правиле следует прописать subject.isInGroup("<название_новой_отдельной_группы_доменных_пользователей>").
subject.isInGroup("local")
subject.isInGroup("пользователи домена")
subject.isInGroup("<название_новой_отдельной_группы_доменных_пользователей>")
Используя правила polkit, можно также делать записи в системный журнал. Метод log() записывает сообщение в системный журнал. Пример:
polkit.addRule(function(action, subject) { if (action.id == "действие") { polkit.log("action=" + action); polkit.log("subject=" + subject); }; });
В параметре action передается объект с информацией о совершенном процессе и связанные с этим действием параметры (например, если запрошенное действие - монтирование съемного диска, то в параметре action будут переданы серийный номер диска, его id, файловая система и т.д.).
В параметре subject передается объект с информацией о пользователе, запустившем процесс. Этот объект имеет следующие атрибуты:
Пользователи часто сталкиваются с необходимостью вводить пароль при монтировании разделов в файловом менеджере и создании нового подключения в NetworkManager, а также невозможностью извлечения usb-flash-накопителей или лотка оптического привода. За эти разрешения отвечают схемы, в которых описаны определенные доступные действия, предустановленные разработчиком ПО:
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-flash;
org.freedesktop.NetworkManager.settings.modify.system — разрешение на создание и модификацию системных сетевых соединений.
Настроим правила для пользователя, находящегося в системной группе xgrp, таким образом, чтобы запросы пароля не выполнялись для монтирования раздела и создания нового подключения. Для этого необходимо выполнить следующий алгоритм действий (все действия выполняются с правами пользователя root):
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 используется в качестве примера. При настройке правила необходимо указать название вашей группы или имени пользователя в зависимости от требований:
Наполним /etc/polkit-1/rules.d/99-networkmanager.rules следующим содержимым:
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.NetworkManager.settings.modify.system" && subject.isInGroup("xgrp")) { return polkit.Result.YES; }; });
Создадим системную группу xgrp (если её ещё нет):
groupadd -r xgrp
Добавим пользователя в группу xgrp:
gpasswd -a <имя_пользователя> xgrp
5. Перезапустим политики Polkit:
systemctl restart polkit
Рассмотрим пример создания правила, разрешающего пользователю выполнять монтирование и извлечение устройств с запросом пароля (при указании polkit.Result.AUTH_SELF — будет запрошен пароль текущего пользователя, polkit.Result.AUTH_ADMIN — администратора). Также рассмотрим добавление записи в системный журнал при подключении съемного устройства о том, какое устройство было подключено и каким пользователем.
Наполним /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-seats") { return polkit.Result.AUTH_SELF; }; });
2. Перезапустим политики Polkit:
При монтировании USB-диска в системном журнале появятся записи:
action [Action id='org.freedesktop.udisks2.filesystem-mount' device='/dev/sdb1' polkit.message='Authentication is required to mount $(drive)' partition.type='0x0b' partition.flags='0x00000000' drive='Kingston DataTraveler 3.0 (/dev/sdb1)' drive.revision='PMAP' partition.number='1' partition.uuid='cc06b6d9-01' drive.serial='E0D55EA574BEE52129D21523' id.type='vfat' id.version='FAT32' polkit.gettext_domain='udisks2' id.uuid='9BFA-18D3' drive.removable.media='thumb' drive.vendor='Kingston' drive.removable='true' id.usage='filesystem' drive.removable.bus='usb' drive.model='DataTraveler 3.0']
Таким образом, в системном журнале зарегистрировано, что usb-диск с серийным номером E0D55EA574BEE52129D21523 был подключен пользователем test.
Просмотреть факты подключения конкретного носителя можно, выполнив команду:
journalctl | grep "drive.serial='E0D55EA574BEE52129D21523'"
Создаём файл /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; }; });
Во втором правиле можно указать:
В данном примере разрешается монтирование usb-flash-накопителей с файловой системой "FAT32" или серийным номером "E0D55EA574BEE52129D21523".
Основной список доступных параметров вы можете получить при подключении usb-flash-накопителя и просмотре содержимого журнала:
journalctl |grep "org.freedesktop.udisks2.filesystem-mount-system"
Или в статусе сервиса политик Polkit:
systemctl status polkit
Создаём файл /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; } });
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 со следующим содержимым:
polkit.addRule(function(action, subject) { if (action.id == "org.opensuse.cupspkhelper.mechanism.all-edit" && subject.isInGroup("users")) { return polkit.Result.YES; } });
Указанная в созданном правиле группа users используется в качестве примера. При настройке правила необходимо указать название вашей группы или имени пользователя в зависимости от требований:
Дата последнего изменения: 04.09.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.
Нажимая «Отправить запрос», вы соглашаетесь с условиями обработки персональных данных.
Вы будете получать только актуальную информацию по обновлению безопасности
Подписываясь на уведомления, вы соглашаетесь с условиями обработки персональных данных.
На ваш почтовый адрес отправлено письмо с подтверждением подписки.