id: Гость   вход   регистрация
текущее время 13:26 28/03/2024
Владелец: unknown (создано 24/06/2012 20:52), редакция от 27/01/2013 06:29 (автор: spinore) Печать
Категории: софт, операционные системы
http://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 След.
Комментарии [скрыть комментарии/форму]
— Гость (24/06/2012 21:18)   <#>

unknown, xdm запускается достаточно штатно. Вместо костылей с logout стоило бы советовать более универсальный и надёжный вариант: detach в мультиплексерах терминалов tmux и screen.
— unknown (24/06/2012 22:17)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664
Запуск иксов из консоли нежелателен и добавленоставлен для совместимости с историческими настройками для тех, кому сильно нужно.

Раньше у меня SELinux не работал с иксами при старте иксов не из консоли, а теперь наоборот, не даёт их из консоли запускать. Это всё обходиться индивидуальным отключением или тонкими настройками иксового SELinux модуля, но это просто как пример причины для выбора, которая здесь не рассматривается.
— Гость (29/06/2012 12:52)   <#>
Я чего-то не понимаю или разные иксы в связи с https://www.pgpru.com/comment51610 мало что дают?
Ведь у xev(1) есть параметр -display, в котором можно задать нужный икс-сервер и читать все события из его окон. Не?
— unknown (29/06/2012 14:14, исправлен 29/06/2012 14:14)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664
Любая программа, запущенная под иксами, имеет возможность ловить все инвенты во всех окнах под этими иксами

Есть разные ситуации. Приложение запущенное под другим пользователем, но изначально под этими же иксами (или даже другие иксы из под этих со сменой пользователя) или разные X-сессии, запущенные с разных консолей под разными пользователями.


В последнем случае дефолтный механизм аутентификации в иксах не должен быть нарушен (если какими-то настройками не сделали иначе, например дали доступ всем пользователям с локалхоста или вообще расшарили по сети). Иначе это баг в них, а не штатная фича.

— Гость (29/06/2012 14:34)   <#>
Т.е. если есть два X-сервера, запущенных под разными пользователя (первый :0, второй :1), то scrot -display :1 от первого пользователя не будет работать?
— Гость (29/06/2012 14:47)   <#>
Естественно. Штатно это даже от root'а вроде не должно работать. Если один пользователь аутентифицирован в одних иксах, а другой в других, то один никак не может взаимодействовать с другими (иначе это был бы серьёзный баг уровня local root). В /comment51610 речь шла об разных пользователях под одними и теми же иксами.
— Гость (08/07/2012 09:09)   <#>
Использование gksu оставляет опасность доступа уязвимого приложения к X-серверу (возможность делать снимки экрана, cчитывать нажатия всех клавиш (штатный кейлоггер xev), копирование данных из буфера обмена будет общим для всех пользователей).
To be fixed :)
— spinore (08/07/2012 16:53)   профиль/связь   <#>
комментариев: 1515   документов: 44   редакций: 5786
unknown, я извиняюсь, что испахабил этот ваш прекрасный топик. Пожалуйста, проверьте, не упущено ли там чего важного, из того что там было изначально.

  1. Я замёл мусор под ковёр в плане того, что решения для блокирования всех экранов одновременно у нас пока нет (см /comment45274), и вряд ли будет в ближайшем будущем. Т.е. я мог бы додумать, сделать и написать мануал, но у меня в списке для собственных целей пока такая задача не стоит (на ближайшее будущее).
  2. Хотелось бы вставить вариант с Xephyr, но у меня не скоро дойдут до него руки (да и дойдут ли вообще — не факт). При этом Xnest, говорят, уже давно obsolete и его якобы с иксов выкинули.
  3. Ещё есть вполне перспективный вариант с VNC, на который я определённо планирую посмотреть более внимательно, но это тоже не очень скоро будет.
  4. В классификации «методов» мог напартачить, но это то, как я понимаю устройство иксов в Unix. Если что, поправьте.

Гости из соседних тредов, которые всё знают лучше меня и освоили матчасть, любезно приглашаются показать своё знание по делу. Если у кого есть готовый краткий мануал-схема с VNC и Xephyr, кладите в комментарии, и я добавлю его в текст.

Если замечаний нет, предлагаю перенести топик из черновиков в основное логово документов сайта.
— unknown (08/07/2012 22:39, исправлен 08/07/2012 22:50)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664

Спасибо за структурирование документа.


Сейчас поправлю опечатку в заголовке


Это относится ко всем методам параллельных запусков иксов, не только {g,d,x}m, т.е. и вручную тоже. Наблюдал такое в офиц. драйверах NVidia, кто-то из пользователей тоже это отмечал. Проблема со скринсейверами также должна относиться к абзацу обо всех методах запуска параллельных иксов.


Эти методы я потихоньку согласую с SELinux, поэтому выбираю зачастую не лучшие решения, а те, которые с ним меньше глючат и имеют готовые и наиболее работоспособные SELinux-модули. Кое-что работает, но глючит всё равно сильно. Поэтому рекомендовать и обосновывать свои предпочтения пока не могу. Всё это делается не столько ради реальной безопасности, сколько на перспективу, что с каждой новой версией SELinux он таки работает лучше. Когда-то он вообще с иксами не работал.


Поскольку вы не связаны такими экспериментами, то ваши изыскания только в плюс.


Кстати, Xephyr образует некий контейнер-песочницу с SELinux, причём запущенные в нём программы могут на выбор не иметь доступ в сеть, иметь доступ и сохранять все изменения только в оперативной памяти (с мгновенным исчезновением изменений после завершения сеанса), работать с единственной директорией для сохранения скачанных файлов. Поскольку в стабильной версии Debian этой фичи нет и неизвестно как она будет работать в новой версии, ничего о практическом использовании сказать не могу, но на перспективу следует запомнить.

— spinore (08/07/2012 22:50, исправлен 08/07/2012 23:01)   профиль/связь   <#>
комментариев: 1515   документов: 44   редакций: 5786

Честно сказать, для меня это открытие — никогда с таким не сталкивался. Разве не ОС решает, что там и как с дисплеями? Если иксы глючат или не запускаются, то они везде так, а вот чтобы всё работало, но не давало запустить параллельные иксы, не встречал ни разу.



Ну перенесите в более подходящее место тогда, а я подправлю текст потом, если что.


> Кое-что работает, но глючит всё равно сильно. Поэтому рекомендовать и обосновывать свои предпочтения пока не могу.
Думаю, то как сейчас написано, не критично к обоснованию. Типа, «есть более простой метод, делается на лету, но не такой безопасный; а есть сложный метод, более надёжный, но требующий и больших телодвижений».


Меня Xephyr/VNC стратегически больше волнуют из-за Xen. Там вопрос не только удобства, он там концептуальный: X-сервер есть только у dom0, поэтому все domU, чтобы работать с графикой, как-то должны использовать X-сервер, запущенный на dom0. В мануалах на этот счёт рекомендуют именно VNC.


P.S.: Если что, я сразу извиняюсь за разметку. Мне хотелось, чтобы оно выглядело так, как оно выглядит сейчас, но движок глючит, не хочет так делать, потому приходится его принуждать специальными методами. В итоге, wiki-сорс превращается в write only ;)

— SATtva (10/07/2012 11:47)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Раздел документов "Продвинутое использование Tor в Unix/Linux" перенесён в основной раздел /Библиотека/Руководства.
— Гость (25/01/2013 20:28)   <#>
{g,d,x}m


kdm?


kdm 4:4.9.4-0ubuntu0.2 amd64 KDE Display Manager for X11

default config
/etc/kde4/kdm/kdmrc
+
— Гость (27/01/2013 06:36)   <#>
{g,d,x}m
kdm?

OK. Добавлено.
— unknown (27/01/2013 19:24, исправлен 27/01/2013 19:25)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664

А можно ли по-простому запустить более 6 иксов одновременно-параллельно (без X-nest и всякой псевдовиртуализации)? Не занимая сочетаний [Ctrl + Alt + F2] … [Ctrl + Alt + F6]?

— Гость (27/01/2013 19:38)   <#>
# cat /etc/lightdm/lightdm.conf
[LightDM]
seats=Seat:0 Seat:1 Seat:2

[Seat:0]
vt=7

[Seat:1]
vt=8

[Seat:2]
vt=9
На страницу: 1, 2 След.
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3