Заставить polkit использовать текстовый агент аутентификации в графической сессии.

Вопрос или проблема

Я использую дистрибутив Secureblue Linux и мне не нравится, что когда я запускаю скрипт, который в конечном итоге вызывает run0, и оставляю его работать, делая что-то еще в ожидании, внезапно появляется всплывающее окно, в котором меня просят ввести пароль, и я не понимаю, о чем идет речь!

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

Тем не менее, я попробовал установить tmux и запустить pkttyagent в одной панели tmux, а скрипт в другой, но диалоговое окно аутентификации GUI все равно появилось, как и раньше, и pkttyagent ничего не сделал.

Даже когда я использовал свежую, отдельную шину сессии dbus с помощью dbus-run-session tmux, все равно не сработало.

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

Введите machinectl shell $USER@

Это запустит новую XDG-сессию и создаст новый процесс оболочки в этой сессии. (TIL: переменные окружения XDG сессии тоже используются в терминальных сессиях, а не только в графических средах рабочего стола!)

После этого введите run0 или запустите свой скрипт, и вы получите текстовый запрос аутентификации от polkit в нужное время вместо графического.

Я всегда думаю о polkit как о sudo в мире GUI. Хороший справочник находится здесь:

https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html

Перехват экрана на вашем рабочем столе выполняется агентом polkit. Polkit использует Dbus для нахождения и взаимодействия с агентом, и среда рабочего стола часто предоставляет эти агенты. Может быть важно иметь агент polkit, интегрированный в вашу рабочую среду, поскольку процесс, запрашивающий аутентификацию, не всегда имеет доступный родительский терминал.

В некоторых случаях удаление агента рабочей среды может быть простым как удаление пакета, который его предоставляет. В некоторых случаях это может привести к тому, что polkit вернется к текстовому агенту, что, похоже, то, что вы ищете.

На debian это могут быть:

  • Lomiri: lomiri-polkit-agent
  • LXDE: lxpolkit
  • MATE: mate-polkit
  • KDE: polkit-kde-agent-1
  • UKUI: ukui-polkit

Однако имейте в виду, что административные задачи, которые могут выполняться в вашей рабочей среде (настройки сети, управление пользователями, принтерами), могут не работать.

Вместо этого вам, вероятно, нужно исправить обычные случаи аутентификации polkit, которые возникают в вашем скрипте.

При написании скриптов, требующих повышенных привилегий, я обычно пишу короткие целевые скрипты, выполняющие только одно действие. Затем я вызываю их из не привилегированных процессов (возможно, GUI) через pkexec.

pkexec /usr/local/bin/scary

Обычно это вызывает агент polkit с общим сообщением, но мы можем настроить его так, чтобы мы понимали, что именно мы подписываем.

Мы делаем это, определяя “действия”.

Здесь дистрибутивы расходятся. Я работаю в среде, основанной на debian (polkit<=105), поэтому остальная часть этого ответа исходит отсюда. polkit >= 106 используется в некоторых других дистрибутивах и не является обратимой совместимостью.

Я бы определил /usr/share/polkit-1/actions/local.scary.policy с таким содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD polkit Policy Configuration 1.0//EN"
           "http://www.freedesktop.org/software/polkit/policyconfig-1.dtd">

<policyconfig>
  <vendor>Me</vendor>
  <vendor_url>me.example.com</vendor_url>
  <action id="local.scary.policy">
    <description>Мне нужно сделать это страшное дело</description>
    <description>Мне действительно нужна ваша аутентификация, чтобы сделать это</description>
    <annotate key="org.freedesktop.policykit.exec.path">/usr/local/bin/scary</annotate>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>no</allow_inactive>
      <allow_active>auth_admin</allow_active>
    </defaults>
  </action>
</policyconfig>

Это означает, что всякий раз, когда я использую pkexec на /usr/local/bin/scary, он попытается аутентифицировать пользователя на активной консоли (неактивные консоли не допускаются). Кастомное сообщение будет доставлено пользователю через агент polkit, чтобы они точно знали, что авторизуют.


Конечно, если вы выполняете все это из терминала (без GUI), и хотите локальные уведомления в терминале владельца, это не так уж и отличается от:

echo "Я собираюсь сделать страшную вещь"
sudo /usr/local/bin/scary

Редактировать: Еще одна быстрая мысль…

Polkit попытается аутентифицировать пользователя через ту же “сессию”, что и скрипт, который его запускает. Если вам не нравится использование системы уведомлений рабочей среды, попробуйте использовать сессию, которая не имеет рабочей среды. Это может быть так просто, как ssh localhost или machinectl login, чтобы создать стерильную и отсоединенную сессию. Polkit перейдет в текстовый агент, потому что в этой среде не запущена рабочая среда.

.

Ответ или решение

Политика (polkit) в Linux предоставляет фреймворк для контролируемого управления привилегиями, который в большинстве случаев ассоциируется с графическим интерфейсом пользователя (GUI). Однако в некоторых ситуациях, например, когда пользователь работает в графическом окружении, аутентификация на основе GUI может вызывать неудобства или вопросы безопасности. Выраженная вами проблема, когда неожиданно появляется всплывающее окно с запросом пароля, действительно может вызывать беспокойство или даже раздражение у пользователей, работающих в командной строке.

Теория

Polkit действует как механизм, схожий с sudo, но ориентирован на применение в графическом окружении, где разные приложения могут запрашивать повышение привилегий. Он работает через D-Bus, который является механизмом межпроцессного взаимодействия, и ищет agenty аутентификации для получения данных пользователя.

Традиционно, DE (десктопные окружения) предоставляют своих агентов для аутентификации через polkit. Когда приложение запрашивает привилегии, агент polkit в плотной интеграции с DE обеспечивает отображение запроса.

Однако, в ситуациях, когда GUI недоступен или нежелателен, можно использовать текстовые агенты polkit. Это позволяет сохранить логическую связь между действием, вызывающим запрос привилегий, и контекстом, в котором был инициирован этот процесс.

Пример

Вы упомянули о попытке использовать pkttyagent в tmux-окне для улавливания запросов polkit. Однако операция не увенчалась успехом из-за использования session bus вместо system bus. Одна из причин, по которым не удается использовать pkttyagent, заключается в том, что polkit в привычных условиях полагается на системный bus для передачи прав доступа, и изменение сессионного bus не затрагивает этот процесс.

Как вы упомянули, запуск через machinectl shell $USER@ позволяет пересоздать XDG-сессию без графического агента. Это помогает переключиться от графического запроса к текстовому интерфейсу, запуск которого происходит в терминале.

Применение

Если ваша цель заключается в переходе на текстовую аутентификацию внутри текущей среды, можно предпринять несколько шагов:

  1. Удаление агент-пакетов DE: Многие десктопные окружения поставляются с собственными агентами polkit. Удаление этих пакетов может частично решить проблему и заставить polkit по умолчанию использовать текстовый агент. Однако это может негативно повлиять на другие аспекты системы, такие как конфигурация сети или администрирование пользователей.

  2. Создание кастомного действия polkit: Если часто возникают запросы на аутентификацию по одному и тому же сценарию, вы можете определить собственные "actions" в polkit. Это позволит не только персонализировать запросы, но и задать политики для выполнения ваших скриптов. Как было продемонстрировано, в файле /usr/share/polkit-1/actions/local.scary.policy можно настроить действия, описав их в формате XML.

  3. Использование ssh или machinectl login: Выполнение скриптов в среде без DE (к примеру, через ssh localhost) предложит текстовую аутентификацию по умолчанию. Это обеспечивает более прозрачный процесс, когда аутентификация вызывается в том же терминале, где и запущен скрипт.

Применение описанных выше техник позволит вам настроить polkit так, чтобы поведение системы соответствовало вашим ожиданиям, и минимизировать отвлечения, вызываемые всплывающими окнами GUI. Улучшение управления аутентификацией приводит к наиболее подходящему и безопасному подходу к процессам, требующим повышения привилегий в пределах вашего рабочего процесса.

Эти шаги требуют основательного понимания работы polkit и связанного с ним окружения, но они позволят вам управлять системой более осознанно и избежать неожиданных всплывающих аутентификационных запросов. В результате этого процесс повышения привилегий будет более прозрачным и безопасным для выполнения необходимых задач.

Оцените материал
Добавить комментарий

Капча загружается...