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

Ключ

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

...

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

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

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

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

...

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

...

Значения атрибутов соответствуют значениям элементов allow_* из policy-файлов, содержащих описания действий.
Если функция вернула вернула null или ничего не вернула, то Polkitd приступит к выполнению следующего по порядку правила, добавленного методом polkit.addRule.

...

Блок кода
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.hostname1.set-hostname") {
        return polkit.Result.YES;
    }

    return polkit.Result.NOT_HANDLED; 
});

Метод:   polkit.addAdminRule( function(action, subject) {...} );

...

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

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

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

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

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

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

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

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

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

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

При использовании объекта объекта action без указания атрибута или метода, будут выведены одной строкой: название действия и переменные привилегированной программы.

...

МетодВозвращаемое значение
subject.isInGroup( "<название_группы>" );Истина, если объект subject состоит в группе <название_группы>
subject.isInNetGroup( "<название_сетевой_группы>" );Истина, если объект subject состоит в сетевой группе <название_сетевой_группы>

При использовании объекта объекта subject без указания атрибута или метода, будут выведены одной строкой все атрибуты объекта.

...

Примечание

В ОС Astra Linux, использующей мандатный контроль целостности, : после создания какого rules-либо нового файла с правилом в каталогах каталоге /etc/polkit-1/rules.d/ и или /usr/share/polkit-1/rules.d: / перестаёт работать polkitd перестаёт работать, а в системном журнале появляется запись :
"polkitd[5403]: Insufficient integrity level of file '.../etc/polkit-1/rules.d/10-default....rules'Необходимо настроить мандатный контроль целостности для файла 10-default.rules".

Для восстановления работы менеджера авторизации polkitd:

  1. Установить высокий уровень целостности для созданного rules-файла:
    Command

    sudo pdpl-file :HIGH <rules-файл>

  2. Перезапустить менеджер авторизации polkitd:
    Command

    sudo systemctl restart polkit

Назначение администратора операционной системы

...

  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 <имя_узла>" без ввода пароля:

...

Якорь
example_spawn
example_spawn

 Использование Использование сторонней программы для определения права пользователя на выполнение действия

Правило:

  • используется, когда пользователь вводит команду "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;
        }
    }
});

...