id: Гость   вход   регистрация
текущее время 02:14 28/04/2024
Владелец: unknown (создано 24/06/2012 20:52), редакция от 27/01/2013 06:29 (автор: spinore) Печать
Категории: софт, операционные системы
https://www.pgpru.com/Библиотека/Руководства/СетеваяАнонимность/ПродвинутоеИспользованиеTorвUnix/ПараллельныйЗапускX-серверовДляРазныхПользователей
создать
просмотр
редакции
ссылки

Одновременный запуск графических программ из-под разных пользователей



Мотивация:


Разделение Tor-потока по пользователям, «заворачивающего» их на разные порты и сетевые интерфейсы, требует удобного и безопасного способа настройки. Самое безопасное решение этой задачи — использование физически разных машин или виртуализации, но возможен и упрощённый (хотя и менее безопасный) способ настройки, основанный на том, что операционная система допускает одновременную работу разных пользователей. Ниже приводены несколько рецептов по такой настройке при работе с графическими программами (настройка одновременной работы разных пользователей в консоли проще и потому не вызывает вопросов).

Методы:


Есть три способа одновременного запуска графических программ под разными пользователями. В порядке увеличения безопасности они располагаются следющим образом:
МетодПримеры программВозможные уязвимости
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
Чтобы эта опция работала, в конфигурационном файле SSH-сервера (/etc/ssh/sshd_config) должны быть опции
XAuthLocation /usr/bin/xauth
X11Forwarding yes
После редактирования файла /etc/ssh/sshd_config перезагрузите настройки SSH-сервера командой от root'а
# /etc/init.d/ssh reload
(для Ubuntu) или
# /etc/rc.d/sshd reload
(для BSD).

Новый X-сервер в уже запущенном

Использование Xnest


Создайте скрипт

#!/bin/sh
Xnest -ac :25 -geometry 1024x768 &
ВашОконныйМенеджер -display :25 &
где вместо «ВашОконныйМенеджер» подставьте вами используемый (например, awesome, fluxbox, openbox, xmonad, dwm, ion3, windowmaker, ratpoison, wmii-3, badwm и др.), а вместо «1024x768» напишите правильное разрешение вашего экрана. Не забудьте (при необходимости) написать правильные конфиги для оконного менеджера и положить их в домашнюю директорию ($HOME). Назначьте этому скрипту права на исполнение:
$ chmod +x ИмяСкрипта
и запустите его:
$ ./ИмяСкрипта
Известно, что раскладка клавиатуры некорректно работает при переключениях между созданным через Xnest дочерним X-сервером и родительским. В частности, если для смены раскладки используется CapsLock, то при переключении в другой X-сервер режим заглавных букв будет включаться по умолчанию. Из-за этого требуется каждый раз вручную переходить в режим строчных букв (нажатие shift+CapsLock) и, затем, снова переключать раскладку. Если вы часто переключаетесь между родительским и дочерним X-серверами, это может вызывать существенное неудобство. Следует отметить, что Xnest уже устарел и не поддерживается, потому предпочительнее пользоваться Xephyr.

Независимый запуск разных X-серверов


По сравнению с вышерассмотренными случаями независимый запуск нескольких копий X-серверов (каждый — для своего пользователя) является более надёжным и безопасным. Однако:


  • Закрытые видеодрайвера могут в некоторых случаях не поддерживать этот режим
  • При параллельном запуске X-серверов также возникает вопрос их безопасности: на каждом из одновременно работающих X-серверов будет запущен свой скринсейвер, блокирующий экран, но при этом имеется трудность блокирования всех открытых сессий одновременно.

Запуск вручную

Без использования мультиплексоров


Самый простой, но неудобный при систематическом использовании способ, состоит в следующем. Запустите из-под одной консоли

# startx ; logout
при этом должны запуститься иксы для первого пользователя. Переключитесь в другую (свободную) консоль нажатием Ctrl + Alt + F2 (вместо F2 могут быть F3, F4 и т.д.) и выполните
# startx -- :1 ; logout
при этом должны запуститься иксы для второго пользователя. Аналогично, если указать «startx -- :2 ; logout», — то для третьего, и т.д. Заметьте, что если одни иксы уже запущены в системе, то надо сразу начинать с команды
# startx -- :1 ; logout

C использованием мультиплексоров


Минус метода без использования мультиплексоров в том, что консоли остаются занятыми. Чтобы этого избежать, рекомендуется воспользоваться мультиплексором консолей tmux или его аналогом screen: выполните

$ screen -S myname
$ startx -- :1
Нажмите Ctrl+a d [т.е. нажмите «Ctrl+a», отпустите, а потом нажмите «d»]
$ exit
Если трубется запустить более, чем одни иксы, после startx создайте ещё одно окно-шелл нажатием «Ctrl+a c» [т.е. нажмите «Ctrl+a», отпустите, а потом нажите «c»] и выполните в нём
$ startx -- :2
Теперь вы можете открепить screen командой «Ctrl+a d» и выйти с помощью команды exit.

Консоль в этом методе остаётся разлогиненой, а всё, что в иксах, — пишется в терминал в screen (или в tmux, если вы пользуетесь им). При желании просмотреть логи иксов screen может быть «прикреплён» к терминалу командой
$ screen -rd myname
Переключение между разными окнами-шеллами в screen осуществляется нажатием «Ctrl+a a» (между текущим и предыдущим) или «Ctrl+a Номер», где «Номер» — клавиша 0, 1, 2 и т.д.

Для переключения между 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
Данный пример запускает X-сервера на шести дисплеях.

Использование KDM


Для запуска KDM одновременно на нескольких дисплеях (консолях) отредактируйте его конфигурационный файл /etc/kde4/kdm/kdmrc так, чтобы там были строки, содержащие информацию о новых дисплеях (vt8-vt9):

[X-:0-Core]
ServerVT=7
 
[X-:1-Core]
ServerVT=8
 
[X-:2-Core]
ServerVT=9
Данный пример запускает X-сервера на трёх дисплеях.

Использование 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
Вместо «/path/to» подставьте путь к конфигурационной директории xdm в вашей системе. Затем отредактируйте файл Xservers, находящейся в той же директории, так, чтобы он содержал строки
:0 local /path/to/X :0 vt07
:1 local /path/to/X :1 vt08
при этом переключение в иксы 0 и 1 будет работать по нажатию «Ctrl+Alt+F7» и «Ctrl+Alt+F8», соответственно. Правильный путь к X, который надо подставить, выдаёт команда
$ whereis X
Заметьте, что в случае BSD экраны на F7 и F8 должны быть предварительно созданы (см. настройки в файле /etc/ttys) и при этом свободны, т.е. не иметь ни запущенных иксов, ни getty (текстовый шелл с приглашением login).

Если в вышеприведённой строке с «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 &
где «/path/to» — правильный путь к соответствующим программам в вашей системе, то будет рисоваться картинка и показываться курсор мыши.


 
На страницу: 1, 2 След.
Комментарии [скрыть комментарии/форму]
— Гость (28/01/2013 00:30)   <#>
А можно ли по-простому запустить более 6 иксов одновременно-параллельно (без X-nest и всякой псевдовиртуализации)? Не занимая сочетаний [Ctrl + Alt + F2] … [Ctrl + Alt + F6]?

Можно не запускать getty на F2 и более высоких: пусть консоль будет только на F1, тогда можно запустить 11 иксов штатным образом (F2-F12). Если хочется ещё больше, то не знаю. Наверное, как-то тоже можно.
— Гость (28/01/2013 02:07)   <#>
# cat /etc/lightdm/lightdm.conf
Блин, да сколько уже их у вас там? Огласите сразу весь список.
— Гость (22/06/2013 02:41)   <#>
/comment54279: Хотелось бы вставить вариант с Xephyr
...
Если у кого есть готовый краткий мануал-схема с VNC и Xephyr, кладите в комментарии

/comment45276: Запостите кто-нибудь простую настройку Xephyr.

#!/bin/sh
Xephyr :25 -fullscreen  &
sleep 1;
DISPLAY=:25.0 ВашОконныйМенеджер &
DISPLAY=:25.0 xrdb $HOME/.Xresources &
DISPLAY=:25.0 setxkbmap -layout 'us,ru(winkeys)' -option 'grp:caps_toggle,grp_led:scroll' &
sleep 1;
DISPLAY=:25.0 xsetroot -solid rgb:12/34/56 &
Если с клавиатурой проблемы, можно переопределить нужные клавиши ещё добавкой команд типа
DISPLAY=:25.0 xmodmap -e "keycode 111 = 0xff52" &
Что было обнаружено:

  1. Как Xnest, так и Xephyr, запускаются на 0.0.0.0:ПОРТ, -query не помогает ни тому, ни другому. Заставить слушать на 127.0.0.1 не смог. Возможно, это какой-то баг.
  2. Наблюдаются патологические проблемы с клавиатурой как в Xnest, так и в Xephyr: стрелки на клавиатуре, а также клавиши PageUp/Down, Home/End почему-то оказались замапплены на что попало, поэтому все эти клавиши не работали, пришлось их все переопределять. Переопределение успешно спасло поведение терминала, частично помогло в старой версии TBB. В новых версиях TBB глюки остались. Стрелка влево, например, работает как alt+стрелка_влево и т.д., пользоваться очень тяжело. Возможно, дело в нестандартной клавиатуре, но под другой ОС всё работало без таких глюков с точно такой же клавиатурой.
  3. Xephyr по умолчанию очень тормозной, а Xnest намного шустрее. Xephyr как бы всё эмулирует от себя, а Xnest нет (что частично соответствует документации).
  4. Переключение раскладки не глючит ни в Xnest, ни в Xephyr, хотя они почему-то иногда оказываются друг другу противоположными (русский шрифт в Xnest/Xephyr соответствует латинице в основных иксах).
  5. При переключении в Xnest терминал и другие окна ничего не показывают, пока не щёлкнешь принудительно по заголовку некоторых окон — только тогда он отвисает. В Xephyr таких глюков нет.
  6. GTK-шрифты в меню по умолчанию в Xnest получаются значительно больше тех, что под обычными иксами, а в Xephyr — наоборот меньше.
  7. Я так и не заметил, чтобы на что-то влияла опция -ac, поэтому убрал её из команды.
  8. Часто Xnest/Xephyr не стартовали: иксы запускаются, а оконный менеджер в них — нет. Лечится добавкой пауз sleep между командами, но работает это всё равно от раза к разу. Если оконный менеджер не запустился, можно убить Xnest/Xephyr и выполнить скрипт ещё раз. Как правило, со 2-3 раза запускается практически всегда.

В общем, работает крайне глючно и неприятно, пользоваться тяжело. Может, под другой ОС (или другой версией иксов) было бы всё ОК.

P.S. Xnest тестировался скриптом типа
#!/bin/sh
Xnest :25 -geometry 1024x768 &
DISPLAY=:25.0
#xmodmap -e "keycode 111 = 0xff52" & [и др. команды, если требуется]
setxkbmap -layout 'us,ru(winkeys)' -option 'grp:caps_toggle,grp_led:scroll' &
xrdb $HOME/.Xresources &
ВашОконныйМенеджер &
— Гость (22/06/2013 02:45)   <#>
P.P.S. Кто-то может прокомментировать эти костыли? А то мне боязно это в основной документ вставлять. :-(
— Гость (31/01/2015 11:39)   <#>

В современных версиях xdm в этом нет необходимости, там указываются единые настройки для всех дисплеев, и по умолчанию конкретизации нет:
DisplayManager*chooser:         /usr/lib/X11/xdm/chooser
DisplayManager*startup:         /etc/X11/xdm/Xstartup
DisplayManager*session:         /etc/X11/xdm/Xsession
DisplayManager*setup:           /etc/X11/xdm/Xsetup
DisplayManager*reset:           /etc/X11/xdm/Xreset


По умолчанию там написано
:0 local /usr/bin/X :0 vt7 -nolisten tcp
Чтобы запустить ещё один xdm, достаточно добавить строчку
:1 local /usr/bin/X :0 vt8 -nolisten tcp
— всё, это достаточный минимум для автоматического запуска ещё одного xdm. Опция -nolisten важна, т.к. иначе он расшаривает иксы на весь интернет [1], [2] будет слушать с моря погоду на 0.0.0.0:600X (наверно, слушать по умолчанию на 127.0.0.1:600X было бы слишком безопасно для иксов, поэтому разработчики на это не пошли).


Следует признать, что это уже не так или даже всегда было не так. В конфиге xdm--nolisten tcp прописано по умолчанию, но ручного старта иксов это не касается. Припоминаю, что уже давно так. Когда-то запускал вручную, и меня нервировало, что вывод netstat -lpn показывает, как иксы слушают на портах. Конечно, есть файерволл, но всё равно ни к чему это.


Там всё хитрее. ☹ Запускаются они на другом дисплее только от рута. Можно запускать в т.ч. из screen/tmux. Можно запустить и на текущем дисплее через
# exec startx -- -nolisten tcp :1
(из screen'а под рутом он тоже работает). Однако, под юзером работает только последний вариант и только из обычного терминала (из screen не работает), иначе пишется ошибка
X: user not authorized to run the X server, aborting.
Вся надежда тут только на exec: если иксы падают, шелл разлогинивается. Не знаю, насколько такая процедура надёжна, может ли она сглючить так, что не разлогинится...

Тут вот unknown предлагал делать
$ startx -- :1 ; logout
Это безпаснее, чем писать
$ exec startx -- -nolisten tcp :1
или нет?

Непонятно, почему система не даёт прав юзеру запустить что-то на иных дисплеях. В BSD это работает так: система создаёт дисплей, но не запускает на нём getty. Если предварительно дисплей создан, то на нём по желанию далее можно запустить либо getty, и тогда там будет текстовый терминал с консолью, либо иксы. Когда юзер пытается, залогинившись в текстовый терминал, запустить иксы, система проверяет, есть ли свободные созданные дисплеи. Если есть, то иксы запускаются на самом младшем из незанятых дисплеев. По умолчанию при старте системы есть только один незанятый дисплей, и он традиционно занимается иксами или менеджером типа xdm, поэтому дополнительные требуется создавать вручную. В Debian, похоже, по умолчанию создаётся два дисплея (по крайней мере, ctrl+alt+F8 работает, и там ничего не запущено, хотя один дисплей уже занят иксами). Кто-нибудь может популярно растолковать, как это работает в Linux?
— Гость (31/01/2015 13:29)   <#>
не совсем в тему, а как в linux запустить приложение от другого пользователя?
— SATtva (31/01/2015 13:38)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
su -c [command] username
— Гость (31/01/2015 13:53)   <#>
Спасибо. Это пользователь с любыми правами?
— SATtva (31/01/2015 13:58)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Любой из группы wheel.
— Гость (31/01/2015 15:15)   <#>
Если что, то:
  • В Debian (и ряде других дистров) группы wheel по умолчанию нет.
  • Идея использовать su/sudo плохая.
  • Не надо запускать ничего от имени другого пользователя, это должно быть подвластно только руту, который может это корректно и относительно безопасно делать.
— Гость (31/01/2015 15:47)   <#>

А что тогда? Работать в профиле от текущего пользователя? А если я хочу запустить тот же ТВВ от другого пользователя?

Как быть с apt-get update&&upgrade ?
— Гость (31/01/2015 16:24)   <#>

Хорошее желание, запустите честно от другого пользователя, чтоб он с первым явно никак не был связан. Иначе уязвимость в одном из них будет троянить и другого. Вы же под «запустить от другого» понимаете не просто запуск от другого, а запуск от другого из-под текущего юзера, а это разные вещи.


Ctrl+Alt+F1, логинимся в текстовой консоли под рутом, выполняем.
— Гость (02/02/2015 16:26)   <#>
Ctrl+Alt+F1, логинимся в текстовой консоли под рутом, выполняем.


Alt-F2, запускаем xterm. 'su' вводим пароль от рута, выполняем.
Какая такая разница между xterm и консолькой на F1?
Или sudo "выполняем".
gksu – ещё знаете есть, зачем-то же её придумали.
— SATtva (02/02/2015 17:44)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Надо полагать, вторую ссылку из этого поста чуть выше Вы не смотрели?
— Гость (09/02/2015 05:10)   <#>

В общем, это объясняет, почему было:

С графикой что-то странное. xdm стартует прекрасно, но только на одном дисплее. Запустить два xdm'а не получается никак: если Xservers отредактировать, добавив ещё одну строку, не запускается ни один (хорошо, что хоть система при этом намертво не завешивается). Однако, если запускаем один xdm, он легко запускается на любом дисплее.

Тем не менее, несмотря на такие глюки, вручную через xinit с текстовой консоли дополнительные X-сервера на других дисплеях запускаются без проблем. Интересно, можно ли xdm так же принудительно запустить с консоли на других дисплеях? Как ни экспериментировал, не получилось. В старых ОС на точно таких же конфигах всё работает наура.

Как не трудно догадаться, в одном месте я «:0» исправил на «:1», а в другом нет. После пофикса
:1 local /usr/bin/X :1 vt8 -nolisten tcp
xdm успешно запускается на сколько хочешь дисплеях.

Обнаружено было так: трюк с
# exec startx -- -nolisten tcp :1
ранее работавший для одного юзера, вдруг не заработал для другого. Потом выяснилось, что он перестал работать в т.ч. и у того юзера, у которого работал раньше. Экспериментально было выяснено, что ни тип оконного менеджера в ~/.xsession, ни наличие exec не влияют на возможность запуска, однако, как только мы убираем опцию -nolisten tcp, так сразу всё запускается (ценой открытия потенциальной дыры). Я тут подумал, что, может быть, если её убрать в xdm, то и он пофиксится, и тут обнаружил ошибку. Так сказать, один баг перекрыл другой, и они аннигилировали, теперь все xdm'ы работают с nolisten и смысла извращаться с exec startx уже нет. Почему трюк с exec startx вдруг перестал работать, и nolisten повлияло на что-то — так и осталось непонятым. Кстати, в man Xserver про nolisten написано

disables a transport type. For example, TCP/IP connections can be disabled with -nolisten tcp. This option may be issued multiple times to disable listening to different transport types.

Полный список «transport types» не приведён. А что, иксы ещё могут слушать по UDP-порту? Или по какому-нибудь IPX?
На страницу: 1, 2 След.
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3