LINUX.ORG.RU

Как правильно обернуть приложение в polkit?

 


1

1

Есть некое самописанное приложение, для которого необходимо повышение привилегий. Не имея большого опыта работы с polkit, сделал так:

#!/bin/bash
pkexec <путь_к_приложению>
Как я понимаю, запрос к polkit в этом случае обрабатывается политикой по умолчанию policykit.exec, а управление правами осуществляется через локальное правило в /etc/polkit-1/rules.d/

В связи с этим возникли вопросы:

  1. Нужно ли создавать для приложения собственную политику, и если нужно, то где её потом размещать?
  2. Можно ли избежать вызова приложения через pkexec?

Обычно polkit применяется в совокупности с dbus, для авторизации шинных запросов. Впрочем, «обычно» не значит «всегда». pkexec — это такое sudo, только с гораздо более гибкой настройкой поведения.

Как я понимаю, запрос к polkit в этом случае обрабатывается политикой по умолчанию policykit.exec

И да, и нет. В отсутствие дополнительной настройки применяются правила для действия org.freedesktop.policykit.exec (/usr/share/polkit1/actions/org.freedesktop.policykit.policy), которые по умолчанию требуют аутентификации.

Действие по умолчанию для policykit.exec можно переопределить через JS-правила в /usr/share/polkit-1/rules.d и /etc/polkit-1/rules.d, но это так не делается.

а управление правами осуществляется через локальное правило в /etc/polkit-1/rules.d/

И да, и нет. В качестве примера правильного использования pkexec можно взглянуть на файл политики для вспомогательной утилиты установки яркости подсветки в xf86-video-intel: org.x.xf86-video-intel.backlight-helper.policy.

В этом файле политики сказано, что если через pkexec выполняется файл /usr/lib/xf86-video-intel-backlight-helper, то нужно применить другие правила для действия org.x.xf86-video-intel.backlight-helper — которые по умолчанию уже не требуют никаких админских прав.

Я не говорю, что не нужно пользоваться JS-правилами. Ими нужно пользоваться для модификации поведения _сторонней_ программы, а для задания поведения по умолчанию _своей_ программы следует определить новое действие и заполнить defaults в XML-файле его описания.

Отсюда ответы на вопросы:

  1. Нужно ли создавать для приложения собственную политику, и если нужно, то где её потом размещать?

    Да, нужно. Размещать в /usr/share/polkit-1/actions/<ID действия>.policy.

  2. Можно ли избежать вызова приложения через pkexec?

    Можно, но зачем? Надо понимать, что polkit сам по себе не выдаёт UNIX-права, т. е. тебе придётся писать свой собственный SUID-хелпер, эквивалентный pkexec.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 4)
Ответ на: комментарий от intelfx

В теории всё вроде бы понятно, на практике что-то не получается ничего. Вот смотри, делаю следующее:

  1. Создаю тестовое «приложение» /usr/local/bin/test_clear.sh - bash-сценарий, который читает содержимое защищенного от чтения каталога.
    #!/bin/bash
    ls /usr/share/polkit-1/rules.d/
    
  2. Создаю сценарий вызова тестового приложения /usr/local/bin/test.sh
    #!/bin/bash
    pkexec /usr/local/bin/test_clear.sh
    
  3. Создаю файл политики /usr/share/polkit-1/actions/org.local.test.policy
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE policyconfig PUBLIC
     "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
     "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
    <policyconfig>
    
      <action id="org.local.test">
        <message>Authentication is required to run the test</message>
        <defaults>
          <allow_any>no</allow_any>
          <allow_inactive>no</allow_inactive>
          <allow_active>yes</allow_active>
        </defaults>
        <annotate key="org.freedesktop.policykit.exec.path">/usr/local/bin/test.sh</annotate>
        <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
      </action>
    
    </policyconfig>
    
  4. Перезапускаю на всякий случай polkit
  5. Запускаю /usr/local/bin/test.sh, ожидаю отпринтовки содержимого каталога, но вместо этого получаю запрос авторизации, т.е. поведение policykit.exec по умолчанию.

По всей видимости, я что-то неверно понимаю в логике работы polkit. Прошу дать направляющий пинок.

Galapago ()
Ответ на: комментарий от Galapago

<annotate key=«org.freedesktop.policykit.exec.path»>/usr/local/bin/test_clear.sh</annotate>

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

<annotate key=«org.freedesktop.policykit.exec.path»>/usr/local/bin/test_clear.sh</annotate>

Дошло: в файле политики указывается само оборачиваемое приложение, а не сценарий его вызова. Спасибо!

Galapago ()
Ответ на: комментарий от Galapago

Если всё заработало, отметь топик как решённый.

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

Если всё заработало, отметь топик как решённый.

Как это сделать?

Galapago ()
Ответ на: комментарий от Galapago

Ссылка «Отметить как решённую» под исходным сообщением.

intelfx ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.