Одновременный запуск графических программ из-под разных пользователей
Мотивация:
Методы:
Метод | Примеры программ | Возможные уязвимости |
---|---|---|
1. Использование одного и того же X-сервера разными пользователями | ssh -X, xhost, gksu | Поскольку X-сервер общий, программы, запущенные из-под одного пользователя, могут пользоваться штатными возможностями X-сервера для доступа к чужим окнам. В частности, любая программа, запущенная под одним пользователем, имеет полный доступ ко всем открытым окнам другого пользователя. Это позволяет ей делать снимки чужих окон и всего экрана, считывать нажатия всех клавиш под чужим пользователем (через xev), а также иметь с ним общий буфер обмена для копирования и вставки текста. |
2. Запуск нового X-сервера в уже запущенном X-сервере | Xnest, Xephyr | Родительский X-сервер имеет полный доступ к дочернему, потому штатным способом может делать всё то, что описано в уязвимостях метода 1 (снимки чужого экрана, считывание нажатых клавиш), за исключением того, что буфер теперь раздельный. При этом, однако, дочерний X-сервер не имеет никакого доступа к родительскому. |
3. Независимый запуск разных X-серверов для разных пользователей | xdm, gdm, kdm, вручную | Отсутствуют штатные возможности обхода настроек, указанные для методов 1 и 2. Единственный способ обойти настройки — использование серьёзной уязвимости в самом X-сервере или в операционной системе (local root). |
Один X-сервер для разных пользователей
Для запуска графических программ в X-сервере Xorg имеется скрипт sux, который работает только из графического терминала (т.е. запущенного в иксах).
Использование gksu
Для запуска программ из графической оболочки также можно использовать gksu: к примеру, создать пункт меню, горячую клавишу или значок, выполняющие следующую комманду для нужного приложения (в данном случае рассмотрен случай браузера iceweasel):
export TZ=UTC; gksu -w -u tornet_user '(cd ~ ; /usr/bin/iceweasel)'
Не забывайте, что использование gksu потенциально опасно: уязвимая программа может получить доступ к X-серверу (см. таблицу выше). У программы gksu также имеются некоторые аналоги.
Использование SSH
Запуск графических программ под другим пользователем (AnotherUser), так же возможен через ssh:
$ ssh -X AnotherUser@localhost $ /usr/bin/iceweasel
XAuthLocation /usr/bin/xauth X11Forwarding yes
# /etc/init.d/ssh reload
# /etc/rc.d/sshd reload
Новый X-сервер в уже запущенном
Использование Xnest
Создайте скрипт
#!/bin/sh Xnest -ac :25 -geometry 1024x768 & ВашОконныйМенеджер -display :25 &
$ chmod +x ИмяСкрипта
$ ./ИмяСкрипта
Независимый запуск разных X-серверов
По сравнению с вышерассмотренными случаями независимый запуск нескольких копий X-серверов (каждый — для своего пользователя) является более надёжным и безопасным. Однако:
- Закрытые видеодрайвера могут в некоторых случаях не поддерживать этот режим
- При параллельном запуске X-серверов также возникает вопрос их безопасности: на каждом из одновременно работающих X-серверов будет запущен свой скринсейвер, блокирующий экран, но при этом имеется трудность блокирования всех открытых сессий одновременно.
Запуск вручную
Без использования мультиплексоров
Самый простой, но неудобный при систематическом использовании способ, состоит в следующем. Запустите из-под одной консоли
# startx ; logout
# startx -- :1 ; logout
# startx -- :1 ; logout
C использованием мультиплексоров
Минус метода без использования мультиплексоров в том, что консоли остаются занятыми. Чтобы этого избежать, рекомендуется воспользоваться мультиплексором консолей tmux или его аналогом screen: выполните
$ screen -S myname $ startx -- :1 Нажмите Ctrl+a d [т.е. нажмите «Ctrl+a», отпустите, а потом нажмите «d»] $ exit
$ startx -- :2
Консоль в этом методе остаётся разлогиненой, а всё, что в иксах, — пишется в терминал в screen (или в tmux, если вы пользуетесь им). При желании просмотреть логи иксов screen может быть «прикреплён» к терминалу командой
$ screen -rd myname
Для переключения между X-серверами и текстовыми консолями пользуйтесь клавишами «Ctrl + Alt + F1», «Ctrl + Alt + F2», «Ctrl + Alt + F7», «Ctrl + Alt + F8» и т.д. В Ubuntu дисплеи на F1-F6 по умолчанию заняты текстовыми консолями, а F7 и более высокие номера (если имеются) — иксами.
Запуск с использованием менеджеров дисплеев
Использование менеджеров входа в систему (xdm, gdm, kdm и других) является самым удобным и безопасным методом из здесь перечисляемых. Учтите, что параллельный запуск X-серверов требует дополнительных ресурсов, и потому для него предпочтительны легковесные графические оболочки — оконные меджеры, являющиеся разумной альтернативой интегрированным графическим средам (gnome, kde, xfce).
Использование GDM
Для запуска GDM одновременно на нескольких дисплеях (консолях) отредактируйте его конфигурационный файл так, чтобы там были строки, содержащие информацию о новых дисплеях (vt8-vt12):
[servers] 5=Standard vt12 4=Standard vt11 3=Standard vt10 2=Standard vt9 1=Standard vt8 0=Standard vt7
Использование KDM
Для запуска KDM одновременно на нескольких дисплеях (консолях) отредактируйте его конфигурационный файл /etc/kde4/kdm/kdmrc так, чтобы там были строки, содержащие информацию о новых дисплеях (vt8-vt9):
[X-:0-Core] ServerVT=7 [X-:1-Core] ServerVT=8 [X-:2-Core] ServerVT=9
Использование XDM
Чтобы запустить XDM на двух консолях одновременно (диспели 0 и 1), нужно отредактировать файл xdm-config так, чтобы он содержал строки
DisplayManager._0.setup: /path/to/xdm/Xsetup_0 DisplayManager._0.startup: /path/to/xdm/GiveConsole DisplayManager._0.reset: /path/to/xdm/TakeConsole DisplayManager._1.setup: /path/to/xdm/Xsetup_0 DisplayManager._1.startup: /path/to/xdm/GiveConsole DisplayManager._1.reset: /path/to/xdm/TakeConsole
:0 local /path/to/X :0 vt07 :1 local /path/to/X :1 vt08
$ whereis X
Если в вышеприведённой строке с «DisplayManager._1.setup» заменить Xsetup_0 на новый файл Xsetup_1, то, внося разные настройки в конфигурационные файлы Xsetup_0 и Xsetup_1, можно добиться разного внешнего вида для нулевого и первого дисплеев. Внешний вид настраивается в файле Xresources, находящемся в той же директории. Он позволяет менять цвета, шрифты, фоновое изображение, список запущенных по умолчанию программ (например, часы) и т.д. Например, если в Xsetup_0 (или в Xsetup_1) прописать строки
/path/to/xpmroot картинка-в-формате-xpm.xpm /path/to/xsetroot -cursor_name arrow &
Можно не запускать getty на F2 и более высоких: пусть консоль будет только на F1, тогда можно запустить 11 иксов штатным образом (F2-F12). Если хочется ещё больше, то не знаю. Наверное, как-то тоже можно.
В общем, работает крайне глючно и неприятно, пользоваться тяжело. Может, под другой ОС (или другой версией иксов) было бы всё ОК.
P.S. Xnest тестировался скриптом типа
В современных версиях xdm в этом нет необходимости, там указываются единые настройки для всех дисплеев, и по умолчанию конкретизации нет:
По умолчанию там написано
расшаривает иксы на весь интернет [1], [2]будет слушать с моря погоду на 0.0.0.0:600X (наверно, слушать по умолчанию на 127.0.0.1:600X было бы слишком безопасно для иксов, поэтому разработчики на это не пошли).Следует признать, что это уже не так или даже всегда было не так. В конфиге xdm'а --nolisten tcp прописано по умолчанию, но ручного старта иксов это не касается. Припоминаю, что уже давно так. Когда-то запускал вручную, и меня нервировало, что вывод netstat -lpn показывает, как иксы слушают на портах. Конечно, есть файерволл, но всё равно ни к чему это.
Там всё хитрее. ☹ Запускаются они на другом дисплее только от рута. Можно запускать в т.ч. из screen/tmux. Можно запустить и на текущем дисплее через
Тут вот unknown предлагал делать
Непонятно, почему система не даёт прав юзеру запустить что-то на иных дисплеях. В BSD это работает так: система создаёт дисплей, но не запускает на нём getty. Если предварительно дисплей создан, то на нём по желанию далее можно запустить либо getty, и тогда там будет текстовый терминал с консолью, либо иксы. Когда юзер пытается, залогинившись в текстовый терминал, запустить иксы, система проверяет, есть ли свободные созданные дисплеи. Если есть, то иксы запускаются на самом младшем из незанятых дисплеев. По умолчанию при старте системы есть только один незанятый дисплей, и он традиционно занимается иксами или менеджером типа xdm, поэтому дополнительные требуется создавать вручную. В Debian, похоже, по умолчанию создаётся два дисплея (по крайней мере, ctrl+alt+F8 работает, и там ничего не запущено, хотя один дисплей уже занят иксами). Кто-нибудь может популярно растолковать, как это работает в Linux?
комментариев: 11558 документов: 1036 редакций: 4118
комментариев: 11558 документов: 1036 редакций: 4118
А что тогда? Работать в профиле от текущего пользователя? А если я хочу запустить тот же ТВВ от другого пользователя?
Как быть с apt-get update&&upgrade ?
Хорошее желание, запустите честно от другого пользователя, чтоб он с первым явно никак не был связан. Иначе уязвимость в одном из них будет троянить и другого. Вы же под «запустить от другого» понимаете не просто запуск от другого, а запуск от другого из-под текущего юзера, а это разные вещи.
Ctrl+Alt+F1, логинимся в текстовой консоли под рутом, выполняем.
Alt-F2, запускаем xterm. 'su' вводим пароль от рута, выполняем.
Какая такая разница между xterm и консолькой на F1?
Или sudo "выполняем".
gksu – ещё знаете есть, зачем-то же её придумали.
комментариев: 11558 документов: 1036 редакций: 4118
В общем, это объясняет, почему было:
Как не трудно догадаться, в одном месте я «:0» исправил на «:1», а в другом нет. После пофикса
Обнаружено было так: трюк с
Полный список «transport types» не приведён. А что, иксы ещё могут слушать по UDP-порту? Или по какому-нибудь IPX?