Повышение привилегий оболочки Gnome

Я создаю расширение оболочки Gnome и хочу иметь возможность делать некоторые вещи с повышенными привилегиями. Итак, я думаю, что мне нужно использовать «набор политик», но я не знаю, как это сделать.

Итак, скажем, я хотел сделать что-то вроде ifconfig eth0 down или ifconfig eth0 up

Я могу запустить из терминала: pkexec ifconfig eth0 down и он запросит пароль, а затем сделает это.

Но как мне это сделать изнутри расширения?

Я почти уверен, что это как-то связано с созданием файла в /usr/share/polkit-1/actions, но я ничего не могу найти в Интернете или где-либо еще.

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

Я знаю, что разрешать выполнение любой команды — очень плохая идея. Это не то, о чем я прошу, я хочу просто запустить одну программу/команду.

РЕДАКТИРОВАТЬ: я не уверен, но я думаю, что может быть невозможно, чтобы не было необходимости вводить пароль. Я просто знаю, что sudo не запрашивает пароль какое-то время после первого раза, поэтому мне нужна аналогичная функциональность. Не уверен, что возможно.


person Jay    schedule 11.04.2012    source источник
comment
Как правило, это не будет работать слишком хорошо, потому что ваше расширение оболочки (в JavaScript) будет выполняться внутри того же процесса, что и сама оболочка, что подвергает его всевозможным «утечкам безопасности…». , на самом деле, использовать pkexec или иным образом изолировать «небезопасный» бит привилегированного кода в отдельном процессе… PS: повторный запрос пароля sudo и другими является общесистемной настройкой безопасности; по умолчанию обычно повторно запрашивается через (долгое) время   -  person BRPocock    schedule 03.08.2012
comment
@BRPocock да, я хочу использовать pkexec. Как бы я сделал это из расширения?   -  person Jay    schedule 03.08.2012


Ответы (2)


Я давно не работал с PolicyKit, но, насколько я помню, вам действительно нужно создать файл в каталоге action/ с таким содержимым:

<?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.freedesktop.policykit.pkexec.run-ifconfig">
    <description>Configure network</description>
    <message>Authentication is required to set ifconfig parameters</message>
    <defaults>
      <allow_any>no</allow_any>
      <allow_inactive>no</allow_inactive>
      <allow_active>...</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/sbin/ifconfig</annotate>
  </action>

</policyconfig>

Вы должны изменить значение в:

<allow_active>...</allow_active>

До нужного вам значения. Выбор значения :

  • "нет" запретит доступ
  • "да" будет неявно разрешать доступ
  • «auth_user» требует аутентификации пользователя
  • «auth_admin» требует аутентификации администратора.
  • «auth_user_keep» и «auth_admin_keep» работают аналогично, но сохраняют аутентификацию в течение нескольких минут после этого.
  • Плюс некоторые другие значения, см. здесь.

Изменение значения ключа allow_active на «yes» должно остановить запросы аутентификации.

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

Хьюго,

person pistache    schedule 18.10.2012

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

Как ответили другие, вам может потребоваться написать файл политики (я использовал «auth_admin»). Я поместил его в «/usr/share/polkit-1/actions/tuned-adm.policy». Я не думаю, что смогу распространять это через модель расширений, поэтому мне придется попросить апстрим включить это.

Затем я использовал pkexec и свою команду, чтобы получить «всплывающее окно sudo» и заставить его работать.

const GLib = imports.gi.GLib;
const Util = imports.misc.util;
this.pkexec_path = GLib.find_program_in_path('pkexec');
this.tunedadm_path = GLib.find_program_in_path('tuned-adm');
let result = Util.trySpawnCommandLine(this.pkexec_path + " " + this.tunedadm_path  + " list")

Настоящим кикером здесь было то, что я использовал пару других методов для запуска командной строки, и они блокировали gnome-shell. Я нашел код здесь: https://github.com/nodefourtytwo/gnome-shell-extension-cpu-freq/blob/master/extension.js, чтобы быть особенно удобным.

person 1angdon    schedule 14.05.2014