polkit (Русский)

From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи polkit. Дата последней синхронизации: 7 марта 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Выдержка из домашней страницы polkit:

polkit — это средство для управления правами приложений пользовательского уровня, позволяющее непривилегированным процессам решать административные задачи: единый интерфейс предоставления прав доступа к привилегированным операциям для непривилегированных приложений при помощи набора правил (политик) и шины D-Bus.

Polkit используется для управления общесистемными привилегиями. Данный фреймворк используется для предоставления непривилегированным процессам возможность выполнения действий, требующих прав администратора. В отличие от sudo, Polkit не наделяет процесс правами суперпользователя, а позволяет точно контролировать, какие действия разрешены, а какие нет.

Polkit может контролировать отдельные действия, такие как запуск GParted: при этом он проверяет имя пользователя и принадлежность оного к группе, например, является ли он членом группы wheel. Далее Polkit проверяет, какими правами наделены пользователи данной группы (есть ли вообще права на запуск?) и, если всё сходится (пользователь в нужной группе и у группы есть соответствующие права), требует ввести пароль для идентификации пользователя.

Установка

Установите пакет polkit.

Агенты аутентификации

Агент аутентификации используется для подтверждения того, что пользователь текущего сеанса действительно является этим пользователем (путём ввода пароля текущего пользователя) или администратором (путём ввода пароля администратора). Пакет polkit содержит текстовый агент аутентификации, 'pkttyagent', который используется в качестве запасного варианта.

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

Cinnamon, Deepin, GNOME, GNOME Flashback, KDE, LXDE, LXQt, MATE, theShell и Xfce уже имеют в своём составе агенты аутентификации. В других графических окружениях вы можете выбрать одну из реализаций:

Настройка

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

Определения Polkit можно разделить на два вида:

  • Действия (actions) определены в XML-файлах .policy, расположенных в каталоге /usr/share/polkit-1/actions. Каждое действие имеет набор разрешений по умолчанию (например, для действия GParted нужно идентифицироваться как администратор). Значения по умолчанию можно переопределить, но редактирование этих файлов НЕ является правильным способом.
  • Правила авторизации (authorization rules) определены в JavaScript-файлах .rules. Их можно найти в двух местах: пакеты могут использовать /usr/share/polkit-1/rules.d (хотя мало кто это делает), а /etc/polkit-1/rules.d предназначен для локальных настроек.

Polkit работает поверх существующих систем разрешений в Linux — членство в группах, статус администратора — он не заменяет их. Файлы .rules определяют подмножество пользователей, ссылаются на одно (или несколько) действий, указанных в файлах actions, и определяют, с какими ограничениями эти действия могут быть выполнены этими пользователями. Например, файл правил может отменить стандартное требование для всех пользователей проходить аутентификацию в качестве администратора при использовании GParted, определив, что некоторым конкретным пользователям это не нужно. Другой пример: определённому пользователю вообще не разрешено использовать GParted.

Примечание: Это не исключает возможности запуска GParted другими средствами, не взаимодействующими с polkit, например, напрямую через командную строку. Поэтому polkit следует использовать для предоставления доступа к привилегированным сервисам для непривилегированных пользователей, а не для урезания прав (частично) привилегированных пользователей. В целях безопасности всё ещё следует использовать sudoers.

Действия

Совет: polkit-explorer-gitAUR предоставляет простой графический интерфейс для просмотра действий Polkit.

Действия, доступные вам через polkit, зависят от установленных пакетов. Некоторые из них используются в нескольких средах рабочего стола (org.freedesktop.*), некоторые специфичны для конкретной среды рабочего стола (org.gnome.*), а некоторые специфичны для одной программы (org.gnome.gparted.policy). Команда pkaction выводит список всех действий, определённых в /usr/share/polkit-1/actions.

Чтобы получить представление о том, что может делать polkit, вот несколько часто используемых групп действий:

  • systemd-logind (org.freedesktop.login1.policy): выключение и перезагрузка системы, уход в ждущий и спящий режим, в том числе когда присутствуют другие пользователи.
  • udisks (org.freedesktop.udisks2.policy): монтирование файловых систем, разблокировка зашифрованных устройств.
  • NetworkManager (org.freedesktop.NetworkManager.policy): включение и выключение сети, wifi или мобильного широкополосного доступа.

Каждое действие определяется в теге <action> в файле .policy. Например, файл org.gnome.gparted.policy содержит одно действие и выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "http://www.freedesktop.org/software/polkit/policyconfig-1.dtd">
<policyconfig>

  <action id="org.gnome.gparted">
    <message>Authentication is required to run the GParted Partition Editor as root</message>
    <message xml:lang="ru">Требуется авторизация для запуска редактора разделов GParted с правами root</message>
    <icon_name>gparted</icon_name>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/gparted</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
  </action>

</policyconfig>

Атрибут id — это фактическая команда, посылаемая в D-Bus, тег message — это объяснение пользователю, когда требуется аутентификация, а icon_name — это вроде как очевидно.

Тег defaults — это место, в котором указаны разрешения или их отсутствие. Он содержит три параметра: allow_any, allow_inactive и allow_active. Неактивные сеансы — это, как правило, удалённые сеансы (SSH, VNC и т.д.), в то время как активные — это вход, выполненный непосредственно на машине через TTY или X. allow_any — это настройка, охватывающая оба сценария.

Для каждого из этих параметров доступны следующие опции:

  • no: Пользователю не разрешено выполнять действие. Поэтому нет необходимости в аутентификации.
  • yes: Пользователь может выполнять действие без какой-либо аутентификации.
  • auth_self: Аутентификация требуется, но пользователь не обязательно должен быть администратором.
  • auth_admin: Требуется аутентификация в качестве администратора.
  • auth_self_keep: То же самое, что и auth_self, но, подобно sudo, авторизация сохраняется на несколько минут.
  • auth_admin_keep: То же самое, что и auth_admin, но, подобно sudo, авторизация сохраняется на несколько минут.

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

В приведённом выше примере действия GParted пользователи должны аутентифицироваться как администраторы, чтобы использовать GParted, независимо от того, является ли сеанс активным или неактивным.

Правила авторизации

Правила авторизации, переопределяющие настройки по умолчанию, располагаются в указанных выше каталогах. Для всех целей, связанных с персональной конфигурацией одной системы, следует использовать только /etc/polkit-1/rules.d.

Метод addRule() используется для добавления функции, которая может вызываться всякий раз, когда выполняется проверка авторизации действия и субъекта. Функции вызываются в том порядке, в котором они были добавлены, пока одна из функций не вернёт значение. Таким образом, чтобы добавить правило авторизации, которое обрабатывается раньше других правил, в каталоге /etc/polkit-1/rules.d создайте файл с именем, которое при сортировке расположится перед другими файлами правил, например 00-early-checks.rules.

Структура файлов .rules достаточно понятна:

/* Разрешить пользователям из группы admin запускать GParted без аутентификации */
polkit.addRule(function(action, subject) {
    if (action.id == "org.gnome.gparted" &&
        subject.isInGroup("admin")) {
        return polkit.Result.YES;
    }
});

Внутри функции проверяется ID запрошенного действия (org.gnome.gparted) и группы пользователя (admin), и при выполнении условий возвращается значение "yes".

Определение администраторов

Метод addAdminRule() используется для добавления функции, которая может быть вызвана, когда требуется аутентификация администратора. Функция указывает, какие идентификаторы могут быть использованы для аутентификации администратора при проверке авторизации, определяемой действием и субъектом. Добавленные функции вызываются в том порядке, в котором они были добавлены, пока одна из функций не вернёт значение.

Конфигурация по умолчанию находится в файле 50-default.rules, поэтому, если вы хотите изменить эти настройки, нужно скопировать его, к примеру, в файл 40-default.rules и редактировать уже его.

/etc/polkit-1/rules.d/50-default.rules
polkit.addAdminRule(function(action, subject) {
    return ["unix-group:wheel"];
});
Примечание: Ваш пользователь должен быть указан как член группы в файле /etc/group. Простое указание этой группы в качестве основной группы пользователя не работает с polkit. Смотрите polkit issue 131.

Единственная часть, которую нужно отредактировать (после копирования), — это возвращаемый массив: в качестве кого должен аутентифицироваться пользователь, когда нужна аутентификация администратора? Если пользователь является членом группы, члены которой считаются администраторами, то ему нужно будет ввести только свой пароль. Если какой-то другой пользователь, например, root, является единственным администратором, то нужно будет ввести пароль root. Формат идентификации пользователя такой же, как и при назначении полномочий.

По умолчанию Arch делает всех членов группы wheel администраторами. Показанный ниже пример правила заставит polkit запрашивать пароль root вместо пароля обычного пользователя для аутентификации в качестве администратора.

/etc/polkit-1/rules.d/49-rootpw_global.rules
/* Всегда выполняем аутентификацию администраторов путём
 * запроса пароля root, аналогично опции rootpw в sudo
 */
polkit.addAdminRule(function(action, subject) {
    return ["unix-user:root"];
});

Примеры

Отладка/журналирование

Следующее правило записывает подробную информацию о любом запрошенном доступе.

/etc/polkit-1/rules.d/00-log-access.rules
polkit.addRule(function(action, subject) {
    polkit.log("action=" + action);
    polkit.log("subject=" + subject);
});

Отключение ждущего и спящего режима

Следующее правило отключает ждущий и спящий режим для всех пользователей.

/etc/polkit-1/rules.d/10-disable-suspend.rules
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.suspend" ||
        action.id == "org.freedesktop.login1.suspend-multiple-sessions" ||
        action.id == "org.freedesktop.login1.hibernate" ||
        action.id == "org.freedesktop.login1.hibernate-multiple-sessions")
    {
        return polkit.Result.NO;
    }
});

Отключение запроса пароля

Чтобы добиться чего-то похожего на опцию NOPASSWD из sudo и получить авторизацию только на основе идентификации пользователя/группы, вы можете создать пользовательские правила в /etc/polkit-1/rules.d/. Это позволит вам отменить аутентификацию по паролю либо только для определённых действий, либо глобально. Пример набора правил можно посмотреть здесь: [1]

Глобально

Создайте следующий файл от имени root:

/etc/polkit-1/rules.d/49-nopasswd_global.rules
/* Разрешить членам группы wheel выполнять любые действия
 * без проверки пароля, аналогично "sudo NOPASSWD:"
 */
polkit.addRule(function(action, subject) {
    if (subject.isInGroup("wheel")) {
        return polkit.Result.YES;
    }
});

Замените wheel на любую нужную вам группу.

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

Существует также AUTH_ADMIN_KEEP, который позволяет сохранять авторизацию в течение 5 минут. Однако авторизация происходит для каждого процесса отдельно, следовательно, если один процесс запросит авторизацию в течение 5 минут, то другой процесс в любом случае запросит пароль снова.

Для определённых действий

Создайте следующий файл от имени root:

/etc/polkit-1/rules.d/49-nopasswd_limited.rules
/* Разрешить членам группы wheel выполнять определённые действия
 * без проверки пароля, аналогично "sudo NOPASSWD:"
 */
polkit.addRule(function(action, subject) {
    if ((action.id == "org.gnome.gparted" ||
	 action.id == "org.libvirt.unix.manage") &&
        subject.isInGroup("wheel"))
    {
        return polkit.Result.YES;
    }
});

Выбранные здесь action.id являются лишь (рабочими) примерами для GParted и libvirt, но вы можете заменить их на любые другие по вашему вкусу, если они существуют (сделанные самостоятельно или поставляемые пакетом), также вы можете определить любую другую группу вместо wheel.

Оператор || используется для разграничения действий (логическое ИЛИ), а && означает логическое И и должен использоваться как последний оператор.

Udisks

Файловые менеджеры могут запрашивать пароль при попытке смонтировать устройство хранения или выдавать ошибку Not authorized или похожую. Подробности смотрите в статье udisks (Русский)#Настройка.

Разрешить управление отдельными юнитами systemd обычным пользователям

Можно предоставить определённым пользователям или группам возможность управлять определёнными юнитами. Например, вы можете захотеть, чтобы обычные пользователи могли запускать и останавливать wpa_supplicant:

/etc/polkit-1/rules.d/10-wifimanagement.rules
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units") {
        if (action.lookup("unit") == "wpa_supplicant.service") {
            var verb = action.lookup("verb");
            if (verb == "start" || verb == "stop" || verb == "restart") {
                return polkit.Result.YES;
            }
        }
    }
});

Смотрите также