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

Ключ

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

...

Поставщик операционной системы и системный администратор могут изменить поведение системы авторизации с помощью правил авторизации.

Официальная документация расположена на странице "polkit Reference Manual".

Примечание

Система авторизации polkit не влияет на работу других способов увеличения прав пользователя.

Например, у пользователя есть право запуска какой-то программы с помощью команды sudo. Если в менеджере авторизации polkitd запретить пользователю запускать эту программу, то у пользователя всё - равно останется возможность запуска программы с помощью sudo.

Официальная документация расположена на странице "polkit Reference Manual".

В набор программ polkit входят:

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

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

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

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

...

Агент аутентификации автоматически запускается при старте пользовательского сеанса.

Графический сеанс пользователя

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

Внешний вид агента зависит от рабочего стола пользователя. Так, в Astra Linux SE для рабочего стола Fly используется агент /usr/lib/x86_64-linux-gnu/libexec/polkit-kde-authentication-agent-1.

Image Modified
Рисунок 2. Окно агента аутентификации polkitаутентификации polkit-kde-authentication-agent-1

Если требуется ввести пароль пользователя, который не является текущим пользователем сеанса, то в окне также отображается пользователь, пароль которого требуется ввести.


Рисунок 3. Окно агента аутентификации polkit-kde-authentication-agent-1. Отображается пользователь, пароль которого требуется ввести.

При нажатии на кнопку "Подробности >>" отображается дополнительная информация о запрошенном действии.


Рисунок 4. Окно агента аутентификации polkit-kde-authentication-agent-1. Подробности

Описание действий, выполняемых программой

Вместе с привилегированной программой, поддерживающей polkit, устанавливается XML-файл "<адрес_получателя_на_D-BUS_шине>.policy". Где <адрес_получателя_на_D-BUS_шине> – это адрес получателя (путь объекта), под которым привилегированная программа регистрируется на системной шине D-BUS. Файл устанавливается в каталоге /usr/share/polkit-1/actions/

В policy-файле хранятся описания действий, которые может выполнить привилегированная программа. Название действия формируется как "<адрес_получателя_на_D-BUS_шине>.<действие>". 

...

Консольный сеанс пользователя

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

Например, после ввода команды "hostnamectl hostname astra3" отобразится запрос на ввод пароля пользователя administrator:

Блок кода
==== AUTHENTICATING FOR org.freedesktop.hostname1.set-hostname

...

 ====
Чтобы настроить имя компьютера, необходимо пройти аутентификацию.
Authenticating as: administrator
Password: 

Описание действий, выполняемых программой

Вместе с привилегированной программой, поддерживающей polkit, устанавливается XML-файл "<адрес_получателя_на_D-BUS_шине>.policy". Где <адрес_получателя_на_D-BUS_шине> – это адрес получателя (путь объекта), под которым привилегированная программа регистрируется на системной шине D-BUS. Файл устанавливается в каталоге /usr/share/polkit-1/actions/

В policy-файле хранятся описания действий, которые может выполнить привилегированная программа. Название действия формируется как "<адрес_получателя_на_D-BUS_шине>.<действие>". 

Пример названия файла: "org.freedesktop.hostname1.policy".
Пример названия действия: "org.freedesktop.hostname1.set-hostname".

Информация

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

Предупреждение

Для изменения поведения системы авторизации polkit следует использовать правила авторизации.

Изменения, сделанные в policy-файлах, будут утеряны при обновлении программ.

Для поиска policy-файлов, связанных программой можно использовать команду "dpkg -L <название_пакета>":

Command

dpkg -L systemd | grep policy

Команда отобразит policy-файлы, установленные для программ, входящих в пакет systemd:

Блок кода
Информация

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

Предупреждение

Для изменения поведения системы авторизации polkit следует использовать правила авторизации.

Изменения, сделанные в policy-файлах, будут утеряны при обновлении программ.

Для поиска policy-файлов, связанных программой можно использовать команду "dpkg -L <название_пакета>":

Command

dpkg -L systemd | grep policy

Команда отобразит policy-файлы, установленные для программ, входящих в пакет systemd:

Блок кода
/usr/share/polkit-1/actions/org.freedesktop.hostname1.policy
/usr/share/polkit-1/actions/org.freedesktop.locale1.policy
/usr/share/polkit-1/actions/org.freedesktop.login1.policy
/usr/share/polkit-1/actions/org.freedesktop.network1.policy
/usr/share/polkit-1/actions/org.freedesktop.systemd1hostname1.policy
/usr/share/polkit-1/actions/org.freedesktop.timedate1locale1.policy
/usr/share/polkit-1/actions/org.freedesktop.timesync1.policylogin1.policy
/usr/share/polkit-1/actions/org.freedesktop.network1.policy
/usr/share/polkit-1/actions/org.freedesktop.systemd1.policy
/usr/share/polkit-1/actions/org.freedesktop.timedate1.policy
/usr/share/polkit-1/actions/org.freedesktop.timesync1.policy

Для Для поиска программы, с которой связан связан policy-файл, можно использовать команду "dpkg -S <путь_к_policy-файлу>":

...

Блок кода
systemd: /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy

Пример Пример описания действия, соответствующего команде "hostnamectl hostname <имя_узла>", и находящегося в файле org.freedesktop.hostname1.policy:

...

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

При старте polkitd считывает в память правила из rules-файлов. Файлы читаются в порядке следования их названий, отсортированных по алфавиту (вначале идут цифры, потом буквы). Если в каталогах присутствуют файлы с одним и тем же названием, то файл из каталога /etc/polkit-1/rules.d/ читается первым.  Внутри Внутри файла правила читаются в том порядке, как они расположены в файле.
Для примера, следующие четыре файла будут прочитаны в порядке:

...

После добавления, удаления или изменения содержимого rules-файла служба polkitd автоматически заново перечитывает правила из rules-файлов.

Правила распределяются по двум очередям.
В одну очередь попадают правила, добавленные с помощью метода polkit.addRule (см. описание ниже). Polkitd, получив запрос на проверку права пользователя выполнить действие, начинает выполнять правила в порядке их расположения в памятиочереди. Выполнение правил останавливается на первом же правиле, которое вернёт какое-либо значение. Если ни одно правило не вернуло значение, то дальнейшее поведение поведение Polkitd определяется действиями, описанными в policy-файлах.

Правила написаны на языке программирования JavaScript в виде методов глобального объекта polkit.

Объект: polkit

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

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

Метод добавляет функцию function(action, subject), которая используется для проверки авторизации. Аргументами функциями являются объекты action и subject (см. описание объектов ниже).

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

Каждая функция должна возвращать результат проверки в виде одного из атрибутов объекта polkit.Result:

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

Правила написаны на языке программирования JavaScript в виде методов глобального объекта polkit.

Объект: polkit

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

Более полная информация о правилах и их составлении дана на странице polkit или доступна по команде "man 8 polkit".

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

Метод добавляет функцию function(action, subject), которая используется для проверки авторизации. Аргументами функциями являются объекты action и subject (см. описание объектов ниже).

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

Функция должна возвращать результат проверки в виде одного из атрибутов объекта polkit.Result:

АтрибутЗначениеПримечание
polkit.Result.NO
"no"

polkit.Result.YES
"yes"

polkit.Result.AUTH_SELF
"auth_self
АтрибутЗначениеПримечание
polkit.Result.NO
"no"
polkit.Result.YES
"yes"
polkit.Result.AUTH_SELF
"auth_self"
polkit.Result.AUTH_SELF_KEEP
"auth_self_keep"
polkit.Result.AUTH_ADMIN
"auth_admin"

polkit.Result.AUTH_ADMINSELF_KEEP
"auth_adminself_keep"

polkit.Result.AUTH_ADMIN
"auth_admin"

polkit.Result.AUTH_ADMIN_KEEP
"auth_admin_keep"

polkit.Result.NOT_NOT_HANDLED
null
Решение о доступе процесса (пользователя) к запрашиваемому действию не принято. Polkitd приступит к выполнению следующего по порядку правила

Значения атрибутов соответствуют значениям элементов allow_* из policy-файлов, содержащих описания действий.

Пример?

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

Метод добавляет функцию function(action, subject), которая вызывается, когда требуется аутентифицировать администратора системы.

Функция используется для определения, кто является администратором системы.

Каждая функция должна возвращать массив, который может содержать строки:

...

Если функция возвращает null, undefined or does not return a value at all, Polkitd приступит к выполнению следующего по порядку правила.

См. пример ....

Метод: polkit.spawn( ["/путь/к/сторонней/программе/", "аргумент_программы_1", "аргумент_программы_2", ...] );

Метод используется для запуска вспомогательной сторонней программы. Стандартный вывод этой программы будет возвращён как результат метода spawn.

Метод: polkit.log( message );

Метод применяется для вывода дополнительной информации в системный журнал работы. Используется при отладке правил.

Метод используется не самостоятельно, а вызывается изнутри функции function(action, subject).

Параметр метода:

...

Блок кода
окт 22 03:47:18 astra-28739 polkitd[18387]: этот текст будет выведен в системный журнал

Объект: action

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

Объект поддерживает один атрибут:

...

Объект поддерживает метод:

...

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

Например, для настройки "polkit.log("action=" + action);" при запуске команды "pkexec -u administrator echo 33333" в журнал будет выведено:

Блок кода
окт 22 00:55:27 astra-28739 polkitd[18387]: action=[Action id='org.freedesktop.policykit.exec' program='/usr/bin/echo' user.display='administrator' command_line='/usr/bin/echo 33333' user='administrator' polkit.message='Authentication is needed to run `$(program)' as user $(user.display)' polkit.gettext_domain='polkit-1' user.gecos='']

Объект: subject

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

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

...

Значение устанавливается, только если атрибут system_unit не пустой. Истина, если systemd-юнит (из атрибута system_unit) имеет параметр NoNewPrivileges со значением "enabled". 

...

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

...

Более полная информация о правилах и их составлении дана на странице polkit или доступна по команде "man 8 polkit".

Примеры правил

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

Примечание

В ОС Astra Linux, использующей мандатный контроль целостности, после создания какого-либо нового файла с правилом в каталогах /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 либо, как временный вариант, разместить правило в уже существующем rules-файле.

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

В Astra Linux с помощью правила, содержащегося в файле /usr/share/polkit-1/rules.d/50-default.rules, пользователи группы astra-admin назначаются администраторами системы:

Блок кода
polkit.addAdminRule(function(action, subject) {
    return ["unix-group:astra-admin"];
});

Включение отладочного журналирование

Примечание

Журналирование следует использовать только на время отладки работы системы авторизации polkit.

Сделаем, например, чтобы при вызове команды pkexec в системный журнал выводилась дополнительная информация о действии и о пользователе, запустившем эту команду:

...

Блок кода
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.policykit.exec") {
        polkit.log("action=" + action);
        polkit.log("subject=" + subject);
    }
});

...

Если функция вернула null или ничего не вернула, то Polkitd приступит к выполнению следующего по порядку правила, добавленного методом polkit.addRule.

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

Блок кода
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), которая вызывается, когда требуется аутентифицировать администратора системы.

Функция должна возвращать массив, который может содержать строки:

СтрокаОписание
"unix-group:<название_группы>"Пользователи, входящие в группу <название_группы>, являются администраторами операционной системы
"unix-netgroup:<название_сетевой_группы>"Пользователи, входящие в сетевую группу <название_сетевой_группы>, являются администраторами операционной системы
"unix-user:<имя_пользователя>"Пользователь <имя_пользователя> является администратором операционной системы

Если функция вернула null, undefined или ничего не вернула, то Polkitd приступит к выполнению следующего по порядку правила, добавленного методом polkit.addAdminRule.

Пример правила, которое назначает администраторами системы пользователя user1 и всех пользователей группы sudo.

Блок кода
polkit.addAdminRule(function(action, subject) {
    return ["unix-group:sudo", "unix-user:user1"];
});

Метод: polkit.spawn( ["/путь/к/сторонней/программе/", "аргумент_программы_1", "аргумент_программы_2", ...] );

Метод используется для запуска вспомогательной сторонней программы. Стандартный вывод этой программы будет возвращён как результат метода spawn. Программа запускается с правами пользователя polkitd.

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

Если сторонняя программа не завершилась в течение 10 секунд, то она принудительно закрывается.

См. пример использования метода spawn.

Метод: polkit.log( message );

Метод применяется для вывода дополнительной информации в системный журнал работы. Используется при отладке правил.

Метод используется не самостоятельно, а вызывается изнутри функции function(action, subject).

Параметр метода "message" – строка, которая будет выведена в системный журнал.
Для формирования строки "message" могут использоваться объекты action и subject (см. описание ниже).

См. пример использования метода log.

Объект: action

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

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

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

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

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

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

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

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

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

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

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

Например, для настройки "polkit.log("action=" + action);" при запуске команды "pkexec -u administrator echo 33333" в журнал будет выведено:

Блок кода
окт 22 00:55:27 astra-28739 polkitd[18387]: action=[Action id='org.freedesktop.policykit.exec' program='/usr/bin/echo' user.display='administrator' command_line='/usr/bin/echo 33333' user='administrator' polkit.message='Authentication is needed to run `$(program)' as user $(user.display)' polkit.gettext_domain='polkit-1' user.gecos='']

Объект: subject

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

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

АтрибутТипОписание
subject.pidintИдентификатор процесса
subject.userstringИмя учётной записи пользователя
subject.groupsstring[]Массив групп, в которых состоит пользователь
subject.seatstringМесто, с которым связан объект subject. Пустое значение, если место не является локальным – например, если к локальному компьютеру подключился удалённый пользователь с помощью SSH 
subject.sessionstringСеанс, с которым связан объект subject
subject.system_unitstringНазвание systemd-юнита (если такой есть), к которому относится процесс pid
subject.localbooleanИстина, если место seat является локальным
subject.no_new_privilegesboolean

Значение устанавливается, только если атрибут system_unit не пустой. Истина, если systemd-юнит (из атрибута system_unit) имеет параметр NoNewPrivileges со значением "enabled". 

subject.activebooleanИстина, если сеанс session активен

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

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

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

Например, для настройки "polkit.log("subject=" + subject);" при запуске команды "pkexec -u administrator echo 33333" в журнал будет выведено:

Блок кода
окт 22 15:39:19 astra3 polkitd[18387]: subject=[Subject pid=44098 user='user1' groups=user1,dialout,cdrom,floppy,sudo,audio,video,plugdev,users seat=null session=null local=true active=true]

Примеры правил

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

Примечание

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

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

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

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

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

    sudo systemctl restart polkit

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

В Astra Linux в файле /usr/share/polkit-1/rules.d/50-default.rules содержится правило:

  • пользователи группы astra-admin назначаются администраторами системы:
Блок кода
polkit.addAdminRule(function(action, subject) {
    return ["unix-group:astra-admin"];
});

Якорь
example_log
example_log

Включение отладочного журналирование

Примечание

Журналирование следует использовать только на время отладки работы системы авторизации polkit.

Сделаем, например, чтобы при вызове команды pkexec в системный журнал выводилась дополнительная информация о действии и о пользователе, запустившем эту команду:

  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

Для проверки вывода информации в журнал:

  1. Запустить команду:
    Command

    pkexec -u administrator echo "test"

    В системном журнале появятся записи о действии "action=..." и о пользователе "subject=...":
    Блок кода
    сен 22 12:51:44 astra-28739 polkitd[7867]: action=[Action id='org.freedesktop.policykit.exec' program='/usr/bin/echo' user.display='administrator' command_line='/usr/bin/echo test' user='administrator' polkit.message='Authentication is needed to run `$(program)' as user $(user.display)' polkit.gettext_domain='polkit-1' user.gecos='']
    сен 22 12:51:44 astra-28739 polkitd[7867]: subject=[Subject pid=4297 user='administrator' groups=administrator,tty,dialout,cdrom,floppy,audio,dip,video,plugdev,users,netdev,lpadmin,scanner,astra-admin,astra-console seat=null session='7' local=false active=true]

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

Правило:

  • относится к любому пользователю;
  • разрешает запускать команду "hostnamectl hostname <имя_узла>" без ввода пароля:
Блок кода
polkit.addRule(function(action, subject) {
    if (

...

Блок кода
ExecStart=/usr/lib/polkit-1/polkitd  --min-ilev-auth-admin=max

...

Command

sudo systemctl daemon-reload

...

Command

sudo systemctl restart polkit

Для проверки работы журналирования:

  1. Запустить команду:
    Command

    pkexec -u administrator echo "test"

    В системном журнале появятся записи о действии "action=..." и о пользователе "subject=...":
    Блок кода
    сен 22 12:51:44 astra-28739 polkitd[7867]: action=[Action id='org.freedesktop.policykit.exec' program='/usr/bin/echo' user.display='administrator' command_line='/usr/bin/echo test' user='administrator' polkit.message='Authentication is needed to run `$(program)' as user $(user.display)' polkit.gettext_domain='polkit-1' user.gecos='']
    сен 22 12:51:44 astra-28739 polkitd[7867]: subject=[Subject pid=4297 user='administrator' groups=administrator,tty,dialout,cdrom,floppy,audio,dip,video,plugdev,users,netdev,lpadmin,scanner,astra-admin,astra-console seat=null session='7' local=false active=true]

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

Правило:

  • относится только к любому пользователю;
  • разрешает запускать команду "hostnamectl hostname <имя_узла>" без ввода пароля:
Блок кода
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.hostname1.set-hostname") {
        return polkit.Result.YES;
    }

    return polkit.Result.NOT_HANDLED; 
});

Действие для команды "hostnamectl hostname <имя_узла>" описано в файле /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy.

Разрешение группе пользователей запускать определённую команду системного менеджера systemd без ввода пароля (пример из файла 50-local-allow.rules из состава polkitd)

Вместе с пакетом polkitd устанавливается файл /usr/share/doc/polkitd/50-local-allow.rules с нижеприведённым примером правила.

Правило:

  • относится только к пользователям, состоящим в группе sudo;
  • разрешает запускать команду "systemctl restart apt-daily" без ввода пароля;
    Примечание. В файле 50-local-allow.rules правило задано для службы apt-cacher-ng, которая отсутствует в Astra Linux;
  • доступ к остальным командам определяется другими существующими правилами, а также правами доступа в policy-файлах:
Блок кода
polkit.addRule(function(action, subject) {
    if (
        subject.isInGroup("sudo")
        && action.id == "org.freedesktop.systemd1hostname1.manage-units"
        && action.lookup("unit") == "apt-daily.service"
        && action.lookup("verb") == "restart"
    ) set-hostname") {
        return polkit.Result.YES;
    }

     return return polkit.Result.NOT_HANDLED; 
});

Действия для команды systemctl описаны Действие для команды "hostnamectl hostname <имя_узла>" описано в файле /usr/share/polkit-1/actions/org.freedesktop.systemd1hostname1.policy.

...

Разрешение группе пользователей запускать определённую команду системного менеджера systemd без ввода пароля (пример из файла 50-local-

...

allow.rules

...

из состава polkitd)

Вместе с пакетом polkitd устанавливается файл /usr/share/doc/polkitd/50-local-denyallow.rules с нижеприведённым примером правила.

Правило:

  • относится только к пользователю guest;
  • запрещает изменять сетевые настройки в программе NetworkManager;
  • пользователям, состоящим в группе sudo;
  • разрешает запускать команду "systemctl restart apt-daily" без ввода пароля;запрещает запускать команду hostnamectl для изменения настроек узла.
    Примечание. В файле 50-local-denyallow.rules правило задано для программы PackageKitслужбы apt-cacher-ng, которая отсутствует в Astra Linux;
  • доступ к остальным командам определяется другими существующими правилами, а также правами доступа в policy-файлах:
Блок кода
polkit.addRule(function(action, subject) {
    if (subject.user !== "guest") {

            return polkit.Result.NOT_HANDLED;subject.isInGroup("sudo")
    }

    if&& (action.id == "org.freedesktop.NetworkManager.settings.modify.system") {systemd1.manage-units"
        return&& polkit.Result.NO;action.lookup("unit") == "apt-daily.service"
    }

    if&& (action.id.indexOflookup("org.freedesktop.hostname1.verb") == 0"restart"
    ) {
        return polkit.Result.NOYES;
    }

      return polkit.Result.NOT_HANDLED;
});

Действие для изменения сетевых настроек в программе NetworkManager описано в Действия для команды systemctl описаны в файле /usr/share/polkit-1/actions/org.freedesktop.NetworkManagersystemd1.policy.

Запрещение пользователю запускать ряд команд (пример из файла 50-local-deny.rules из состава polkitd)

Вместе с пакетом polkitd устанавливается файл
Действия для команды hostnamectl описаны в файле /usr/share/polkit-1doc/actions/org.freedesktop.hostname1.policy.

Запрещение группе пользователей запускать все команды, кроме указанных

polkitd/50-local-deny.rules с нижеприведённым примером правила.

Правило:

  • относится только к пользователям, состоящим в группе group1;
  • разрешает запускать команду по изменению имени узла "hostnamectl hostname <имя_узла>" без ввода пароля;
  • разрешает запускать программу GParted "/usr/sbin/gparted" с вводом пароля администратора;
  • запрещает запускать все остальные команды:
  • пользователю guest;
  • запрещает изменять сетевые настройки в программе NetworkManager;
  • запрещает запускать команду hostnamectl для изменения настроек узла.
    Примечание. В файле 50-local-deny.rules правило задано для программы PackageKit, которая отсутствует в Astra Linux;
  • доступ к остальным командам определяется другими существующими правилами, а также правами доступа в policy-файлах:
Блок кода
polkit.addRule(function(action, subject) {
    if (subject.user !== "guest") {
        return polkit.Result.NOT_HANDLED;
    }

    if (action.id == "org.freedesktop.NetworkManager.settings.modify.system") {
        return polkit.Result.NO;
    }

    if (action.id.indexOf("org.freedesktop.hostname1.") == 0) {
        return polkit.Result.NO;
    }

    return polkit.Result.NOT_HANDLED;
});

Действие для изменения сетевых настроек в программе NetworkManager описано в файле /usr/share/polkit-1/actions/org.freedesktop.NetworkManager.policy.
Действия для команды hostnamectl описаны в файле /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy.

Запрещение группе пользователей запускать все команды, кроме указанных

Правило:

  • относится только к пользователям, состоящим в группе group1;
  • разрешает запускать команду по изменению имени узла "hostnamectl hostname <имя_узла>" без ввода пароля;
  • разрешает запускать программу GParted "/usr/sbin/gparted" с вводом пароля администратора;
  • запрещает запускать все остальные команды:
Блок кода
polkit.addRule(function(action, subject) {
    if ( ! subject.isInGroup("group1") ) {
        return polkit.Result.NOT_HANDLED;
    }

    if (action.id == "org.freedesktop.hostname1.set-hostname") {
        return polkit.Result.YES;
    }

    if (action.id == "org.gnome.gparted") {
        return polkit.Result.AUTH_ADMIN;
    }

    return polkit.Result.NO;
});

Действие команды "hostnamectl hostname <имя_узла>" описано в файле /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy.
Действие программы GParted описано в файле /usr/share/polkit-1/actions/org.gnome.gparted.policy.

Якорь
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]);
    
Блок кода
polkit.addRule(function(action, subject) {
    if ( ! subject.isInGroup("group1") ) {
        return polkit.Result.NOT_HANDLED;YES;
        } catch (error) {
    }

     if (action.id == "org.freedesktop.hostname1.set-hostname") {
        return polkit.Result.YES; // Если при выполнении программы возникла ошибка, то тогда у пользователя
    }

       if (action.id == "org.gnome.gparted") {
 // запрашивается пароль администратора
            return polkit.Result.AUTH_ADMIN;
;
        }

     return polkit.Result.NO; }
});

...

...

Каталоги

КаталогОписание
/usr/share/polkit-1/actions/
Каталог policy-файлов с описаниями действий программ

/etc/polkit-1/rules.d/
/usr/share/polkit-1/rules.d/

Каталоги rules-файлов с правилами авторизации, созданными поставщиком операционной системы или системным администратором
/etc/polkit-1/localauthority/
/var/lib/polkit-1/localauthority/

Каталоги с правилами авторизации в устаревшем pkla-формате. Эти правила будут работать, если установлен пакет polkitd-pkla (устанавливается автоматически при установке ОС по умолчанию).

В будущих версиях ОС возможен отказ от поддержки pkla-формата, из-за чего потребуется переписать правила в JavaScript-формате

/usr/share/doc/polkitd/examples/

Каталог содержит примеры правил авторизации: 50-local-allow.rules и 50-local-deny.rules

, описание которых дано

.

Примеры описаны в статье.