Как настроить pkexec, чтобы он не запрашивал пароль?

12

У меня есть приложение с графическим интерфейсом, который должен вызвать демон (написанный на Python) с привилегиями суперпользователя. Я хотел бы сделать это, не запрашивая у пользователя пароль.

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

В этой ситуации я обычно добавляю строку, /etc/sudoersкоторая позволяет пользователям запускать демон от имени пользователя root без пароля, используя директиву NOPASSWD. Это отлично работает из командной строки. Однако, когда я делаю это из GUI, появляется pkexecдиалоговое окно с запросом пароля пользователя. Похоже, что в Ubuntu вызовы sudoиз GUI как-то перехватываются pkexec.

Есть ли чистый способ обойти это? Я действительно предпочел бы не иметь дело с трудностями сценария setuid.

Чинмай Канчи
источник
О каком приложении вы говорите?
Раду Рэдяну
Любое приложение с графическим интерфейсом. Когда приложение с графическим интерфейсом пытается запустить sudo somecommand, всплывающее диалоговое окно является pkexecдиалоговым окном пароля, независимо от того, существует ли политика sudoers, разрешающая выполнение программы.
Чинмай Канчи

Ответы:

14

Неправильно говорить следующее: «Похоже, что в Ubuntu вызовы sudoиз GUI каким-то образом перехватываются pkexec» . pkexecне имеет много общего с sudo. В отличие от этого sudo, pkexecне предоставляет root-права для всего процесса, а скорее обеспечивает более точный уровень контроля над политикой централизованной системы.

Теперь, если вы хотите запустить приложение с графическим интерфейсом без запроса пароля pkexec, это не сложно сделать. Давайте возьмем для примера GParted . Когда вы откроете его, вы увидите следующее диалоговое окно с запросом пароля:

gparted authenticate

Нажмите Детали, и диалоговое окно теперь будет выглядеть так:

gparted authenticate - подробности

Отсюда все, что вам нужно сделать, это открыть файл, используя, например, следующую команду:/usr/share/polkit-1/actions/com.ubuntu.pkexec.gparted.policy

gksu gedit /usr/share/polkit-1/actions/com.ubuntu.pkexec.gparted.policy

и измените следующие строки:

      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin</allow_active>

со следующим:

      <allow_any>yes</allow_any>
      <allow_inactive>yes</allow_inactive>
      <allow_active>yes</allow_active>

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

Раду Рэдяну
источник
Да, pkexec действительно перехватывает вызовы sudo. Позвольте мне посмотреть, смогу ли я построить минимальный пример такого поведения.
Чинмай Канчи
Я не могу воспроизвести это в простом приложении, это может произойти только в некоторых очень специфических ситуациях, и у меня нет времени, чтобы отследить ошибку. Я собираюсь принять ваш ответ. Приветствия.
Чинмай Канчи
@ChinmayKanchi Давайте будем более ясными. Я возьму для примера снова gparted. Когда вы запускаете из терминала sudo gparted, вы запускаете /usr/sbin/gpartedфайл с правами root. Когда вы начинаете gpartedс графического интерфейса, вы фактически начинаете gparted-pkexec(вы можете проверить это внутри /usr/share/applications/gparted.desktopфайла), /usr/bin/gparted-pkexecто есть это сценарий оболочки, целью которого является выполнение следующей команды: pkexec "/usr/sbin/gparted"что эквивалентно pkexec gparted. Так что тут не при чем sudo. И эту команду вы должны использовать в терминале, а не sudo gparted.
Раду Рэдяну
1
@ChinmayKanchi sudoследует использовать только для приложений оболочки, а не для приложений с графическим интерфейсом. Смотри man sudoи man pkexecв этом смысле.
Раду Рэдяну
Да, я в курсе обеих ваших точек зрения. Моя ситуация такова, что у меня есть приложение GUI (написанное мной), которое пытается запустить программу оболочки (демон, также написанный мной), используя sudo. По какой-то причине это приводит к вызову pkexec вместо sudo, что означает, что любые политики sudo, которые я создал для демона, игнорируются.
Чинмай Канчи