3.4.9 Работа с политиками Polkit
Скачать документ Polkit
Политики polkit
Правила polkit
Журналирование действий polkit
Примеры
Монтирование раздела и создание нового подключения без запроса пароля
Монтирование устройств с запросом пароля
Разрешение монтирования определённых usb-flash-накопителей
Изменение Network Manager для администратора
Polkit-правило разрешающее вносить изменения в утилиту управления принтерами без запроса пароля
Polkit
Polkit (прежнее название: PolicyKit) — библиотека для UNIX-подобных операционных систем. API библиотеки используется для предоставления непривилегированным процессам возможности выполнения действий, требующих прав администратора. Использование Polkit противопоставляется использованию таких систем, как sudo, но не наделяет процесс пользователя правами администратора, а позволяет точно контролировать, что разрешено, а что запрещено.
Вы можете подробнее ознакомиться с работой политик Polkit, просмотрев наши обучающие видео:
на RuTube — Работа с политиками Polkit;
в Яндекс.Дзен — Работа с политиками Polkit;
в VK Видео — Работа с политиками 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 - пользователь должен ввести пароль admin при каждом запросе;
- auth_admin_keep - пользователь должен ввести пароль admin, разрешение предоставляется для всей сессии.
admin - в РЕД ОС определён в правиле /etc/polkit-1/rules.d/50-default.rules:
polkit.addAdminRule(function(action, subject)
{
return ["unix-user:root"];
});
Правила polkit
Менять напрямую политики нельзя, так как при обновлении системы они будут удалены. Необходимо создавать собственные правила в /etc/polkit-1/rules.d/ в формате *.rules. Правила выполняются в порядке названия по алфавиту, поэтому вначале пишутся цифры, чтобы указать приоритет правила. Алгоритм создания правила (все действия выполняются с правами пользователя root):
- Сначала определяем, какую политику мы хотим изменить, для этого находим в /usr/share/polkit-1/actions/ требуемую.
- Редактируем новый файл с политикой:
nano /etc/polkit-1/rules.d/99-vashe_pravilo.rules
- Вставляем следующий текст:
polkit.addRule(function(action, subject)
{
if (action.id == "policy" && <ваше_условие>)
{
return polkit.Result.YES;
};
});
где
- вместо 99 подставляем нужное число (файлы с политиками просматриваются в лексикографическом порядке, 99 будет последним правилом);
- вместо policy пишем название политики, поведение которой нужно изменить;
- вместо <ваше_условие>:
- если необходимо изменить поведение политики для одного конкретного пользователя, пропишите
subject.user == "<имя_пользователя>"
, - если необходимо изменить поведение политики для нескольких пользователей, входящих в одну группу как локальную, так и доменную, пропишите
subject.isInGroup("<название_группы>")
.
Например, для локальной группы local, в которую входят пользователи user1, user2 и user3, указывается правило вида
subject.isInGroup("local")
; для доменной группы, в которую входят пользователи dom_user1, dom_user2 и dom_user3, указывается правило видаsubject.isInGroup("пользователи домена")
. По желанию для конкретных пользователей домена, которым необходимо настроить доступ или правило, можно создать отдельную группу и поместить в неё нужных пользователей, в таком случае в правиле следует прописатьsubject.isInGroup("<название_новой_отдельной_группы_доменных_пользователей>")
. - если необходимо изменить поведение политики для одного конкретного пользователя, пропишите
- Result.YES означает, что политика при выполнении условия правила будет предоставлять разрешение.
Журналирование действий polkit
Используя правила polkit, можно также делать записи в системный журнал. Метод log() записывает сообщение в системный журнал. Пример:
polkit.addRule(function(action, subject)
{
if (action.id == "действие")
{
polkit.log("action=" + action);
polkit.log("subject=" + subject);
};
});
В параметре action передается объект с информацией о совершенном процессе и связанные с этим действием параметры (например, если запрошенное действие - монтирование съемного диска, то в параметре action будут переданы серийный номер диска, его id, файловая система и т.д.).
В параметре subject передается объект с информацией о пользователе, запустившем процесс. Этот объект имеет следующие атрибуты:
- id – идентификатор процесса;
- user – имя пользователя;
- groups – список групп, в которые входит пользователь;
- seat – местонахождение субъекта (пустое значение, если местонахождение не локальное);
- session – сессия субъекта;
- local – true, только если местонахождение имеет локальный характер;
- active – true, только если сеанс активен.
Примеры
Пользователи часто сталкиваются с необходимостью вводить пароль при монтировании разделов в файловом менеджере и создании нового подключения в 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):
- Наполним /etc/polkit-1/rules.d/99-udisk2_mount.rules следующим содержимым:
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("<название_новой_отдельной_группы_доменных_пользователей>")
.
Наполним /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:
systemctl restart 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'"
Разрешение монтирования определённых usb-flash накопителей
Создаём файл /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;
};
});
Во втором правиле можно указать:
- AUTH_ADMIN – разрешено с вводом пароля администратора;
- NO – не разрешено вообще.
В данном примере разрешается монтирование usb-flash-накопителей с файловой системой "FAT32" или серийным номером "E0D55EA574BEE52129D21523".
Основной список доступных параметров вы можете получить при подключении usb-flash-накопителя и просмотре содержимого журнала:
journalctl |grep "org.freedesktop.udisks2.filesystem-mount-system"
Или в статусе сервиса политик Polkit:
systemctl status polkit
Изменение Network Manager только для администратора
Создаём файл /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-правило разрешающее вносить изменения в утилиту управления принтерами без запроса пароля
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 используется в качестве примера. При настройке правила необходимо указать название вашей группы или имени пользователя в зависимости от требований:
- если необходимо изменить поведение политики для одного конкретного пользователя, пропишите
subject.user == "<имя_пользователя>"
, - если необходимо изменить поведение политики для нескольких пользователей, входящих в одну группу как локальную, так и доменную, пропишите
subject.isInGroup("<название_группы>")
.
Например, для локальной группы local, в которую входят пользователи user1, user2 и user3, указывается правило вида subject.isInGroup("local")
; для доменной группы, в которую входят пользователи dom_user1, dom_user2 и dom_user3, указывается правило вида subject.isInGroup("пользователи домена")
. По желанию для конкретных пользователей домена, которым необходимо настроить доступ или правило, можно создать отдельную группу и поместить в неё нужных пользователей, в таком случае в правиле следует прописать subject.isInGroup("<название_новой_отдельной_группы_доменных_пользователей>")
.
Дата последнего изменения: 19.09.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.