Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

...

ПрограммаОписание
polkitdМенеджер авторизации. Системная служба
pkcheck

Программа для проверки наличия у процесса права на выполнение определённого действия  

pkactionПрограмма для отображения информации о действии
pkexecПрограмма для запуска команды от имени другого пользователя
pkttyagentТекстовой Текстовый агент аутентификации

Алгоритм работы системы авторизации polkit:

...

В консольном сеансе для аутентификации пользователя используется текстовой текстовый агент /usr/lib/polkit-1/polkit-agent-helper-1, входящий в пакет polkitd.
Текстовой Текстовый агент выводит информацию для чего требуется ввести пароль, пароль какого пользователя, а также о запрошенном действии, а также имя пользователя, чей пароль требуется ввести. Ниже отображается приглашение для ввода пароля.

...

Внутрь функции function(action, subject) передаётся параметр action,  который является объектом с информацией о действии, относительного которого проводится проверка.

Атрибут объекта:

АтрибутТипОписание
action.idstring

Название проверяемого действия.

Например, для программы pkexec значением атрибута action.id будет "org.freedesktop.policykit.exec".

Метод объекта:

МетодВозвращаемое значение
action.lookup( "<название_переменной>" );

Значение  переменной <название_переменной>, установленное привилегированной программой.
Каждая привилегированная программа предоставляет свой набор переменных. Информация о них дана в документации привилегированной программы.

Если значение переменной <название_переменной> отсутствует, то метод action.lookup вернёт неопределённое значение.

Для примера, программа pkexec устанавливает переменную program, содержащую путь до команды, запускаемой от имени другого пользователя. Для получения значения этой переменной используется метод action.lookup("program").

...

  1. Создать файл /etc/polkit-1/rules.d/10-default.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 – название действия, соответствующего команде pkexec.
  2. Разрешить службе polkitd выводить в системный журнал отладочные сообщения.
    Для этого в файле systemd-юнита /usr/lib/systemd/system/polkit.service убрать из значения параметра ExecStart опцию "--no-debug":
    Блок кода
    ExecStart=/usr/lib/polkit-1/polkitd  --min-ilev-auth-admin=max
  3. Перечитать настройки системного менеджера systemd, чтобы служба polkitd "подхватила" удаление опции "--no-debug":
    Command

    sudo systemctl daemon-reload

  4. Перезапустить службу polkitd, чтобы она начала выводить отладочные сообщения в системный журнал:
    Command

    sudo systemctl restart polkit

...

Разрешение любому пользователю запускать определённую команду

Правило:

  • относится только к любому пользователю;
  • разрешает запускать команду "hostnamectl hostname <имя_узла>" без ввода пароля:

...

  • используется, когда пользователь вводит команду "systemctl reboot" для перезапуска операционной системы;
  • запускает стороннюю программу "/opt/company/bin/user-may-reboot" от имени пользователя polkitd. В качестве аргумента программе передаётся имя пользователя, запросившего действие;
  • программа "/opt/company/bin/user-may-reboot" каким-то образом решает, можно или нет пользователю перезапустить систему;
  • если сторонняя программа завершилась в течение 10 секунд с кодом завершения 0, то действие, запрошенное пользователем, выполнится без запроса пароля;
      - иначе у пользователя будет запрошен пароль администратора для выполнения действия.
Блок кода
polkit.addRule(function(action, subject) {
    if (action.id.indexOf("org.freedesktop.login1.reboot") == 0) {
        try {
            // Программа user-may-reboot должна успешно завершаться с кодом 0 только в том случае,
            // если пользователю разрешено перезапускатьперезагружать операционную систему.
            polkit.spawn(["/opt/company/bin/user-may-reboot",
                          subject.user]);
            return polkit.Result.YES;
        } catch (error) {
            // Если при выполнении программы возникла ошибка, то тогда у пользователя
            // запрашивается пароль администратора
            return polkit.Result.AUTH_ADMIN;
        }
    }
});

...