Вопрос или проблема
Под новым сервером отображения 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.
Решения
-
Изменение файла запуска приложения
Например, для графического брандмауэра Gufw:
- Откройте файл
/usr/share/applications/gufw.desktop
. - Замените строку
Exec=gufw
на:Exec=sh -c "xhost +si:localuser:root && gufw && xhost -si:localuser:root"
- Это временно добавит root в допустимый список
xhost
только на время работы приложения, что минимизирует нарушения в модели безопасности Wayland.
- Откройте файл
-
Изменение стартового скрипта Synaptic
- В сценарии
/usr/bin/synaptic-pkexec
замените строку:exec "/usr/sbin/synaptic" "$@"
на:
xhost +si:localuser:root pkexec "/usr/sbin/synaptic" "$@" xhost -si:localuser:root
- В сценарии
-
Использование переменных окружения
Пример для Synaptic:
sudo /bin/env WAYLAND_DISPLAY="$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" XDG_RUNTIME_DIR=/user/run/0 /usr/sbin/synaptic
Это решение работает, используя Sway, и может быть адаптировано для других приложений.
-
Использование Waypipe
Если у вас есть доступ по SSH на root:
waypipe ssh root@localhost synaptic
-
Скрипт для запуска 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"
-
Минимальное и чистое решение с использованием 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 окружения рекомендуется использовать подход, минимально влияющий на его модель безопасности. Вышеперечисленные решения обеспечивают различные уровни управления доступом, что позволяет выбрать наиболее подходящее под конкретные задачи и окружение.