...
Поставщик операционной системы и системный администратор могут изменить поведение системы авторизации с помощью правил авторизации.
Официальная документация расположена на странице странице "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. Подробности
Описание действий, выполняемых программой
Вместе с привилегированной программой, поддерживающей 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".
| Информация |
|---|
Название |
| Предупреждение |
|---|
Для изменения поведения системы авторизации polkit следует использовать правила авторизации. Изменения, сделанные в |
Для поиска policy-файлов, связанных программой можно использовать команду "dpkg -L <название_пакета>":
| Command |
|---|
dpkg -L systemd | grep policy |
Команда отобразит policy-файлы, установленные для программ, входящих в пакет systemd:
| Блок кода |
|---|
| Информация |
|---|
Название |
| Предупреждение |
|---|
Для изменения поведения системы авторизации polkit следует использовать правила авторизации. Изменения, сделанные в |
Для поиска policy-файлов, связанных программой можно использовать команду "dpkg -L":
| Command |
|---|
dpkg -L systemd | grep policy |
Вывод команды:
| Блок кода |
|---|
/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.policy |
Для поиска программы, с которой связан policy-файл, можно использовать команду "dpkg -S":
| Command |
|---|
| Блок кода |
dpkg -S login1.policy /usr/share/polkit-1/actions/org.freedesktop.network1.policy /usr/share/polkit-1/actions/org.freedesktop.hostname1 systemd1.policy |
Вывод команды:
systemd: /usr/share/polkit-1/actions/org.freedesktop.hostname1.policy |
...
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"https://systemd.io</vendor_url> <action id="org.freedesktop.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> <message gettext-domain="systemd">Authentication is required to set the local hostname.</message> <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> |
...
Элемент message содержит информацию, отображаемую агентом аутентификации при запросе пароля у пользователя.
Блок defaults содержит требования к авторизации пользователя по умолчанию:
В блоке defaults задаются права пользователей по умолчанию на выполнение действия:
- в элементе элемент
allow_any– задаёт требование для любого пользователя. Необязательный элемент. - элемент в элементе
allow_inactive– задаёт требование для пользователя с неактивным пользовательским сеансом. Необязательный элемент. - элемент в элементе
allow_active– задаёт требование для пользователя с активным пользовательским сеансом. Необязательный элемент.
Каждый элементallow_any,allow_inactive,allow_activeдолжен содержать одно из значений:
-no– действие запрещено для пользователя;
-yes– действие разрешено для пользователя;
-auth_self– пользователь должен ввести свой пароль для выполнения действия;
-auth_admin– пользователь должен ввести пароль администратора для выполнения действия;
-auth_self_keep– аналогичноauth_self, только успешная авторизация сохраняется на короткий промежуток времени ;
-auth_admin_keep– аналогичноauth_admin, только успешная авторизация сохраняется на короткий промежуток времени.
Указанные значения требований можно изменить с помощью правил авторизации.
Для отображения названий всех установленных polkit-действий используется команда:
| Command |
|---|
pkaction |
Вывод команды:
| Блок кода |
|---|
com.hp.hplip.installplugin
com.redhat.tuned.active_profile
com.redhat.tuned.auto_profile
com.redhat.tuned.disable
com.redhat.tuned.get_all_plugins
com.redhat.tuned.get_instances
... |
Для вывода информации о действии используется команда:
| Command |
|---|
pkaction -v -a <название_действия> |
Пример команды:
| Command |
|---|
pkaction -v -a com.hp.hplip.installplugin |
Вывод команды:
| Блок кода |
|---|
com.hp.hplip.installplugin:
description: Install a plug-in into a HP printer
message: System policy prevents installation of a printer plug-in
vendor: HP Development Company
vendor_url: http://hplip.net/
icon:
implicit any: no
implicit inactive: no
implicit active: auth_admin |
Правила авторизации
Описание правил авторизации
Правила авторизации используются для изменения поведения системы авторизации, заданного действиями в policy-файлах.
Правила хранятся в файлах с расширением .rules. Файлы могут располагаться в каталогах /etc/polkit-1/rules.d/ и /usr/share/polkit-1/rules.d/.
Polkitd читает rules-файлы в порядке следования названий файлов, отсортированных по алфавиту (вначале идут цифры, потом буквы). Если в каталогах присутствуют файлы с одним и тем же названием, то файл из каталога /etc/polkit-1/rules.d/ читается первым.
Правила написаны на языке программирования JavaScript в виде методов глобального объекта polkit.
Поддерживаются методы:
- addRule – для добавления правила авторизации;
- addAdminRule – для указания, кто является администратором;
- log – для вывода дополнительной информации в системный журнал работы. Используется при отладке правил.
- spawn – для запуска вспомогательной сторонней программы. Стандартный вывод этой программы будет возвращён как результат метода spawn.
Polkitd выполняет правила в том порядке, как они идут в rules-файлах. Выполнение правил останавливается на первом же правиле, которое вернёт какое-нибудь значение. Если ни одно правило не вернуло значение, то дальнейшее поведение Polkitd определяется действиями, описанными в policy-файлах.
Более полная информация о правилах и их составлении дана на странице 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 в системный журнал выводилась дополнительная информация о действии и о пользователе, запустившем эту команду:
...
- (по умолчанию 5 минут);
Примечание. Авторизация сохраняется в рамках одного процесса. Если пользователь закрыл программу, в которой авторизовался, а затем заново её запустил, то ему придётся заново авторизоваться в ней.
-auth_admin_keep– аналогичноauth_admin, только успешная авторизация сохраняется на короткий промежуток времени (по умолчанию 5 минут).
Примечание. См. выше.
Указанные значения требований можно изменить с помощью правил авторизации.
В Astra Linux SE 1.8: для изменения длительности сохранения успешной авторизации auth_self_keep и auth_admin_keep:
- В файле systemd-юнита
/usr/lib/systemd/system/polkit.serviceк значению параметраExecStartдобавить опцию--default-expiration-time=<длительность_в_минутах>:Блок кода ExecStart=/usr/lib/polkit-1/polkitd --no-debug --min-ilev-auth-admin=max --default-expiration-time=10 - Перечитать настройки системного менеджера
systemd, чтобы службаpolkitd"подхватила" опцию--default-expiration-time:Command sudo systemctl daemon-reload
Для отображения названий всех установленных polkit-действий используется команда:
| Command |
|---|
pkaction |
Вывод команды:
| Блок кода |
|---|
com.hp.hplip.installplugin
com.redhat.tuned.active_profile
com.redhat.tuned.auto_profile
com.redhat.tuned.disable
com.redhat.tuned.get_all_plugins
com.redhat.tuned.get_instances
... |
Для вывода информации о действии используется команда:
| Command |
|---|
pkaction -v -a <название_действия> |
Пример команды:
| Command |
|---|
pkaction -v -a com.hp.hplip.installplugin |
Вывод команды:
| Блок кода |
|---|
com.hp.hplip.installplugin:
description: Install a plug-in into a HP printer
message: System policy prevents installation of a printer plug-in
vendor: HP Development Company
vendor_url: http://hplip.net/
icon:
implicit any: no
implicit inactive: no
implicit active: auth_admin |
Правила авторизации
Описание правил авторизации
Правила авторизации используются для изменения поведения системы авторизации, заданного действиями в policy-файлах.
Правила хранятся в файлах с расширением .rules. Файлы могут располагаться в каталогах /etc/polkit-1/rules.d/ и /usr/share/polkit-1/rules.d/.
При старте polkitd считывает в память правила из rules-файлов. Файлы читаются в порядке следования их названий, отсортированных по алфавиту (вначале идут цифры, потом буквы). Если в каталогах присутствуют файлы с одним и тем же названием, то файл из каталога /etc/polkit-1/rules.d/ читается первым. Внутри файла правила читаются в том порядке, как они расположены в файле.
Для примера, следующие четыре файла будут прочитаны в порядке:
/etc/polkit-1/rules.d/10-auth.rules;/usr/share/polkit-1/rules.d/10-auth.rules;//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. В ОС Astra Linux, использующей мандатный контроль целостности, после создания какого-либо нового файла с правилом в каталогах /Примечание etc/polkit-1/rules.d/15-auth.rules;- и
/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-файле. - Разрешить службе
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:Command sudo systemctl daemon-reload
sudo systemctl restart polkit
- Запустить команду:
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]
Выполнение без ввода пароля команды: systemctl restart apt-daily (пример правила 50-local-allow.rules из состава polkitd)
/20-auth.rules.
После добавления, удаления или изменения содержимого rules-файла служба polkitd автоматически заново перечитывает правила из rules-файлов.
Правила распределяются по двум очередям.
В одну очередь попадают правила, добавленные с помощью метода polkit.addRule (см. описание ниже). Polkitd, получив запрос на проверку права пользователя выполнить действие, начинает выполнять правила в порядке их расположения в очереди. Выполнение правил останавливается на первом же правиле, которое вернёт какое-либо значение. Если ни одно правило не вернуло значение, то дальнейшее поведение Polkitd определяется действиями, описанными в policy-файлах.
В другую очередь попадают правила, добавленные с помощью метода 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.AUTH_SELF_KEEP | "auth_self_keep" | |
polkit.Result.AUTH_ADMIN | "auth_admin" | |
polkit.Result.AUTH_ADMIN_KEEP | "auth_admin_keep" | |
polkit.Result.NOT_HANDLED | null | Решение о доступе процесса (пользователя) к запрашиваемому действию не принято. Polkitd приступит к выполнению следующего по порядку правила |
Значения атрибутов соответствуют значениям элементов allow_* из policy-файлов, содержащих описания действий.
Если функция вернула 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=''] |
Объект: 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 состоит в сетевой группе <название_сетевой_группы> |
При использовании объекта 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, использующей мандатный контроль целостности: после создания Для восстановления работы менеджера авторизации
|
Назначение администратора операционной системы
В 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 daemon-reload
- Перезапустить службу
polkitd, чтобы она начала выводить отладочные сообщения в системный журнал:Command sudo systemctl restart polkit
Для проверки вывода информации в журнал:
- Запустить команду:
В системном журнале появятся записи о действии "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]
Разрешение любому пользователю запускать определённую команду
Правило:
- относится к любому пользователю;
- разрешает запускать команду "
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.systemd1.manage-units"
&& action.lookup("unit") == "apt-daily.service"
&& action.lookup("verb") == "restart"
) {
return polkit.Result.YES;
}
return polkit.Result.NOT_HANDLED;
}); |
Действия для команды systemctl описаны в файле /usr/share/polkit-1/actions/org.freedesktop.systemd1.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") {
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 subject.isInGroup("astra-admin")polkit.Result.NOT_HANDLED;
}
&&if (action.id === "org.freedesktop.systemd1hostname1.manageset-unitshostname") {
&&return action.lookup("unit") === "apt-daily.service"polkit.Result.YES;
}
&&if (action.lookup("verb") =id == "restart"
org.gnome.gparted") {
return polkit.Result.YESAUTH_ADMIN;
}
return 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").
Скопировать файл в каталог /etc/polkit-1/rules.d/ - polkit автоматически обработает файл.
В результате пользователь, входящий в группу astra-admin сможет запускать команду "systemctl restart apt-daily" без использования команды sudo и без запроса пароля от polkitd.
Запрещение пользователю запускать определённую команду (пример правила 50-local-deny.rules из состава polkitd)
.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 (subject.user !(action.id.indexOf("org.freedesktop.login1.reboot") == "guest"0) {
try {
// Continue to the next rules file for users other than guest
return polkit.Result.NOT_HANDLED;
}
if (action.id === "org.freedesktop.NetworkManager.settings.modify.system") {
// Don't allow reconfiguring NetworkManager
// Программа user-may-reboot должна успешно завершаться с кодом 0 только в том случае,
// если пользователю разрешено перезагружать операционную систему.
polkit.spawn(["/opt/company/bin/user-may-reboot",
return polkit.Result.NO;
}
return polkit.Result.NOT_HANDLED;
}); |
Не показано правило, запрещающее запуск программы PackageKit, которая не используется в Astra Linux.
Правилом задаётся:
- пользователю guest;
- запрещено ("return polkit.Result.NO");
- изменение сетевых настроек в программе NetworkManager (название действия "org.freedesktop.NetworkManager.settings.modify.system").
...
subject.user]);
return polkit.Result.YES;
} catch (error) {
// Если при выполнении программы возникла ошибка, то тогда у пользователя
// запрашивается пароль администратора
return polkit.Result.AUTH_ADMIN;
}
}
}); |
Каталоги
| Каталог | Описание |
|---|---|
| /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. Примеры описаны в статье. |


