Вопрос или проблема
С Xorg я мог просто сделать
xhost +si:localuser:foxy
чтобы запустить GUI приложение как пользователь foxy.
Но могу ли я это сделать на Wayland? Я попробовал следующее:
chmod o+rw /run/user/1000/wayland-0
но все равно получаю Permission denied
[foxy@titan levi]$ QT_QPA_PLATFORM=wayland XDG_RUNTIME_DIR=/run/user/1000 konsole
Failed to create wl_display (Permission denied)
qt.qpa.plugin: Could not load the Qt platform plugin "wayland" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: wayland-org.kde.kwin.qpa, eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.
Aborted (core dumped)
Я использую kwin_wayland 5.20.2
EDIT: Я не хочу использовать root
Переключитесь на пользователя sudo su username или sudo su – username, а затем введите название приложения. Это тривиальный способ.
Только что хотел сделать что-то подобное, и следующее решение работает для меня.
Скажем, я вошел как source
и хочу временно дать доступ к моему экрану учётной записи с именем other
. В учётной записи “source” мне нужно разрешить учётной записи “other” доступ к сокету Wayland. Делать это через группы файловой системы Unix кажется наиболее совместимым, но setfacl
тоже работает и не требует root.
# root нужен для этого, так как это не самая лучшая идея
sudo chown :other "$XDG_RUNTIME_DIR" "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY"
chmod g+rwx "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY"
chmod g+x "$XDG_RUNTIME_DIR"
Предполагается, что у вас есть группа для пользователя “other”, которая совпадает с его именем, то есть по умолчанию на большинстве современных систем Linux. Она также выводит имя сокета Wayland, которое вам понадобится ниже.
Используйте machinectl
из systemd для переключения на пользователя other
и правильной настройки окружения другого пользователя:
machinectl shell \
--setenv=XDG_SESSION_TYPE --setenv=WAYLAND_DISPLAY \
--setenv=waysock="$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" \
other@
# размещаем сокет Wayland в правильном месте
ln -s "$waysock" "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY"
Вам затем должно быть возможно запускать программы Wayland, как вам нужно. По крайней мере те программы, которые я пробовал, работали: Ghostty, Firefox, Chromium и другие.
Некоторые программы предупреждают меня об уязвимых разрешениях здесь, как, вероятно, и следует, но все они, кажется, работают нормально.
Ответ или решение
На платформе Xorg, переключение пользователей для запуска графических приложений происходило достаточно просто с использованием команды xhost +si:localuser:foxy
. Однако, в случае Wayland, ситуация осложняется из-за изменения модели безопасности и архитектуры дисплейного сервера.
Теория
Wayland существенно изменяет модель безопасности при работе с графическим интерфейсом. В отличие от Xorg, где приложения имели доступ ко всем событиям ввода, Wayland ограничивает этот доступ, предоставляя каждому клиенту (приложению) собственное изолированное пространство. Это препятствует запуску приложений от имени другого пользователя из-за строгих условий доступа к сокетам Wayland, которые по умолчанию принадлежат определённому пользователю и имеют права на чтение и запись только для владельца.
Пример
Ситуация, описанная вами, касается попытки запустить GUI приложение от имени другого пользователя без предоставления ему привилегий root. Команда chmod o+rw /run/user/1000/wayland-0
не решает проблему, так как Wayland сервер требует более сложной настройки для обеспечения безопасности и изоляции пользователей. Попытка установить переменные окружения QT_QPA_PLATFORM
и XDG_RUNTIME_DIR
также не решит вопрос, если права на доступ к Wayland сокету не были корректно настроены.
Применение
Для решения данной задачи можно воспользоваться следующим подходом, предполагающим использование Unix-групп или ACL (Access Control Lists) для настройки разрешений:
-
Настройка прав доступа:
Вам необходимо изменить права на сокет Wayland. Это потенциально небезопасно и требует осторожности. Пример выполнения через ACL:sudo setfacl -m u:foxy:rw /run/user/1000/wayland-0
Данным методом вы даёте пользователю
foxy
права чтения и записи для сокета Wayland. Важно помнить, что ACL позволяет добавлять специфические разрешения для отдельных пользователей или групп без изменения основных прав доступа. -
Использование machinectl:
С помощью systemd можно легко переключиться в среду другого пользователя и одновременно настроить необходимые переменные окружения:machinectl shell \ --setenv=XDG_SESSION_TYPE=wayland \ --setenv=WAYLAND_DISPLAY=wayland-0 \ foxy@
Это позволяет изолировать запуск процесса от имени другого пользователя внутри безопасной среды, при этом автоматически настраивая нужные параметры окружения.
-
Создание символьной ссылки для сокета:
При переключении на другого пользователя, необходимо создать символическую ссылку на сокет Wayland, что может быть выполнено следующим образом:su -l foxy ln -s /run/user/1000/wayland-0 /run/user/$(id -u foxy)/wayland-0
Таким образом, вы обеспечите фоновый запуск процессов и выполнение графических приложений от лица другого пользователя, минимизируя вмешательства в архитектуру безопасности Wayland.
Наконец, следует помнить, что любой из перечисленных подходов должен использоваться с осторожностью, так как изменения прав доступа могут повлиять на безопасность системы. Важно также отмечать, что не все приложения могут корректно работать в такой конфигурации из-за своей зависимости от специфичных для пользователя ресурсов и настроек пути.
Следует экспериментировать и тестировать на менее критичных системах прежде чем применять данные методы в продуктивной среде, и в случае необходимости обратиться за помощью к документации по безопасности Wayland или сообществу для получения самых актуальных решений.