Как запускать графические приложения от имени root под Wayland

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

Под новым сервером отображения Wayland несколько приложений, требующих прав root, не запускаются. У меня есть ответ (один из способов обхода проблемы). Я приветствую любые более лучшие решения или критические замечания.

Многие другие ответы на эту проблему рекомендуют добавлять root к xhost, что, хотя и решает проблему, но немного нарушает модель безопасности Wayland. Гораздо лучше добавлять root к xhost только на время работы программы, будь то synaptic или gparted или что-то другое.

Gufw:

Отредактируйте ваш файл gufw.desktop (/usr/share/applications/gufw.desktop в Debian 10) и измените строку:

Exec=gufw

на

Exec=sh -c "xhost +si:localuser:root && gufw && xhost -si:localuser:root"

Synaptic:

Вдохновлено постом на: https://discourse.ubuntu.com/t/adding-applications-to-start-up/9288
Отредактируйте /usr/bin/synaptic-pkexec, чтобы закомментировать предупреждающее сообщение zenity (предполагается Debian 10) и измените строку:

exec "/usr/sbin/synaptic" "$@"

на

xhost +si:localuser:root
pkexec "/usr/sbin/synaptic" "$@"
xhost -si:localuser:root

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

В Wayland другие пользователи не могут запускать приложения, потому что они не могут получить доступ к файлу сокета Wayland, расположенного в $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY.
Однако root игнорирует все разрешения на файлы и поэтому может свободно получить доступ к файлу сокета, когда его полный путь указан в WAYLAND_DISPLAY. Из-за детали реализации в библиотеке клиента Wayland также необходимо определить XDG_RUNTIME_DIR на что-то (даже если фактическое значение не используется).

Таким образом, можно запустить Synaptic как чистое приложение Wayland, используя что-то вроде

sudo /bin/env WAYLAND_DISPLAY="$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY"  XDG_RUNTIME_DIR=/user/run/0  /usr/sbin/synaptic

Пока что я тестировал этот трюк только с Sway.

И если ssh включен для root, то также можно использовать waypipe: https://gitlab.freedesktop.org/mstoeckl/waypipe

waypipe ssh root@localhost synaptic

Вот скрипт shell для запуска любого приложения Wayland от имени root, используя sudo и waypipe (ssh не требуется). Это вдохновлено примерами из страницы man waypipe.

sudo не запускает полноценную пользовательскую сессию. Это может быть проблемой для некоторых приложений. См. комментарий для более подробной информации.

#!/bin/bash

# Есть небольшой риск коллизии при использовании -u, но это маловероятно.
SOCKET=`mktemp -u /tmp/sudo-waypipe.XXXXXXX.sock`

waypipe --socket "$SOCKET" client &

# waypipe --server требует наличия корректного директория XDG_RUNTIME_DIR для пользователя root.
#
# Обычно это должен быть /run/user/0 или /var/run/0
#
# К сожалению, sudo не создает пользовательскую сессию, поэтому эта переменная не установлена.
# Еще хуже, systemd удаляет директорию, когда последняя сессия завершается.
#
# На практике это означает, что мы не можем предполагать, что /run/user/0 или /var/run/0
# существуют и, даже если они существуют, небезопасно их использовать, потому что они могут
# быть удалены systemd в любой момент.
#
# В идеале, должна быть создаваться пользовательская сессия для пользователя 0 (через systemctl?)
# но это не так уж просто. Альтернатива - использование пользовательского каталога в /root
#
# Недостаток в том, что приложение может не иметь доступа к сервисам, таким как dbus.
#

sudo sh -c "XDG_RUNTIME_DIR=\$HOME/xdg-run/ ; mkdir -m 700 -p \$XDG_RUNTIME_DIR ; export XDG_RUNTIME_DIR ; waypipe --socket $SOCKET server -- $(printf "%q " "$@")"
kill %1
rm -f "$SOCKET"

Ни один из ответов мне не подошел, но я нашел один в соответствующем bug-report на gparted в самом низу.

Запустите sudo -EH <command> из оболочки без повышения привилегий. Это сработало, по крайней мере, для gparted.

Для меня самый простой и наиболее “wayland” способ достижения этого следующий:

$ echo 'Defaults   env_keep += "XDG_RUNTIME_DIR"
Defaults   env_keep += "WAYLAND_DISPLAY"' | sudo tee /etc/sudoers.d/wayland

Это создает /etc/sudoers.d/wayland и передает переменные окружения wayland всем, кто может использовать sudo. Чисто и легко просто добавить/удалить файл по мере необходимости. Без перезагрузок, магии xhost, магии ssh, магии socat/waypipe… просто sudo и wayland для использования sudo и wayland.

.

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

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

Проблема и ограничения

Под Wayland другие пользователи не могут запускать приложения из-за отсутствия доступа к сокет-файлу Wayland, расположенного в $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY. Однако root может игнорировать все разрешения на файлы и, следовательно, может получить доступ к этому файлу, если указать его полное имя в переменной WAYLAND_DISPLAY. Для работы клиентской библиотеки Wayland также необходимо установить XDG_RUNTIME_DIR.

Решения

  1. Изменение файла запуска приложения

    Например, для графического брандмауэра Gufw:

    • Откройте файл /usr/share/applications/gufw.desktop.
    • Замените строку Exec=gufw на:
      Exec=sh -c "xhost +si:localuser:root && gufw && xhost -si:localuser:root"
    • Это временно добавит root в допустимый список xhost только на время работы приложения, что минимизирует нарушения в модели безопасности Wayland.
  2. Изменение стартового скрипта Synaptic

    • В сценарии /usr/bin/synaptic-pkexec замените строку:
      exec "/usr/sbin/synaptic" "$@"

      на:

      xhost +si:localuser:root
      pkexec "/usr/sbin/synaptic" "$@"
      xhost -si:localuser:root
  3. Использование переменных окружения

    Пример для Synaptic:

    sudo /bin/env WAYLAND_DISPLAY="$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" XDG_RUNTIME_DIR=/user/run/0 /usr/sbin/synaptic

    Это решение работает, используя Sway, и может быть адаптировано для других приложений.

  4. Использование Waypipe

    Если у вас есть доступ по SSH на root:

    waypipe ssh root@localhost synaptic
  5. Скрипт для запуска Wayland-программы как root

    Пример скрипта с использованием sudo и waypipe:

    #!/bin/bash
    
    SOCKET=`mktemp -u /tmp/sudo-waypipe.XXXXXXX.sock`
    
    waypipe --socket "$SOCKET" client &
    
    sudo sh -c "XDG_RUNTIME_DIR=\$HOME/xdg-run/ ; mkdir -m 700 -p \$XDG_RUNTIME_DIR ; export XDG_RUNTIME_DIR ; waypipe --socket $SOCKET server -- $(printf "%q " "$@")"
    kill %1
    rm -f "$SOCKET"
  6. Минимальное и чистое решение с использованием sudo

    Добавление в файл /etc/sudoers.d/wayland:

    echo 'Defaults   env_keep += "XDG_RUNTIME_DIR"
    Defaults   env_keep += "WAYLAND_DISPLAY"' | sudo tee /etc/sudoers.d/wayland

    Это решение позволяет передавать переменные окружения Wayland пользователям, имеющим право использовать sudo.

Заключение

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

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

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