Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

PolicyKit - создание собственных правил (продолжение)


Автор: А. Ракитин
Дата публикации: март 2015 г.

Использование инструментов командной строки

Установленный в системе PolicyKit уже имеет некоторые встроенные инструменты командной строки. В дистрибутиве Fedora 21 их четыре.

pkaction - служит для просмотра возможных действий, которые отслеживает PolicyKit. Эта утилита может использоваться вместо просмотра в текстовом редакторе файлов .policy. Это может оказаться удобнее, так как здесь работают такие вещи как конвейеры, grep и т.п. Запуск pkaction без параметров выводит список всех возможных действий. Параметр --action-id позволяет просмотреть конкретное действие. Добавление параметра --verbose дает возможность получить полную информацию о действии, в том числе и об установленных разрешениях для него.
# pkaction --action-id org.freedesktop.udisks2.filesystem-mount --verbose
org.freedesktop.udisks2.filesystem-mount:
  description:       Mount a filesystem
  message:           Authentication is required to mount the filesystem
  vendor:            The udisks Project
  vendor_url:        http://udisks.freedesktop.org/
  icon:              drive-removable-media
  implicit any:      auth_admin
  implicit inactive: auth_admin
  implicit active:   yes
pkcheck - позволяет проверить, авторизовался ли процесс для выполнения действия.

pkexec - позволяет пользователю выполнить действие или программу от имени другого пользователя. Если имя не указано, то подразумевается, что действие будет выполняться от имени суперпользователя.

pkttyagent - позволяет выполнить текстовую авторизацию таким приложениям, которые запускаются без пользовательского графического окружения, например, ssh.

Дополнительные пакеты могут включать некоторые другие утилиты и даже приложения с графическим интерфейсом, например, policytool. На практике все это не очень нужно обычному пользователю. Для создания своих правил достаточно любого текстового редактора.

И, конечно, нельзя не упомянуть команду man polkit.

PolicyKit - это служба

PolicyKit запускается и работает как служба операционной системы polkitd. Эта служба запускается от имени пользователя polkitd, который является обычным пользователем системы с ограниченными правами. Демон polkitd всегда стартует с правами суперпользователя и сразу после старта понижает права до обычного пользователя.

Каждый раз, когда приложение требует участия PolicyKit, демон polkitd запускается автоматически. Это обеспечивается средствами dbus-daemon или systemd. Поэтому пользователю никогда не приходится запускать polkitd вручную.

При каждом старте демона файлы .rules перечитываются заново. Поэтому изменения, внесенные в правила, начинают работать сразу, без перезапуска демона, сеанса пользователя или всей системы целиком.

Практика

Все примеры, приведенные ниже, проверены и работают. Их можно просто скопировать в файл правил. По крайней мере, это верно для Fedora 21.

При создании своих правил нужно иметь в виду, что, поскольку они являются программами, ошибки в синтаксисе недопустимы. Если ошибки все же имеются, то ничего фатального не произойдет, система не будет испорчена. Но правило работать не будет. Лучшее, что можно сделать в такой ситуации, это проверить, правильно ли указаны действие, группа пользователя и правило. Особенно это относится к названию действия. В разных дистрибутивах Linux, даже в разных версиях одного дистрибутива названия действий могут несколько отличаться от приведенных здесь. Также не лишним будет убедиться, что все нужные скобки и кавычки находятся на своих местах. В общем, как и всегда в программировании, здесь требуются внимательность и аккуратность.

Возможность подключение локальных дисков для обычного пользователя

В системе имеются два SATA жестких диска. На первом установлена операционная система, второй используется для хранения данных. Второй жесткий диск виден в файловом менеджере, но не смонтирован.

Проблема заключается в том, что каждый раз при попытке прочитать (подключить) второй SATA жесткий диск средствами файлового менеджера появляется окно агента PolicyKit с требованием ввести пароль суперпользователя. Между тем, любые USB накопители монтируются автоматически и никакой пароль при этом вводить не требуется.

Ниже представлен фрагмент файла /usr/share/polkit-1/actions/org.freedesktop.udisks2.policy. Исходный файл довольно большой, поэтому для экономии места оставлены только те действия и соответствующие им правила по умолчанию, которые относятся к подключению накопителей. Также для экономии места элементы description и message на языках, отличных от английского и русского удалены.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
<policyconfig>
  <vendor>The udisks Project</vendor>
  <vendor_url>http://udisks.freedesktop.org/</vendor_url>
  <icon_name>drive-removable-media</icon_name>

  <action id="org.freedesktop.udisks2.filesystem-mount">
    <description>Mount a filesystem</description>
    <description xml:lang="ru">Подключить файловую систему</description>
    <message>Authentication is required to mount the filesystem</message>
    <message xml:lang="ru">Для подключения файловой системы требуется подтверждение подлинности пользователя</message>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>yes</allow_active>
    </defaults>
  </action>
  
  <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>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
  </action>
  
  <action id="org.freedesktop.udisks2.filesystem-mount-other-seat">
    <description>Mount a filesystem from a device plugged into another seat</description>
    <description xml:lang="ru">Подключить файловую систему с устройства, подключенного в другое место</description>
    <message>Authentication is required to mount the filesystem</message>
    <message xml:lang="ru">Для подключения файловой системы требуется подтверждение подлинности пользователя</message>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
  </action>
  
  <action id="org.freedesktop.udisks2.filesystem-fstab">
    <description>Mount/unmount filesystems defined in the fstab file with the x-udisks-auth option</description>
    <description xml:lang="ru">Подключать/отключать заданные в файле fstab файловые системы с параметром x-udisks-auth</description>
    <message>Authentication is required to mount/unmount the filesystem</message>
    <message xml:lang="ru">Для подключения/отключения файловой системы требуется подтверждение подлинности пользователя</message>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
  </action>
  
  <action id="org.freedesktop.udisks2.filesystem-unmount-others">
    <description>Unmount a device mounted by another user</description>
    <description xml:lang="ru">Отключить устройство, подключённое другим пользователем</description>
    <message>Authentication is required to unmount a filesystem mounted by another user</message>
    <message xml:lang="ru">Для отключения устройства, подключённого другим пользователем, требуется подтверждение подлинности пользователя</message>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
  </action>
	...
</policyconfig>

Видно, что файл содержит описание нескольких различных действий, связанных с монтированием файловых систем. В данном случае требуется изменить правило по умолчанию, которое установлено для монтирования системных накопителей. Те накопители, которые подключены к интерфейсу SATA, наверняка относятся к системным.

Наиболее вероятным кандидатом для этого является правило org.freedesktop.udisks2.filesystem-mount-system. Видно, что правила по умолчанию требуют прав суперпользователя.

Для решения проблемы требуется дать права на монтирование файловой системы на системном устройстве той группе пользователей, к которой относится нужный нам пользователь. Пусть для определенности здесь и дальше это будет группа red.

Для записи нового правила можно воспользоваться приведенным выше шаблоном. Результат будет выглядеть так:

//Правило, разрешающее монтирование файловой системы на системном устройстве членам группы red
polkit.addRule(function(action, subject) {
  if (action.id.match("org.freedesktop.udisks2.filesystem-mount-system") && subject.isInGroup("red")) {
    return polkit.Result.YES;
  }
});

Другой вариант - можно включить пользователя в какую-либо из уже существующих групп, например, disk и дать права на монтирование файловой системы на системном устройстве этой группе.

Файл с данным правилом следует поместить в каталог /etc/polkit-1/rules.d. Желательно, чтобы он был прочитан и обработан службой polkitd раньше, чем файлы правил, которые уже имеются в дистрибутиве. Для этого можно присвоить ему имя, например, 30-udisk2.rules.

Новое правило начинает работать сразу после создания файла.

Предоставление обычному пользователю прав на обновление системы и установку/удаление программ

В дистрибутиве Fedora имеется программа с графическим интерфейсом, позволяющая обновлять операционную систему и устанавливать или удалять программы - Yum Extender. Эти действия являются системными и требуют прав суперпользователя. Поэтому запуск Yum Extender сопровождается предложением ввести соответствующий пароль. На персональном компьютере это выглядит архаизмом и создает лишние трудности. Тем более, что установка программного обеспечения в современных дистрибутивах Linux производится как правило из проверенных источников, репозиториев. В отличие от некоторых других систем. Поэтому есть смысл разрешить данный класс операций непривилегированному пользователю.

Ниже представлен фрагмент файла /usr/share/polkit-1/actions/dk.yumex.backend.policy. Для упрощения в нем удалена декларация.

<policyconfig>
 <vendor>Yum Extender</vendor>
 <vendor_url>http://yumex.dk</vendor_url>
 <action id="dk.yumex.backend.pkexec.run">
    <description>Run Yum Extender backend</description>
    <message>Authentication is required for Yum Extender to handle packages on the system</message>
    <icon_name>yumex</icon_name>
    <defaults>
     <allow_any>no</allow_any>
     <allow_inactive>auth_admin</allow_inactive>
     <allow_active>auth_admin</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/usr/share/yumex/backend-launcher.py</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
 </action>
</policyconfig>

Видно, что правила по умолчанию для запуска Yum Extender либо запрещают запуск программы, либо требуют прав суперпользователя. Для создания правила, позволяющего пользователю из группы red обновлять систему и устанавливать/удалять программы с помощью Yum Extender, снова можно воспользоваться тем же шаблоном. Результат будет таким:

//Правило, разрешающее обновлять систему и устанавливать/удалять программы членам группы red
polkit.addRule(function(action, subject) {
  if (action.id.match("dk.yumex.backend.pkexec.run") && subject.isInGroup("red")) {
    return polkit.Result.YES;
  }
});

Надо отметить, что для тех же самых действий, но выполняемых в командной строке с помощью yum, все равно потребуются полномочия суперпользователя. Созданное новое правило действительно только для Yum Extender.

Данный файл с правилом можно оформить как /etc/polkit-1/rules.d/31-yumex-backend.rules. Правило начинает работать немедленно.

Разрешение на управление виртуальными машинами с помощью virt-manager

Виртуальная машина на персональном компьютере - обычное явление. Но каждый раз при запуске графической программы управления virt-manager требуется вводить пароль суперпользователя. Хотелось бы иметь возможность работать с виртуальными машинами так же, как с любыми другими пользовательскими приложениями - без ввода пароля.

В каталоге /usr/share/polkit-1/actions/ имеются два файла с описанием возможных действий для работы с виртуальными машинами, предоставленные разработчиками libvirt:
  • файл org.libvirt.unix.policy описывает только два действия - мониторинг виртуальных машин и управление ими.
  • в файле org.libvirt.api.policy перечислены конкретные действия (остановка, перезапуск и т.д.), которые возможны, если предыдущая проверка пройдена.
В данном случае интерес представляет действие "Manage local virtualized systems" в файле org.libvirt.unix.policy. Соответствующий фрагмент приведен ниже:
    <action id="org.libvirt.unix.manage">
      <description>Manage local virtualized systems</description>
      <message>System policy prevents management of local virtualized systems</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>
Видно, что правила по умолчанию для выполнения данного действия требуют ввода пароля суперпользователя. Файл /etc/polkit-1/rules.d/32-libvirt-manage.rules с новым правилом будет выглядеть так:
//Правило, разрешающее управление виртуальными машинами членам группы red
polkit.addRule(function(action, subject) {
  if (action.id == "org.libvirt.unix.manage" && subject.isInGroup("red")) {
      return polkit.Result.YES;
  }
});

Примечание. Обратите внимание: в последнем примере вместо метода match() использован оператор эквивалентности ==. В данном случае это просто разные способы сделать одно и то же. Оба варианта работают.

Не обязательно оформлять каждое правило в виде отдельного файла, как это было сделано выше. Вместо этого все собственные правила можно записать в единственном файле. Для этого их надо просто расположить друг за другом.

Итог

PolicyKit позволяет повысить удобство работы в операционной системе при сохранении достаточной степени ее защищенности от необдуманного или случайного вмешательства пользователя. Небольшую подстройку этой программной части вполне может выполнить практически любой. Самое главное здесь - соблюдать разумный баланс между теми самыми удобством и защищенностью.