...
Поставщик операционной системы и системный администратор могут изменить поведение системы авторизации с помощью правил авторизации.
Официальная документация расположена на странице странице "polkit Reference Manual".
| Примечание |
|---|
Система авторизации polkit не влияет на работу других способов увеличения прав пользователя. Например, у пользователя есть право запуска какой-то программы с помощью команды |
В набор программ polkit входят:
| Программа | Описание |
|---|---|
| polkitd | Менеджер авторизации. Системная служба |
| pkcheck | Программа для проверки наличия у процесса права на выполнение определённого действия |
| pkaction | Программа для отображения информации о действии |
| pkexec | Программа для запуска команды от имени другого пользователя |
| pkttyagent | Текстовой Текстовый агент аутентификации |
Алгоритм работы системы авторизации polkit:
...
Агент аутентификации автоматически запускается при старте пользовательского сеанса.
Графический сеанс пользователя
Когда требуется аутентифицировать пользователя, открывается окно агента. В окне окне отображается информация для чего требуется ввести пароль, а также поле для ввода пароля пользователя.
Внешний вид агента зависит от рабочего стола пользователя. Так, в Astra Linux SE для рабочего стола Fly используется агент /usr/lib/x86_64-linux-gnu/libexec/polkit-kde-authentication-agent-1.
Рисунок 2. Окно агента аутентификации polkitаутентификации polkit-kde-authentication-agent-1
Если требуется ввести пароль пользователя, который не является текущим пользователем сеанса, то в окне также отображается пользователь, пароль которого требуется ввести.
Рисунок 3. Окно агента аутентификации polkit-kde-authentication-agent-1. Отображается пользователь, пароль которого требуется ввести.
При нажатии на кнопку "Подробности >>" отображается дополнительная информация о запрошенном действии.
Рисунок 4. Окно агента аутентификации polkit-kde-authentication-agent-1. Подробности
Описание действий, выполняемых программой
Консольный сеанс пользователя
В консольном сеансе для аутентификации пользователя используется текстовый агент /usr/libВместе с привилегированной программой, поддерживающей polkit, устанавливается XML-файл "<адрес_получателя_на_D-BUS_шине>.policy". Где <адрес_получателя_на_D-BUS_шине> – это адрес получателя (путь объекта), под которым привилегированная программа регистрируется на системной шине D-BUS. Файл устанавливается в каталоге /usr/share/polkit-1/actions/.
В policy-файле хранятся описания действий, которые может выполнить привилегированная программа. Название действия формируется как "<адрес_получателя_на_D-BUS_шине>.<действие>".
...
polkit-agent-helper-1, входящий в пакет polkitd.
Текстовый агент выводит информацию о запрошенном действии, а также имя пользователя, чей пароль требуется ввести. Ниже отображается приглашение для ввода пароля.
Например, после ввода команды "hostnamectl hostname astra3" отобразится запрос на ввод пароля пользователя administrator:
| Блок кода |
|---|
==== AUTHENTICATING FOR org.freedesktop.hostname1.set-hostname |
...
====
Чтобы настроить имя компьютера, необходимо пройти аутентификацию.
Authenticating as: administrator
Password: |
Описание действий, выполняемых программой
| Информация |
|---|
Название |
| Предупреждение |
|---|
Для изменения поведения системы авторизации polkit следует использовать правила авторизации. Изменения, сделанные в |
Для поиска policy-файлов, связанных программой можно использовать команду "dpkg -L <название_пакета>":
| Command |
|---|
dpkg -L systemd | grep policy |
Команда отобразит policy-файлы, установленные для программ, входящих в пакет systemd:
...
Вместе с привилегированной программой, поддерживающей 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".
| Информация |
|---|
Название |
| Предупреждение |
|---|
Для изменения поведения системы авторизации polkit следует использовать правила авторизации. Изменения, сделанные в |
Для поиска policy-файлов, связанных программой можно использовать команду "dpkg -L <название_пакета>":
| Command |
|---|
dpkg -L systemd | grep policy |
Команда отобразит policy-файлы, установленные для программ, входящих в пакет systemd:
| Блок кода |
|---|
Для поиска программы, с которой связан policy-файл, можно использовать команду "dpkg -S <путь_к_policy-файлу>":
| Command |
|---|
dpkg -S /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy |
...
/usr/share/polkit-1/actions/org.freedesktop. |
...
locale1.policy |
...
| Блок кода |
|---|
systemd: /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy |
...
login1.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-файлу>":
| Command |
|---|
dpkg -S /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy |
Команда отобразит, что файл /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy соответствует одной из программ, входящей в состав пакета systemd:
| Блок кода |
|---|
systemd: /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy |
Пример описания действия, соответствующего команде "hostnamectl hostname <имя_узла>", и находящегося в файле org.freedesktop.hostname1.policy:
| Блок кода |
|---|
<?xml version="1.0" encoding="UTF-8"?> <!--*-nxml-*-->
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" |
| Блок кода |
<?xml version="1.0" encoding="UTF-8"?> <!--*-nxml-*--> <!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" "https://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd"> <!-- SPDX-License-Identifier: LGPL-2.1-or-later ... --> <policyconfig> <vendor>The systemd Project</vendor> <vendor_url>https://systemd.io</vendor_url> <action id="org.freedesktop.hostname1.set-hostname"> <description gettext-domain="systemd">Set hostname</description> "https://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd"> <!-- SPDX-License-Identifier: LGPL-2.1-or-later ... --> <policyconfig> <message gettext-domain="systemd">Authentication is required to set<vendor>The the local hostname.</message>systemd Project</vendor> <vendor_url>https://systemd.io</vendor_url> <defaults> <action id="org.freedesktop.hostname1.set-hostname"> <description gettext-domain="systemd">Set hostname</description> <allow_any>auth_admin_keep</allow_any> <message gettext-domain="systemd">Authentication is required to set the local hostname.</message> <allow_inactive>auth_ <defaults> <allow_any>auth_admin_keep</allow_any> <allow_inactive>auth_admin_keep</allow_inactive> <allow_active>auth_admin_keep</allow_active> </defaults> </action> ... </policyconfig> |
...
Правила авторизации используются для изменения поведения системы авторизации, заданного действиями в policy-файлах.
Правила хранятся в файлах с расширением .rules. Файлы могут располагаться в каталогах /etc/polkit-1/rules.d/ и /usr/share/polkit-1/rules.d/.
При старте polkitd считывает в память правила из rules-файлов. Файлы читаются в порядке следования их названий, отсортированных по алфавиту (вначале идут цифры, потом буквы). Если в каталогах присутствуют файлы с одним и тем же названием, то файл из каталога /etc/polkit-1/rules.d/ читается первым. Внутри Внутри файла правила читаются в том порядке, как они расположены в файле.
Для примера, следующие четыре файла будут прочитаны в порядке:
...
После добавления, удаления или изменения содержимого rules-файла служба polkitd автоматически заново перечитывает правила из rules-файлов.
Polkitd, получив Правила распределяются по двум очередям.
В одну очередь попадают правила, добавленные с помощью метода 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.NOTAUTH_HANDLEDADMIN | "auth_admin" | |||||||||
polkit.Result.AUTH_ADMIN_KEEP | "auth_admin_keep" | |||||||||
polkit.Result.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]: этот текст будет выведен в системный журнал |
Если функция вернула 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.id | string | Название проверяемого действия. Например, для программы |
Метод объекта:
| Метод | Возвращаемое значение |
|---|---|
| action.lookup( "<название_переменной>" ); | Значение переменной Если значение переменной Для примера, программа |
При использовании объекта 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=''] |
Объект: 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, который является объектом с информацией о процессе (пользователе), чьи права проверяются.
Атрибуты объекта:
| Атрибут | Тип | Описание |
|---|---|---|
subject.pid | int | Идентификатор процесса |
subject.user | string | Имя учётной записи пользователя |
subject.groups | string[] | Массив групп, в которых состоит пользователь |
subject.seat | string | Место, с которым связан объект subject. Пустое значение, если место не является локальным – например, если к локальному компьютеру подключился удалённый пользователь с помощью SSH |
subject.session | string | Сеанс, с которым связан объект subject |
subject.system_unit | string | Название systemd-юнита (если такой есть), к которому относится процесс pid |
subject.local | boolean | Истина, если место seat является локальным |
subject.no_new_privileges | boolean | Значение устанавливается, только если атрибут |
subject.active | boolean | Истина, если сеанс session активен |
Методы объекта:
| Метод | Возвращаемое значение |
|---|---|
subject.isInGroup( "<название_группы>" ); | Истина, если объект subject состоит в группе <название_группы> |
subject.isInNetGroup( "<название_сетевой_группы>" ); | Истина, если объект subject состоит в сетевой группе <название_сетевой_группы> |
Более полная информация о правилах и их составлении дана на странице polkit или доступна по команде "man 8 polkit".
Примеры правил
Назначение администратора операционной системы (пример использования метода addAdminRule)
В Astra Linux с помощью правила, содержащегося в файле /usr/share/polkit-1/rules.d/50-default.rules, пользователи группы astra-admin назначаются администраторами системы:
| Блок кода |
|---|
polkit.addAdminRule(function(action, subject) {
return ["unix-group:astra-admin"];
}); |
Отладочное журналирование (пример использования метода log)
| Примечание |
|---|
Журналирование следует использовать только на время отладки работы системы авторизации polkit. |
Сделаем, например, чтобы при вызове команды pkexec в системный журнал выводилась дополнительная информация о действии и о пользователе, запустившем эту команду:
...
При использовании объекта 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, использующей мандатный контроль целостности: после создания |
...
| Блок кода |
|---|
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.policykit.exec") {
polkit.log("action=" + action);
polkit.log("subject=" + subject);
}
}); |
...
или Для восстановления работы менеджера авторизации
|
Назначение администратора операционной системы
В 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 в системный журнал выводилась дополнительная информация о действии и о пользователе, запустившем эту команду:
- Создать файл
/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. - Разрешить службе
polkitdвыводить в системный журнал отладочные сообщения.
Для этого в файле systemd-юнита/usr/lib/systemd/system/polkit.serviceубрать из значения параметраExecStartопцию "--no-debug":Блок кода ExecStart=/usr/lib/polkit-1/polkitd --min-ilev-auth-admin=max - Перечитать настройки системного менеджера
systemd, чтобы служба polkitd "подхватила" удаление опции "--no-debug":Command sudo systemctl
и - Разрешить службе
polkitdвыводить в системный журнал отладочные сообщения.
Для этого в файле systemd-юнита/usr/lib/systemd/system/polkit.serviceубрать из значения параметраExecStartопцию--no-debug:Блок кода [Unit] Description=Authorization Manager Documentation=man:polkit(8) [Service] Type=dbus BusName=org.freedesktop.PolicyKit1 ExecStart=/usr/lib/polkit-1/polkitd --min-ilev-auth-admin=max - Перечитать настройки системного менеджера
systemd, чтобы служба polkitd "подхватила" удаление опции--no-debug:Command sudo systemctl daemon-reload
- Перезапустить службу
polkitd, чтобы она начала выводить отладочные сообщения в системный журнал:Command sudo systemctl restart polkit
/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-файле.
Для проверки вывода информации в журнал:
- Запустить команду:
В системном журнале появятся записи о действии "action=..." и о пользователе "subject=...":Command pkexec -u administrator echo "test"
Блок кода сен 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]
Запуск команды без запроса пароля (файл 50-local-allow.rules из состава polkitd)
Разрешение любому пользователю запускать определённую команду
Правило:
- относится к любому пользователю;
- разрешает запускать команду "
hostnamectl hostname <имя_узла>" без ввода пароля
...
- :
| Блок кода |
|---|
polkit.addRule(function(action, subject) {
if (
action.id subject.isInGroup("astra-admin")== "org.freedesktop.hostname1.set-hostname") {
&& action.id === "org.freedesktop.systemd1.manage-units"
&& action.lookup("unit") === "apt-daily.service"
&& action.lookup("verb") === "restart"
) {
return polkit.Result.YES;
}
return polkit.Result.NOT_HANDLED;
}); |
Правило адаптировано для Astra Linux SE:
- в методе subject.isInGroup указан параметр "astra-admin" вместо "sudo";
- переменной action.lookup("unit") присвоено значение "apt-daily.service" вместо "apt-cacher-ng.service".
Правилом задаётся:
- пользователю, входящему в группу astra-admin;
- разрешено без ввода пароля ("return polkit.Result.YES");
- запускать команду systemctl (название действия "org.freedesktop.systemd1.manage-units");
- для перезапуска (action.lookup("verb") === "restart");
- службы apt-daily (action.lookup("unit") === "apt-daily.service").
В результате пользователь, входящий в группу astra-admin сможет запускать команду "systemctl restart apt-daily" без использования команды sudo и без запроса пароля от polkitd.
Разрешение любому пользователю изменять имя узла
Пример правила, которое позволяет любому пользователю выполнять команду "hostnamectl 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.systemd1.manage-units"
&& action.lookup("unit") == "apt-daily.service"
&& action.lookup("verb") == "restart"
|
| Блок кода |
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.hostname1.set-hostname") { return polkit.Result.YES; } returnreturn polkit.Result.NOT_HANDLED; }); |
Действия для команды systemctl описаны в файле Команде "hostnamectl hostname <имя_узла>" соответствует действие "org.freedesktop.hostname1.set-hostname".
Права по умолчанию на выполнение действия заданы в файле /usr/share/polkit-1/actions/org.freedesktop.hostname1systemd1.policy.
...
Запрещение пользователю запускать ряд команд (пример из файла 50-local-deny.rules из состава polkitd)
При установке пакета Вместе с пакетом polkitd устанавливается файл /usr/share/doc/polkitd/50-local-deny.rules с нижеприведённым примером правила.
Правило:
- относится только к пользователю
guest; - запрещает изменять сетевые настройки в программе NetworkManager;
- запрещает запускать команду
hostnamectlдля изменения настроек узла.
Примечание. В файле50-local-deny.rulesправило задано для программы PackageKit, которая отсутствует в Astra Linux; - доступ к остальным командам определяется другими существующими правилами, а также правами доступа в
policy-файлах:
| Блок кода |
|---|
polkit.addRule(function(action, subject) {
if (subject.user !== "guest") {
// Continue to the next rules file for users other than guestreturn polkit.Result.NOT_HANDLED;
}
if (action.id == "org.freedesktop.NetworkManager.settings.modify.system") {
return polkit.Result.NOT_HANDLEDNO;
}
if (action.id === .indexOf("org.freedesktop.NetworkManagerhostname1.settings.modify.system") {
== // Don't allow reconfiguring NetworkManager0) {
return polkit.Result.NO;
}
return polkit.Result.NOT_HANDLED;
}); |
Не показано правило, запрещающее запуск программы PackageKit, которая не используется в Astra Linux.
Правилом задаётся:
...
return polkit.Result. |
...
NOT_HANDLED; }); |
...
Действие для изменения сетевых настроек в программе NetworkManager
...
описано в файле /usr/share/polkit-1/actions/org.freedesktop.NetworkManager.
...
Скопировать файл в каталог /etcpolicy.
Действия для команды hostnamectl описаны в файле /usr/share/polkit-1/rules.d/ и изменить 50 на 00, чтобы правило гарантированно срабатывало раньше других правил.
Запрещение определённому пользователю выполнять ряд команд
...
actions/org.freedesktop.hostname1.policy.
Запрещение группе пользователей запускать все команды, кроме указанных
Правило:
- относится только к пользователям, состоящим в группе
group1; - разрешает запускать команду по изменению имени узла "
hostnamectl hostname <имя_узла>" без ввода пароля; - разрешает запускать программу GParted "
/usr/sbin/gparted" с вводом пароля администратора; - запрещает запускать все остальные команды:
| Блок кода |
|---|
polkit.addRule(function(action, subject) {
if (subject.user !== subject.isInGroup("user1group1") ) {
return polkit.Result.NOT_HANDLED;
}
if (action.id == "org.freedesktop.hostname1.set-hostname") {
return polkit.Result.NOYES;
}
if (action.id == "org.gnome.gparted") {
return polkit.Result.NOAUTH_ADMIN;
}
return polkit.Result.NOT_HANDLED;
}); |
Команде по изменению имени узла "hostnamectl hostname <имя_узла>" соответствует действие "org.freedesktop.hostname1.set-hostname".
Права по умолчанию на выполнение действия заданы в файле /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy.
Команде GParted "/usr/sbin/gparted" соответствует действие "org.gnome.gparted".
Права по умолчанию на выполнение действия заданы в файле /usr/share/polkit-1/actions/org.gnome.gparted.policy.
У пользователя не будет запрашиваться пароль, а будет сразу выведено сообщение о запрете на выполнение команды.
Например, если пользователь user1 запустит запрещённую команду "hostnamectl hostname <имя_узла>", то в ответ он получит сообщение:
| Блок кода |
|---|
Could not set transient hostname: Access denied |
Запрещение группе пользователей выполнять все команды, кроме указанных
Правило:
- относится только к пользователям, состоящим в группе
group1; - разрешает запускать команду по изменению имени узла "
hostnamectl hostname <имя_узла>" без запроса пароля; - разрешает запускать программу GParted "
/usr/sbin/gparted" с запросом пароля администратора; - запрещает запускать все остальные команды, которые используют менеджер авторизации
polkitd:
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]);
return polkit.Result.YES;
} catch (error |
| Блок кода |
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.
Каталоги
| Каталог | Описание |
|---|---|
| /usr/share/polkit-1/actions/ | Каталог policy-файлов с описаниями действий программ |
/etc/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 , описание которых дано. Примеры описаны в статье. |


