Xorg от непривилегированного пользователя
Образно.
Есть некий софт, которому нужны иксы.
Казалось бы, скачал, поставил, запустил - пользуйся.
Но вот, ведь, проблема, подобный софт (для меня подобный - абсолютно весь, не входящий в штатный репозиторий debian) я не хочу запускать:
- На своём хосте.
- От своего пользователя.
- Под Xorg моего пользователя.
- Допускать в мою/мои сети, в том числе 127.0.0.0
Кроме того, тот же браузер для “полазить” по сайтам и браузер для клиент-банка, это не один и тот же браузер, пользователь и, иногда, система.
Пункты 1, 2, 4, сейчас не рассматриваем, речь пойдёт об X.
В debian при стандартных настройках системы в качестве display manager используется LightDM.
В нём можно включить listen tcp, но процессы Xorg он запускает от root.
В gdm3 же наоборот, по умолчанию, он запускает Xorg от пользователя, который логинится в окружение, но в нём сломали возможность включить listen tcp.
Точнее оставили возможность выключить nolisten tcp,
но не включить listen tcp.
Для этого необходимо отредактировать обёртку над X.
Сначала установим gdm3 как DM по умолчанию, если его нет, то установим через apt.
dpkg-reconfigure gdm3
Разрешаем подключение по tcp
Файл /etc/gdm3/custom.conf, если нет, создаём
В /etc/gdm3/daemon.conf добавим строки
DisallowTCP=false действительно отключит ключ -nolisten tcp,
но ни AllowTCP=true,
ни ServerArguments не включат -listen tcp
Для этого редактируем скрипт-обёртку /usr/bin/X, «Это безопасно, уверяю».
Однако учтите, при обновлении пакета xorg этот файл будет перезаписан.
И кроме нужного -listen tcp, добавим немного кода.
Debian “bookworm”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Debian “trixie”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Думаю понятно, мой пользователь, myuser, получает -listen tcp :0 - стандартный порт :0
Тут стоит уточнить, что если у вас, например, три пользователя, основной, который всегда в системе.
И два других, которые могут чередоваться (вход/выход из системы).
Тогда, при стандартной настройке, основной получит порт :0, следующий кто залогинится, например user2 - получит xorg принимающий подключения на :1 (:6001), следующий user3 :2 (:6002), но, если user2 (:1) разлогинится, и залогинится опять - xorg получит следующий свободный порт :3 .
То есть чередование портов будет случайным и придётся постоянно указывать нужный порт при запуске нужного приложения.
А так мы добиваемся для каждого конкретного пользователя запуска xorg с -listen tcp на его собственном порте.
- myuser - :0
- vmuser - :5
- unprivilegeduser - :25
- anotheruser - :325
- остальные - -listen tcp, и следующий свободный порт, то есть 1,2,3,4,6, и так далее.
Смысл в том, что в kvm, в которой настроена среда, теперь можно запустить приложение и оно подключится именно к тому X, к которому нужно.
Например: DISPLAY=10.1.1.1:25.0 /usr/bin/gedit
Доступ контролируется на уровне iptables, и X конкретного пользователя, например, для unprivilegeduser это 6025 порт.
1 | |
Кроме iptables, в сессии пользователя необходимо разрешить подключение /usr/bin/xhost + 10.1.1.125, можете автоматизировать как захотите, или через ~/.profile, у меня это ~/.config/autostart/init.sh.desktop
Скрипт unprivilegeduser-init.sh содержит все необходимые команды,
включая xhost + 10.1.1.125
В kvm, в .bash_profile нужного пользователя добавляем строку
export DISPLAY=10.1.1.1:25.0
Теперь, при запуске приложения в kvm, оно будет отображаться в X-сессии пользователя unprivilegeduser.
Мало? Запретим все сети для этого пользователя
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Важные замечания
Напомню, в зоне вашего внимания сейчас два пользователя:
unprivilegeduser - на уровне хоста, от которого запущен Xorg, который не должен иметь доступа ни к каким сетям, кроме kvmbr0.
И некий пользователь, например, insidekvmuser от которого запускается gedit в kvm.
Далее, для перенаправления всего трафика в туннель необходимо управлять сетями именно insidekvmuser.
Этот пример не гарантирует полной изоляции процессов этих пользователей, однако позволяет не беспокоится об clipboard-буфере, информации на дисплее из других приложений и доступе к системным и пользовательским директориям.
Почему не использовать vncviewer/virt-viewer/spice?
Да, эти варианты исключают хост, оставляя все процессы в виртуальной среде kvm/lxc, однако скорость отрисовки vncviewer или spice не может сравниться с подключением по сети к xorg, он разве что немного отстаёт в скорости от нативного. Но тут уже вам решать.