Вопрос или проблема
Я хотел бы запустить службу systemd с использованием DBus в одном из моих приложений, которое запускается от пользователя без прав администратора myuser
. Для этого мне нужно настроить PolicyKit, где я использую polkit 0.105, и добавил следующий .pkla файл в /etc/polkit-1/localauthority/50-local.d
Identity=unix-user:myuser
Action=org.freedesktop.systemd1.manage-unit-files;org.freedesktop.systemd1.manage-units
ResultActive=yes
ResultInactive=yes
Однако это почему-то не помогло, так как я все еще получаю ошибку Permission denied
от DBus, когда оно запускается от myuser
, тогда как оно работает, когда запускается от root
.
Насколько я понял, полкит на данный момент именно так и настраивается.
Что меня также удивляет, так это то, что при выполнении pkaction
он просто ничего не возвращает.
Нужна ли polkit
какая-то дополнительная настройка? Я только что установил его через apt-get
на Ubuntu 19.04.
В org.freedesktop.systemd1.policy для :
action id="org.freedesktop.systemd1.manage-units"
action id="org.freedesktop.systemd1.manage-unit-files"
попробуйте заменить строку
<allow_active>auth_admin_keep</allow_active>
на :
<allow_active>yes</allow_active>
Ответ или решение
Для настройки правил PolicyKit (polkit) таким образом, чтобы пользователь "myuser" мог управлять юнитами systemd и файлами юнитов, вам необходимо выполнить несколько шагов и учесть несколько важных моментов. Рассмотрим детально, как это сделать.
Шаг 1: Создание .pkla файла
Вы уже создали файл .pkla в каталоге /etc/polkit-1/localauthority/50-local.d/
. Однако давайте убедимся, что он имеет правильный формат и правильно настроен.
Создайте файл, назовём его, например, myuser.pkla
, и добавьте в него следующий код:
[Управление сервисами systemd для myuser]
Identity=unix-user:myuser
Action=org.freedesktop.systemd1.manage-unit-files;org.freedesktop.systemd1.manage-units
ResultActive=yes
ResultInactive=yes
Шаг 2: Проверка правил
Политики в файловой системе обычно кэшируются, поэтому после изменения файлов .pkla может потребоваться перезагрузить службу или даже саму систему, чтобы ваши изменения вступили в силу. Убедитесь, что у вас есть следующие пакеты:
sudo apt-get install policykit-1 policykit-1-gnome
Шаг 3: Проверка статуса политик
Кроме того, вам необходимо будет убедиться, что ваши правила загружены. В этом поможет команда pkaction
. Если она возвращает пустой вывод, возможно, ваши правила не были корректно распознаны.
Запустите:
pkaction | grep myuser
Если ничего не отображается, возможно, вам нужно освежить кэш или уточнить, корректно ли ваш файл .pkla привязан к необходимой политике.
Шаг 4: Проверка прав
Для получения информации об политиках, связанных с org.freedesktop.systemd1.manage-units
и org.freedesktop.systemd1.manage-unit-files
, можно использовать:
pkaction | grep org.freedesktop.systemd1
Если эти действия существуют, вам нужно проверить, кто имеет доступ к ним и на каких условиях.
Шаг 5: Редактирование файлов политики systemd
Как вы заметили, редактирование org.freedesktop.systemd1.policy
может быть необходимым шагом, если встроенные права не соответствуют задаче. В том случае, если вы решите редактировать этот файл, вам следует:
- Открыть файл
/usr/share/polkit-1/actions/org.freedesktop.systemd1.policy
. - Найти строки с
action id="org.freedesktop.systemd1.manage-units"
иaction id="org.freedesktop.systemd1.manage-unit-files"
. - Изменить строки:
<allow_active>auth_admin_keep</allow_active>
на
<allow_active>yes</allow_active>
После внесения всех изменений проверьте, осталась ли система в рабочем состоянии и повторите тесты.
Заключение
Если все указанные шаги были выполнены, а ошибка "Permission denied" сохраняется, стоит ещё раз проверить конфигурации D-Bus и убедиться, что служба systemd запущена и доступна для взаимодействия. Иногда может понадобиться удалить и восстановить кэш polkit:
sudo pkill polkitd
Затем перезапустите D-Bus и протестируйте ваши настройки. Если проблема сохраняется, вам может понадобиться исследовать системные журналы для более детальной диагностики.
Следуя этим шагам, вы сможете настроить polkit для управления сервисами systemd от имени пользователя "myuser".