Xpra: различия между версиями

Материал из ALT Linux Wiki
Строка 194: Строка 194:
|
|
|}
|}


=== Строка подключения ===
=== Строка подключения ===
Строка 232: Строка 231:
   wss://[USERNAME[:PASSWORD]@]HOST:PORT/[DISPLAY]
   wss://[USERNAME[:PASSWORD]@]HOST:PORT/[DISPLAY]


=== Дисплей ===
При запуске xpra сервера ({{cmd|xpra start}}) можно не использовать номер дисплея, в этом случае он будет выбран автоматически. Номер дисплея будет указан в выводе команды, также его можно увидеть, выполнив команду {{cmd|xpra list}}.
В противном случае, при запуске сервера xpra может потребоваться указать номер дисплея. Для этого можно выбрать любое число и поставьте перед ним двоеточие (например, :7, :12 и :3117). Необходимо учитывать, что:
* каждый X или xpra сервер, работающие на одном хосте должны использовать уникальный номер дисплея;
* первые несколько цифр (0, 1, 2) обычно используются реальными X серверами.
При указании сервера xpra в клиентской программе ({{cmd|xpra attach}}, {{cmd|xpra detach}}, {{cmd|xpra stop}}, {{cmd|xpra exit}}, {{cmd|xpra version}}, {{cmd|xpra info}}, {{cmd|xpra list}}, {{cmd|xpra screenshot}}) можно использовать указание дисплея в формате :DISPLAY при подключении к локальному узлу или одну из форм ssh://[USER@]HOST/DISPLAY при подключении к удалённому узлу. Если на узле запущен только один сеанс xpra, то номер дисплея можно не указывать.
Если при запуске сервера был указан параметр --bind-tcp, --bind-ssl  --bind-udp=[HOST]:PORT,  --bind-ws,  --bind-wss  или --bind-vsock, то к нему можно подключаться используя следующие строки: tcp://HOST:PORT[/DISPLAY], udp://HOST:PORT[/DISPLAY],  ssl://HOST:PORT[/DISPLAY],  ws://HOST:PORT[/DISPLAY],        wss://HOST:PORT[/DISPLAY] или vsock://HOST:PORT[/DISPLAY].
=== Сеть и аутентификация ===
Xpra поддерживает разные типы сетевых подключений (tcp, ssl, ws, wss, vnc, ssh, vsock, quic и т. д.), и большинство из них можно шифровать и мультиплексировать через один порт.
Безопасность зависит от типа подключения клиента xpra (ssl, quic и ssh считаются самыми безопасными, поскольку они обеспечивают проверку хоста и шифрование в одном протоколе).
Доступ к сеансам Xpra через сокеты TCP можно защитить с помощью модулей аутентификации, но так как они не защищают само сетевое соединение от атак «человек посередине», то для защиты от таких атак можно использовать один из трёх вариантов:
*шифрование AES
*SSL
*SSH
==== Модули аутентификации ====
{{Note| При использовании для подключения к серверу SSH разделы шифрование и аутентификация можно пропустить (по умолчанию сокеты, используемые ssh, не используют аутентификацию).}}
{| class="wikitable"
|+Модули аутентификации
! | Модуль
! Описание
! Примечание
|-
|allow
|Аутентификация всегда успешна (используется имя пользователя, предоставленное клиентом)
|Не безопасно и должно использоваться только для тестирования
|-
|none
|Аутентификация всегда успешна (используется имя пользователя, под которым работает сервер)
|Не безопасно и должно использоваться только для тестирования
|-
|fail
|Аутентификация всегда не успешна (пароль не запрашивается)
|Полезно для тестирования
|-
|reject
|Аутентификация всегда не успешна (пароль запрашивается)
|Полезно для тестирования
|-
|env
|Пароль сопоставляется с указанной переменной среды (по умолчанию XPRA_PASSWORD)
|''--auth=env:name=SOME_OTHER_ENV_VAR_NAME''
|-
|password
|Пароль сопоставляется с паролем, указанным с помощью опции value
|''--auth=password:value=mysecret''
|-
|file
|Сравнивает пароль с паролем, записанным в файле, указанным с помощью опции filename
|''--auth=file:filename=./password.txt''
Содержимое файла пароля будет рассматриваться как двоичные данные, ограничений на кодировку символов или размер файла нет. Следует остерегаться завершающих символов новой строки, которые будут включены в данные пароля (пример создания файла с паролем: {{cmd|echo -n "mypassword" > password.txt}})
|-
|multifile
|Сопоставляет имя пользователя и пароль с содержимым файла аутентификации, указанным с помощью опции filename
|Файл аутентификации должен содержать учетные данные пользователей в формате:
username|password|uid|gid|displays|env_opts|session_opts
Имя пользователя и пароль не должны содержать символ вертикальной черты (|), который используется в качестве разделителя. Этот модуль устарел, вместо него следует использовать sqlite
|-
|pam
|Проверяет имя пользователя и пароль с помощью системы PAM
|Аутентификация ОС Linux
|-
|win32
|Проверяет имя пользователя и пароль с помощью win32security
|Аутентификация MS Windows
|-
|sys
|Системная аутентификация
|Автоматически выбирает соответствующий системный модуль аутентификации (либо pam, либо win32)
|-
|sqlite, mysql, sql
|Сверяет имя пользователя и пароль с файлом базы данных sqlite, указанным с помощью параметра filename (sqlite), или с базой данных, указанной с помощью параметра uri (mysql и sql)
|Аутентификация будет обработана с использованием следующего запроса (настраивается с помощью параметра password_query): SELECT password FROM users WHERE username=(?)
Сеансы, доступные для каждого пользователя, будут запрашиваться с помощью запроса (настраивается с помощью параметра session_query):  SELECT uid, gid, displays, env_options, session_options FROM users WHERE username=(?)
|-
|exec
|Делегирует процедуру аутентификации внешней команде. Команда указывается с помощью атрибута command
|Команда должна вернуть 0, чтобы разрешить доступ, любое другое значение будет запрещать доступ
|-
|peercred
|Аутентификация SO_PEERCRED
|
|-
|hosts
|Проверяет хост с помощью системной библиотеки tcp-wrappers
|Подробнее см. в hosts.allow и hosts.deny
|-
|kerberos-password
|Проверяет имя пользователя и пароль с помощью проверки подлинности Kerberos
|Модуль не использует билеты Kerberos, и пароль будет отправлен на сервер в виде открытого текста. Следует использовать только для тестирования
|-
|kerberos-ticket
|Проверяет билет Kerberos, полученный клиентом
|
|-
|gss
|Проверяет билет GSS, полученный клиентом
|
|-
|u2f
|Запрашивает у клиента токен U2F
|
|-
|ldap
|Проверяет имя пользователя и пароль на сервере LDAP, используя библиотеку python-ldap
|
|-
|ldap3
|Проверяет имя пользователя и пароль на сервере LDAP, используя библиотеку python-ldap3
|
|}
Предпочтительный способ указания аутентификации — в опции сокета.
Примеры:
<syntaxhighlight lang="bash">
$ XPRA_PASSWORD=mysecret
$ xpra start --start=xterm --bind-tcp=0.0.0.0:10000,auth=env
$ SOME_OTHER_ENV_VAR_NAME=mysecret
$ xpra start --bind-tcp=0.0.0.0:10000,auth=env:name=SOME_OTHER_ENV_VAR_NAME
$ xpra start --bind-tcp=0.0.0.0:10000,auth=password:value=mysecret
$ xpra start --bind-tcp=0.0.0.0:10000,auth=file:filename=/path/to/mypasswordfile.txt
$ xpra start --bind-tcp=0.0.0.0:10000,auth=sqlite:filename=/path/to/userlist.sdb</syntaxhighlight>
Разные сокеты могут использовать разные модули аутентификации:
<syntaxhighlight lang="text">
$ xpra start --start=xterm -d auth \
--bind-tcp=0.0.0.0:10000,auth=hosts,auth=file:filename=password.txt --bind \
--bind-tcp=0.0.0.0:10001,auth=sys</syntaxhighlight>
Имя пользователя можно указать:
*в файлах подключения;
*в строке подключения клиента.
Пример подключения по TCP:
<syntaxhighlight lang="text">$ xpra attach tcp://username:password@host:port/</syntaxhighlight>
Когда модуль аутентификации используется для защиты одного сеанса, многие модули полностью игнорируют имя пользователя, и его можно опустить, например:
<syntaxhighlight lang="text">$ xpra attach tcp://:password@host:port/</syntaxhighlight>
Модули kerberos-password, ldap, ldap3, sys (pam и win32), sqlite, multifile и u2f используют для аутентификации, как имя пользователя, так и пароль.
Процесс аутентификации:
*если на сервере не настроена аутентификация, клиентское соединение должно быть принято;
*если у клиента не настроена аутентификация, может появиться диалоговое окно запроса пароля, и соединение завершится ошибкой аутентификации, если правильное значение не будет указано;
* если указано несколько модулей аутентификации, клиент может вызвать несколько диалогов аутентификации;
* то, как клиент обрабатывает вызовы, отправленные сервером, можно настроить с помощью параметра challenge-handlers, порядок по умолчанию: uri (независимо от того, какой пароль может быть указан в строке подключения), файл (если использовалась опция password-file), env (если присутствует переменная окружения), kerberos, gss, keycloak, u2f, prompt.
Примечания специфичные для конкретных модулей и платформ (эта информация относится ко всем клиентам, кроме клиента HTML5):
* каждый модуль аутентификации указывает тип хеширования пароля, который он поддерживает (обычно HMAC);
* некоторые модули аутентификации (pam, win32, kerberos-password, ldap и ldap3) требуют отправки пароля для выполнения аутентификации на сервер — поэтому они используют слабое хеширование xor, которое небезопасно;
* необходимо использовать шифрование, чтобы иметь возможность использовать xor-хеширование, чтобы пароль был защищен во время обмена: система откажется отправлять xor-хешированный пароль в незашифрованном виде;
* шифрование обрабатывается перед аутентификацией;
* при использовании сокетов TCP, аутентификация по паролю уязвима для атак «человек посередине», когда злоумышленник может перехватить первоначальный обмен и использовать украденный ответ на запрос аутентификации для доступа к сеансу. Для предупреждения этой атаки следует использовать шифрование;
* клиент не проверяет подлинность сервера, использование шифрования позволяет это исправить;
* включение в журнал информации об аутентификации (-d auth) может привести к утечке некоторой аутентификационной информации;
* обеспечить безопасное соединение может транспорт SSH.
==== SSH ====
===== OpenSSH =====
К серверам, на которых запущен SSH-сервер, доступ к сеансам xpra возможен без какой-либо дополнительной настройки, например:
<syntaxhighlight lang="bash">$ xpra attach ssh://USERNAME@HOST/DISPLAY</syntaxhighlight>
Аналогично можно запускать новые сессии и подключаться к ним одной командой:
<syntaxhighlight lang="bash">$ xpra start ssh://USERNAME@HOST/ --start=xterm</syntaxhighlight>
===== Встроенный SSH-сервер =====
Этот режим можно использовать для создания SSH-соединений на серверах, на которых  нет запущенного SSH-сервера (например, на серверах MS Windows), или для получения возможности использования SSH-аутентификации и шифрования, но без разрешения входа в систему по SSH в серверную систему (поскольку данное соединение можно использовать только для подключения к серверу xpra).
Этот режим можно использовать с сокетами TCP, которые в конечном итоге будут обновлены до SSH. Сервер также поддерживает опцию bind-ssh (такие сокеты разрешают только соединения SSH):
<syntaxhighlight lang="bash">$ xpra start --bind-ssh=0.0.0.0:10000 --start=xterm</syntaxhighlight>
Подключение клиента к этому порту используя ssh:
<syntaxhighlight lang="bash">$ xpra attach ssh://server:10000/</syntaxhighlight>
Закрытый ключ сервера SSH (ssh_host_<rsa/dsa/ecdsa/ed25519>_key) должен быть доступен пользователю, работающему с сервером xpra. По умолчанию при запуске сервер попытается открыть файлы ключей, находящиеся в {{path|~/.ssh/}}.
===== Клиент SSH =====
Клиент может использовать как встроенный клиент ssh (на основе paramiko), так и системный инструмент.
Для настройки клиента ssh используется параметр ssh. По умолчанию установлено значение auto, при котором будет использоваться paramiko, если он присутствует, или системный инструмент, если его нет. На большинстве платформ внешним инструментом по умолчанию является команда ssh (механизм основан на openssh), а в MS Windows это putty plink.
Пример использования системного ssh-клиента:
<syntaxhighlight lang="bash">$ xpra start --ssh=ssh ssh://user@server --start=xterm</syntaxhighlight>
Если дописать в файл {{path|~/.xpra/xpra.conf}} строку ''ssh = ssh'', то клиент можно не указывать:
<syntaxhighlight lang="bash">$ xpra start ssh://user@server --start=xterm</syntaxhighlight>
Бэкенд paramiko встроен в код подключения клиента и обеспечивает лучшую диагностику (''-d ssh''), а также предоставляет графический интерфейс для подтверждения ключей хоста, ввода ключевых фраз-паролей или паролей.
Paramiko может принимать параметры конфигурации в командной строке:
* auth — позволяет указать используемые методы аутентификации в том порядке, в котором они будут использоваться. Доступные значения: agent, key, password, none;
* stricthostkeychecking — указывает, что ssh не должен автоматически добавлять ключи хоста в файл {{path|~/.ssh/known_hosts}} и отказывается подключаться к хостам, чей ключ хоста изменился. Доступные значения: yes (по умолчанию), no.
Можно указать несколько параметров в виде строки, разделенной запятыми, например: ''--ssh=paramiko:auth=agent+key,stricthostkeychecking=no'':
<syntaxhighlight lang="bash">$ xpra start --ssh=paramiko:auth=agent+key ssh/user@192.168.0.99:22 -d ssh --start=xterm</syntaxhighlight>
Пароль можно указать в URI командной строки:
<syntaxhighlight lang="bash">$ xpra attach ssh://USERNAME:PASSWORD@HOSTNAME/</syntaxhighlight>
==== Шифрование AES ====
Шифрование AES следует использовать, если есть возможность безопасно передать ключ AES каждому клиенту.
Уровень шифрования AES Xpra использует криптографическую библиотеку python для шифрования сетевых пакетов с помощью AES-256.
Ключ шифрования можно сохранить в файле или указать с помощью параметра keydata. Если не указано ни того, ни другого и используется модуль аутентификации, в качестве данных ключа будет использоваться пароль.
Пример использования шифрования с ключом, сохранённым в файле:
# Сгененрировать ключ:
#: <syntaxhighlight lang="bash">$ uuidgen > ./key.txt</syntaxhighlight>
# Передать ключ на клиентский узел
# Запустить сервер:
#:<syntaxhighlight lang="bash">$ xpra start --start=xterm --bind-tcp=0.0.0.0:10000,encryption=AES,encryption-keyfile=/home/user/key.txt -d crypto</syntaxhighlight>
# Подключение на клиенте (содержимое файла key.txt должно быть одинаковым на клиенте и сервере):
#:<syntaxhighlight lang="bash">$ xpra attach "tcp://server:10000/?encryption=AES&encryption-keyfile=key.txt"</syntaxhighlight>
Начиная с {{pkg|xpra}} версии 4.3, клиент может указать точный режим шифрования AES, например, encryption=AES-GCM.
Пример запуска сервера, когда порт 10000 использует шифрование, а порт 10001 — нет:
<syntaxhighlight lang="bash">$ xpra start --start=xterm --bind-tcp=0.0.0.0:10000,encryption=AES,encryption-keyfile=./key.txt --bind-tcp=0.0.0.0:10001 -d crypto</syntaxhighlight>
В новых версиях вместо использования параметра encryption-keyfile (keyfile), для указания ключа шифрования можно использовать параметр keydata:
* keydata=0x... — для шестнадцатеричных ключей;
* keydata=base64:... — для ключей в кодировке base64;
* keydata=... — для простых текстовых ключей.
Недостатком такого способа является то, что ключевые данные могут попасть в список процессов. Однако в некоторых случаях может быть проще создать команды, для запуска которых не требуются дополнительные файлы.
Пример с простым текстовым ключом в keydata:
<syntaxhighlight lang="bash">$ xpra start --start=xterm --bind-tcp=0.0.0.0:10000,encryption=AES,keydata=0123456789ABCDEF -d crypto
$ xpra attach "tcp://server:10000/?encryption=AES&keydata=0123456789ABCDEF"</syntaxhighlight>
====SSL ====
Запустить сервер с поддержкой TCP и SSL, используя существующий сертификат cert.pem (сертификат должен быть предварительно создан):
<syntaxhighlight lang="bash">$ xpra start --start=xterm --bind-tcp=0.0.0.0:10000 --ssl-cert=/path/to/ssl-cert.pem</syntaxhighlight>
Подключение:
<syntaxhighlight lang="bash">$ xpra attach ssl://server:10000/</syntaxhighlight>
Чтобы избежать ошибки, когда сервер использует самоподписанный сертификат можно использовать один из вариантов:
* добавить параметр --ssl-server-verify-mode=none в строку подключения клиента:
*:<syntaxhighlight lang="bash">$ xpra attach ssl://server:10000/ --ssl-server-verify-mode=none</syntaxhighlight>
* скопировать ключ клиенту, и использовать параметр ssl-ca-certs, чтобы указать ключ для проверки:
*:<syntaxhighlight lang="bash">$ xpra attach ssl://server:10000/ --ssl-ca-certs=cert.pem</syntaxhighlight>
Генерация самоподписанного сертификата:
<syntaxhighlight lang="bash">$ openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem -sha256
$ cat key.pem cert.pem > ssl-cert.pem</syntaxhighlight>
После настройки сервера для SSL (обычно путем добавления параметра --ssl-cert) его сокеты TCP (параметр bind-tcp) могут быть автоматически обновлены до:
* ssl;
* http и ws (веб-сокеты) можно обновить до https и wss (защищенные веб-сокеты).
Это позволяет использовать один порт с несколькими протоколами (включая также SSH), которые могут легче проходить через некоторые брандмауэры и могут требоваться некоторыми сетевыми политиками. Клиентские сертификаты также могут использоваться для аутентификации.


== TCP-сокеты ==
== TCP-сокеты ==

Версия от 10:54, 12 мая 2023

Описание

Xpra — это инструмент, который запускает программы X11, обычно на удаленном хосте, и направляет их отображение на локальный компьютер без потери состояния (позволяет отключение и повторное подключение без прерывания перенаправленного приложения).

Xpra может предоставить удаленный доступ как к отдельным приложениям, так и к новым/существующим сеансам рабочего стола.

Xpra не имеет root-доступа: т.е. приложения, перенаправленные xpra, отображаются на локальном рабочем столе как обычные окна, управляемые локальным оконным менеджером. Xpra также использует собственный протокол, который самонастраивается и относительно нечувствителен к задержкам.

На сервере утилита Xpra запускает в режиме де­мона нужную программу с заданным идентификатором сеанса, а на клиенте происходит присоединение к сеансу с этим идентификатором.

Доступ к сеансам можно получить по SSH или через защищённые паролем сокеты TCP (с SSL или без).

Установка

Установить пакет xpra на сервере и на клиенте:

# apt-get install xpra

Можно использовать клиент html5, и в этом случае на клиенте ничего устанавливать не нужно. А на сервере, начиная с xpra версии 4.4.4, необходимо дополнительно установить пакет xpra-html5:

# apt-get install xpra-html5

Режимы работы

Запуск приложения

Запуск приложения или бесшовный режим (seamless) — позволяет пересылать клиенту отдельные окна приложений, эти окна появляются на рабочем столе клиента так же, как и другие локальные приложения.

Все операции по управлению окнами выполняются непосредственно клиентской ОС или оконным менеджером, поэтому любые задержки между клиентом и сервером не мешают действиям по управлению окнами (сворачивание, перемещение, изменение размера окна).

Бесшовный режим xpra

Примечание: Этот режим недоступен в MS Windows и MacOS.


Пример запуска приложения xterm удалённо, через SSH, без предварительного запуска xpra на сервере:

$ xpra start ssh://user@192.168.0.101 --start="xterm"
Примечание: И xpra и запускаемое приложение должны быть установлены на сервере.


Вместо параметра --start=команда, можно использовать параметр --start-child=команда, позволяющий учитывать параметр --exit-with-children. Если параметр --exit-with-children=yes, то сервер xpra будет отслеживать состояние дочерних элементов, запущенных --start-child, и автоматически завершится, когда последний из них завершит работу.

Запуск приложения, с предварительным запуском сервера xpra:

  1. На сервере: запустить экземпляр сервера xpra, автоматически выбрать дисплей и запустить программу (например, xterm) на этом виртуальном дисплее:
    $ xpra start --start=kolourpaint
    Entering daemon mode; any further errors will be reported to:
      '/run/user/500/xpra/1/server.log'
    
  2. С клиента подключиться к этому экземпляру сервера:
    $ xpra attach ssh://user@192.168.0.101/1
    

Локальное подключение:

  1. Запустить экземпляр сервера xpra на дисплее 101 (или автоматически выбрать дисплей) и запустить программу (например, kolourpaint) на этом виртуальном дисплее:
    $ xpra start :101 —start=kolourpaint
    Entering daemon mode; any further errors will be reported to:
      '/run/user/500/xpra/101/server.log'
    
  2. Подключиться к этому экземпляру сервера
    $ xpra attach :101
    

Подключение с использованием сокетов TCP:

  1. Запустить экземпляр сервера xpra:
    $ xpra start --start=xterm --bind-tcp=0.0.0.0:10000
    Entering daemon mode; any further errors will be reported to:
      '/run/user/500/xpra/S9454/server.log'
    Actual display used: :1
    Actual log file name is now: '/run/user/500/xpra/1/server.log'
    
  2. Подключиться к серверу, используя выбранный порт:
    $ xpra attach tcp://192.168.0.109:10000
    
Внимание! Использование параметра --bind-tcp без использования параметра tcp-auth не рекомендуется и представляет серьезную угрозу безопасности (особенно при 0.0.0.0), т.к. кто угодно может подключиться к этому порту и получить доступ к сеансу. Доступ к сеансам Xpra в режиме TCP и websocket можно защитить, используя аутентификацию и шифрование.


Вместо ввода команды подключения, можно создать файл сеанса. В файл сеанса (.xpra) можно записать все параметры сеанса, включая параметры подключения, например (содержимое файла example.xpra):

mode=ssh
host=192.168.0.101
username=user
password=newpassword
speaker=off
autoconnect=true

Двойной щелчок по файлу сеанса запустит средство запуска (launcher), а если файл сеанса содержит значение autoconnect=true, то соединение будет установлено без предварительного отображения диалогового окна средства запуска. Клиент html5 также может генерировать файлы сеанса из своей формы подключения.

Запуск новой графической сессии

Режим рабочего стола (desktop) позволяет запустить вложенный сервер X11.

Запуск приложения в режиме рабочего стола:

$ xpra start-desktop --start=xterm

Та же команда, но с запуском сеанса и подключением к нему со стороны клиента:

$ xpra start-desktop --start=xterm ssh://user@192.168.0.101/

Xpra. Режим рабочего стола

Чтобы запустить оконный менеджер (WM) или среду рабочего стола (DE) достаточно в примере выше заменить команду xterm командой, которая запускает WM или DE, например:

$ xpra start-desktop --start=fluxbox
$ xpra start-desktop --start=xfce4-session
$ xpra start-desktop :101 --start-child=startkde5  --exit-with-children
$ xpra start-desktop ssh://user@192.168.0.99  --exit-with-children --start-child=mate-session

Подключение:

$ xpra attach ssh://user@192.168.0.154:101 --min-size=1200x800 --clipboard-direction=both --clipboard=yes --opengl=no
Примечание: Чтобы сеанс завершался при выходе из WM, следует использовать --start-child и --exit-with-children

.

Получение управления запущенной графической сессией (shadow режим)

Этот режим позволяет использовать xpra для удаленного доступа к существующему сеансу рабочего стола (обычно подключенному к реальному физическому дисплею).

Shadow режим поддерживается на всех платформах, включая MS Windows и Mac OS X, но не на Wayland. В некоторых случаях, использование этого режима, может вызвать высокую нагрузку на процессор как на сервере, так и на клиенте. На большинстве платформ затеняемый дисплей должен быть активен: не заблокирован и не выключен.

Если к машине, к дисплею X11 которой необходимо получить удалённый доступ, есть SSH-доступ, можно на клиенте запустить команду:

$ xpra shadow ssh://user@HOST/

В результате выполнения этой команды будет произведено подключение по SSH к HOST, запущен теневой сервер xpra и произведено подключение к нему. Теневой сервер будет остановлен после отключения.

При этом на сервере в трее появится значок («Exit» — остановить сервер, «Read Only» — запретить управление, только просмотр рабочего стола):

Xpra. Управление режимом shadow

Если запуск через SSH не поддерживается или нужно запустить теневой сервер вручную и, возможно, настроить дополнительные параметры, можно запустить его из оболочки. Пример запуска управления запущенной графической сессией через TCP-сокеты:

$xpra shadow :0 --bind-tcp=0.0.0.0:9876


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

Некоторые команды xpra

Команда Описание Пример
xpra start Запустить новый сервер xpra (при запуске удалённого сервера со строкой подключения ssh://HOST/DISPLAY новый сеанс также будет присоединен)
$ xpra start :7
$ xpra start --start=gimp
xpra start-desktop Запустить вложенный сервер X11, все дочерние команды будут запускаться на вложенном сервере X11
$ xpra start-desktop --start=xfce4-session
xpra attach Подключиться к работающему серверу xpra. Любые приложения, использующие этот сервер, будут перенаправляться на текущий экран
$ xpra attach :7
$ xpra attach ssh://user@test/7
xpra detach Отсоединить данный дисплей xpra
$ xpra detach :7
xpra screenshot Сделать снимок экрана и сохранить его в файле с указанным именем (снимки экрана можно делать только при подключенном клиенте)
$ xpra screenshot my.jpg
xpra version Вывести версию сервера
$ xpra version
4.4.4-r0
xpra info Вывести версию, статус и статистику сервера
xpra top Отобразить ключевые атрибуты работоспособности сервера
xpra control Изменить параметры запущенного сервера. Список команд можно получить, указав «help» в качестве команды (например, xpra control :1 help)
$ xpra control :1 min-quality 20
xpra stop Подключиться к работающему серверу xpra и запросить его немедленное завершение. Обычно это приводит к тому, что любые приложения, использующие этот сервер, также прекращают работу
xpra exit Подключиться к работающему серверу xpra и запросить его немедленное завершение. В отличие от команды xpra stop, процесс Xvfb и его клиенты X11 (если таковые имеются) останутся запущенными.
xpra showconfig Вывести конфигурацию xpra. В качестве дополнительных аргументов можно указать определенные параметры, или использовать специальное значение all, чтобы отобразить все параметры
$ xpra showconfig clipboard-direction
clipboard-direction            = 'both'
xpra list Вывести список всех серверов xpra, запущенные текущим пользователем на текущей машине
xpra shadow Предоставить доступ к рабочему столу (существующему дисплею X11). Если активен только один дисплей X11 и его номер меньше 10, он может быть обнаружен автоматически. Для этого режима работы настоятельно рекомендуется использовать видеокодек (h264 или vp8)
xpra proxy Позволяет одному серверу проксировать соединения для нескольких других, потенциально выступая в качестве точки входа для балансировки нагрузки или аутентификации для многих сеансов. Прокси-сервер будет создавать новый процесс для каждого прокси-соединения, этот прокси-процесс создаст неаутентифицированный новый сокет домена unix, который можно использовать с подкомандами info, version и stop.

Строка подключения

Локальный дисплей (только для локальных дисплеев локального пользователя):

:DISPLAY

Подключение с использованием SSH:

ssh://[USERNAME[:PASSWORD]@]HOST[:SSH_PORT]/[DISPLAY][?QUERYSTRING]

QUERYSTRING можно использовать для указания прокси-сервера ssh: ?proxy=ssh://[ИМЯ ПОЛЬЗОВАТЕЛЯ[:ПАРОЛЬ]@]HOST[:SSH_PORT] В этом случае xpra установит SSH-соединение с указанным «прокси-сервером» и с этого хоста xpra установит SSH-соединение с сервером xpra.

Для обратной совместимости режим SSH также поддерживает синтаксис:

ssh:[USERNAME[ PASSWORD]@HOST:DISPLAY

Пароль необходимо указывать только тогда, когда он требуется модулю аутентификации сервера.

Примечание: При подключении по ssh может потребоваться указать системный ssh-клиент:
$ xpra start --ssh=ssh ssh://user@192.168.0.101 --start=scratch-desktop

Или дописать в файл ~/.xpra/xpra.conf строку:

ssh = ssh


В режиме TCP используются номера портов, а не номера дисплеев. Если через один TCP-порт доступно несколько дисплеев(например, при использовании прокси-сервера), то можно также указать номер дисплея:

tcp://[USERNAME@]HOST:PORT[/DISPLAY]

Режим SSL (добавляет безопасный уровень сокетов поверх режима TCP):

ssl://[USERNAME@]HOST:PORT[/DISPLAY]

Подключиться по протоколу websocket:

ws://[USERNAME[:PASSWORD]@]HOST:PORT/[DISPLAY]

Подключиться по защищённому протоколу websocket (websocket с SSL):

 wss://[USERNAME[:PASSWORD]@]HOST:PORT/[DISPLAY]

Дисплей

При запуске xpra сервера (xpra start) можно не использовать номер дисплея, в этом случае он будет выбран автоматически. Номер дисплея будет указан в выводе команды, также его можно увидеть, выполнив команду xpra list.

В противном случае, при запуске сервера xpra может потребоваться указать номер дисплея. Для этого можно выбрать любое число и поставьте перед ним двоеточие (например, :7, :12 и :3117). Необходимо учитывать, что:

  • каждый X или xpra сервер, работающие на одном хосте должны использовать уникальный номер дисплея;
  • первые несколько цифр (0, 1, 2) обычно используются реальными X серверами.

При указании сервера xpra в клиентской программе (xpra attach, xpra detach, xpra stop, xpra exit, xpra version, xpra info, xpra list, xpra screenshot) можно использовать указание дисплея в формате :DISPLAY при подключении к локальному узлу или одну из форм ssh://[USER@]HOST/DISPLAY при подключении к удалённому узлу. Если на узле запущен только один сеанс xpra, то номер дисплея можно не указывать.

Если при запуске сервера был указан параметр --bind-tcp, --bind-ssl --bind-udp=[HOST]:PORT, --bind-ws, --bind-wss или --bind-vsock, то к нему можно подключаться используя следующие строки: tcp://HOST:PORT[/DISPLAY], udp://HOST:PORT[/DISPLAY], ssl://HOST:PORT[/DISPLAY], ws://HOST:PORT[/DISPLAY], wss://HOST:PORT[/DISPLAY] или vsock://HOST:PORT[/DISPLAY].

Сеть и аутентификация

Xpra поддерживает разные типы сетевых подключений (tcp, ssl, ws, wss, vnc, ssh, vsock, quic и т. д.), и большинство из них можно шифровать и мультиплексировать через один порт.

Безопасность зависит от типа подключения клиента xpra (ssl, quic и ssh считаются самыми безопасными, поскольку они обеспечивают проверку хоста и шифрование в одном протоколе).

Доступ к сеансам Xpra через сокеты TCP можно защитить с помощью модулей аутентификации, но так как они не защищают само сетевое соединение от атак «человек посередине», то для защиты от таких атак можно использовать один из трёх вариантов:

  • шифрование AES
  • SSL
  • SSH

Модули аутентификации

Примечание: При использовании для подключения к серверу SSH разделы шифрование и аутентификация можно пропустить (по умолчанию сокеты, используемые ssh, не используют аутентификацию).


Модули аутентификации
Модуль Описание Примечание
allow Аутентификация всегда успешна (используется имя пользователя, предоставленное клиентом) Не безопасно и должно использоваться только для тестирования
none Аутентификация всегда успешна (используется имя пользователя, под которым работает сервер) Не безопасно и должно использоваться только для тестирования
fail Аутентификация всегда не успешна (пароль не запрашивается) Полезно для тестирования
reject Аутентификация всегда не успешна (пароль запрашивается) Полезно для тестирования
env Пароль сопоставляется с указанной переменной среды (по умолчанию XPRA_PASSWORD) --auth=env:name=SOME_OTHER_ENV_VAR_NAME
password Пароль сопоставляется с паролем, указанным с помощью опции value --auth=password:value=mysecret
file Сравнивает пароль с паролем, записанным в файле, указанным с помощью опции filename --auth=file:filename=./password.txt

Содержимое файла пароля будет рассматриваться как двоичные данные, ограничений на кодировку символов или размер файла нет. Следует остерегаться завершающих символов новой строки, которые будут включены в данные пароля (пример создания файла с паролем: echo -n "mypassword" > password.txt)

multifile Сопоставляет имя пользователя и пароль с содержимым файла аутентификации, указанным с помощью опции filename Файл аутентификации должен содержать учетные данные пользователей в формате:

username|password|uid|gid|displays|env_opts|session_opts Имя пользователя и пароль не должны содержать символ вертикальной черты (|), который используется в качестве разделителя. Этот модуль устарел, вместо него следует использовать sqlite

pam Проверяет имя пользователя и пароль с помощью системы PAM Аутентификация ОС Linux
win32 Проверяет имя пользователя и пароль с помощью win32security Аутентификация MS Windows
sys Системная аутентификация Автоматически выбирает соответствующий системный модуль аутентификации (либо pam, либо win32)
sqlite, mysql, sql Сверяет имя пользователя и пароль с файлом базы данных sqlite, указанным с помощью параметра filename (sqlite), или с базой данных, указанной с помощью параметра uri (mysql и sql) Аутентификация будет обработана с использованием следующего запроса (настраивается с помощью параметра password_query): SELECT password FROM users WHERE username=(?)

Сеансы, доступные для каждого пользователя, будут запрашиваться с помощью запроса (настраивается с помощью параметра session_query): SELECT uid, gid, displays, env_options, session_options FROM users WHERE username=(?)

exec Делегирует процедуру аутентификации внешней команде. Команда указывается с помощью атрибута command Команда должна вернуть 0, чтобы разрешить доступ, любое другое значение будет запрещать доступ
peercred Аутентификация SO_PEERCRED
hosts Проверяет хост с помощью системной библиотеки tcp-wrappers Подробнее см. в hosts.allow и hosts.deny
kerberos-password Проверяет имя пользователя и пароль с помощью проверки подлинности Kerberos Модуль не использует билеты Kerberos, и пароль будет отправлен на сервер в виде открытого текста. Следует использовать только для тестирования
kerberos-ticket Проверяет билет Kerberos, полученный клиентом
gss Проверяет билет GSS, полученный клиентом
u2f Запрашивает у клиента токен U2F
ldap Проверяет имя пользователя и пароль на сервере LDAP, используя библиотеку python-ldap
ldap3 Проверяет имя пользователя и пароль на сервере LDAP, используя библиотеку python-ldap3

Предпочтительный способ указания аутентификации — в опции сокета.

Примеры:

$ XPRA_PASSWORD=mysecret
$ xpra start --start=xterm --bind-tcp=0.0.0.0:10000,auth=env

$ SOME_OTHER_ENV_VAR_NAME=mysecret
$ xpra start --bind-tcp=0.0.0.0:10000,auth=env:name=SOME_OTHER_ENV_VAR_NAME

$ xpra start --bind-tcp=0.0.0.0:10000,auth=password:value=mysecret

$ xpra start --bind-tcp=0.0.0.0:10000,auth=file:filename=/path/to/mypasswordfile.txt

$ xpra start --bind-tcp=0.0.0.0:10000,auth=sqlite:filename=/path/to/userlist.sdb

Разные сокеты могут использовать разные модули аутентификации:

$ xpra start --start=xterm -d auth \
--bind-tcp=0.0.0.0:10000,auth=hosts,auth=file:filename=password.txt --bind \
--bind-tcp=0.0.0.0:10001,auth=sys

Имя пользователя можно указать:

  • в файлах подключения;
  • в строке подключения клиента.

Пример подключения по TCP:

$ xpra attach tcp://username:password@host:port/

Когда модуль аутентификации используется для защиты одного сеанса, многие модули полностью игнорируют имя пользователя, и его можно опустить, например:

$ xpra attach tcp://:password@host:port/

Модули kerberos-password, ldap, ldap3, sys (pam и win32), sqlite, multifile и u2f используют для аутентификации, как имя пользователя, так и пароль.

Процесс аутентификации:

  • если на сервере не настроена аутентификация, клиентское соединение должно быть принято;
  • если у клиента не настроена аутентификация, может появиться диалоговое окно запроса пароля, и соединение завершится ошибкой аутентификации, если правильное значение не будет указано;
  • если указано несколько модулей аутентификации, клиент может вызвать несколько диалогов аутентификации;
  • то, как клиент обрабатывает вызовы, отправленные сервером, можно настроить с помощью параметра challenge-handlers, порядок по умолчанию: uri (независимо от того, какой пароль может быть указан в строке подключения), файл (если использовалась опция password-file), env (если присутствует переменная окружения), kerberos, gss, keycloak, u2f, prompt.

Примечания специфичные для конкретных модулей и платформ (эта информация относится ко всем клиентам, кроме клиента HTML5):

  • каждый модуль аутентификации указывает тип хеширования пароля, который он поддерживает (обычно HMAC);
  • некоторые модули аутентификации (pam, win32, kerberos-password, ldap и ldap3) требуют отправки пароля для выполнения аутентификации на сервер — поэтому они используют слабое хеширование xor, которое небезопасно;
  • необходимо использовать шифрование, чтобы иметь возможность использовать xor-хеширование, чтобы пароль был защищен во время обмена: система откажется отправлять xor-хешированный пароль в незашифрованном виде;
  • шифрование обрабатывается перед аутентификацией;
  • при использовании сокетов TCP, аутентификация по паролю уязвима для атак «человек посередине», когда злоумышленник может перехватить первоначальный обмен и использовать украденный ответ на запрос аутентификации для доступа к сеансу. Для предупреждения этой атаки следует использовать шифрование;
  • клиент не проверяет подлинность сервера, использование шифрования позволяет это исправить;
  • включение в журнал информации об аутентификации (-d auth) может привести к утечке некоторой аутентификационной информации;
  • обеспечить безопасное соединение может транспорт SSH.

SSH

OpenSSH

К серверам, на которых запущен SSH-сервер, доступ к сеансам xpra возможен без какой-либо дополнительной настройки, например:

$ xpra attach ssh://USERNAME@HOST/DISPLAY

Аналогично можно запускать новые сессии и подключаться к ним одной командой:

$ xpra start ssh://USERNAME@HOST/ --start=xterm
Встроенный SSH-сервер

Этот режим можно использовать для создания SSH-соединений на серверах, на которых нет запущенного SSH-сервера (например, на серверах MS Windows), или для получения возможности использования SSH-аутентификации и шифрования, но без разрешения входа в систему по SSH в серверную систему (поскольку данное соединение можно использовать только для подключения к серверу xpra).

Этот режим можно использовать с сокетами TCP, которые в конечном итоге будут обновлены до SSH. Сервер также поддерживает опцию bind-ssh (такие сокеты разрешают только соединения SSH):

$ xpra start --bind-ssh=0.0.0.0:10000 --start=xterm

Подключение клиента к этому порту используя ssh:

$ xpra attach ssh://server:10000/

Закрытый ключ сервера SSH (ssh_host_<rsa/dsa/ecdsa/ed25519>_key) должен быть доступен пользователю, работающему с сервером xpra. По умолчанию при запуске сервер попытается открыть файлы ключей, находящиеся в ~/.ssh/.

Клиент SSH

Клиент может использовать как встроенный клиент ssh (на основе paramiko), так и системный инструмент.

Для настройки клиента ssh используется параметр ssh. По умолчанию установлено значение auto, при котором будет использоваться paramiko, если он присутствует, или системный инструмент, если его нет. На большинстве платформ внешним инструментом по умолчанию является команда ssh (механизм основан на openssh), а в MS Windows это putty plink.

Пример использования системного ssh-клиента:

$ xpra start --ssh=ssh ssh://user@server --start=xterm

Если дописать в файл ~/.xpra/xpra.conf строку ssh = ssh, то клиент можно не указывать:

$ xpra start ssh://user@server --start=xterm

Бэкенд paramiko встроен в код подключения клиента и обеспечивает лучшую диагностику (-d ssh), а также предоставляет графический интерфейс для подтверждения ключей хоста, ввода ключевых фраз-паролей или паролей.

Paramiko может принимать параметры конфигурации в командной строке:

  • auth — позволяет указать используемые методы аутентификации в том порядке, в котором они будут использоваться. Доступные значения: agent, key, password, none;
  • stricthostkeychecking — указывает, что ssh не должен автоматически добавлять ключи хоста в файл ~/.ssh/known_hosts и отказывается подключаться к хостам, чей ключ хоста изменился. Доступные значения: yes (по умолчанию), no.

Можно указать несколько параметров в виде строки, разделенной запятыми, например: --ssh=paramiko:auth=agent+key,stricthostkeychecking=no:

$ xpra start --ssh=paramiko:auth=agent+key ssh/user@192.168.0.99:22 -d ssh --start=xterm

Пароль можно указать в URI командной строки:

$ xpra attach ssh://USERNAME:PASSWORD@HOSTNAME/

Шифрование AES

Шифрование AES следует использовать, если есть возможность безопасно передать ключ AES каждому клиенту.

Уровень шифрования AES Xpra использует криптографическую библиотеку python для шифрования сетевых пакетов с помощью AES-256.

Ключ шифрования можно сохранить в файле или указать с помощью параметра keydata. Если не указано ни того, ни другого и используется модуль аутентификации, в качестве данных ключа будет использоваться пароль.

Пример использования шифрования с ключом, сохранённым в файле:

  1. Сгененрировать ключ:
    $ uuidgen > ./key.txt
    
  2. Передать ключ на клиентский узел
  3. Запустить сервер:
    $ xpra start --start=xterm --bind-tcp=0.0.0.0:10000,encryption=AES,encryption-keyfile=/home/user/key.txt -d crypto
    
  4. Подключение на клиенте (содержимое файла key.txt должно быть одинаковым на клиенте и сервере):
    $ xpra attach "tcp://server:10000/?encryption=AES&encryption-keyfile=key.txt"
    

Начиная с xpra версии 4.3, клиент может указать точный режим шифрования AES, например, encryption=AES-GCM.

Пример запуска сервера, когда порт 10000 использует шифрование, а порт 10001 — нет:

$ xpra start --start=xterm --bind-tcp=0.0.0.0:10000,encryption=AES,encryption-keyfile=./key.txt --bind-tcp=0.0.0.0:10001 -d crypto

В новых версиях вместо использования параметра encryption-keyfile (keyfile), для указания ключа шифрования можно использовать параметр keydata:

  • keydata=0x... — для шестнадцатеричных ключей;
  • keydata=base64:... — для ключей в кодировке base64;
  • keydata=... — для простых текстовых ключей.

Недостатком такого способа является то, что ключевые данные могут попасть в список процессов. Однако в некоторых случаях может быть проще создать команды, для запуска которых не требуются дополнительные файлы.

Пример с простым текстовым ключом в keydata:

$ xpra start --start=xterm --bind-tcp=0.0.0.0:10000,encryption=AES,keydata=0123456789ABCDEF -d crypto
$ xpra attach "tcp://server:10000/?encryption=AES&keydata=0123456789ABCDEF"

SSL

Запустить сервер с поддержкой TCP и SSL, используя существующий сертификат cert.pem (сертификат должен быть предварительно создан):

$ xpra start --start=xterm --bind-tcp=0.0.0.0:10000 --ssl-cert=/path/to/ssl-cert.pem

Подключение:

$ xpra attach ssl://server:10000/

Чтобы избежать ошибки, когда сервер использует самоподписанный сертификат можно использовать один из вариантов:

  • добавить параметр --ssl-server-verify-mode=none в строку подключения клиента:
    $ xpra attach ssl://server:10000/ --ssl-server-verify-mode=none
    
  • скопировать ключ клиенту, и использовать параметр ssl-ca-certs, чтобы указать ключ для проверки:
    $ xpra attach ssl://server:10000/ --ssl-ca-certs=cert.pem
    

Генерация самоподписанного сертификата:

$ openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem -sha256
$ cat key.pem cert.pem > ssl-cert.pem

После настройки сервера для SSL (обычно путем добавления параметра --ssl-cert) его сокеты TCP (параметр bind-tcp) могут быть автоматически обновлены до:

  • ssl;
  • http и ws (веб-сокеты) можно обновить до https и wss (защищенные веб-сокеты).

Это позволяет использовать один порт с несколькими протоколами (включая также SSH), которые могут легче проходить через некоторые брандмауэры и могут требоваться некоторыми сетевыми политиками. Клиентские сертификаты также могут использоваться для аутентификации.

TCP-сокеты

Запуск на сервере:

$ xpra start --start=kolourpaint --bind-tcp=0.0.0.0:9878

или для управления запущенной графической сессией:

$ xpra shadow --bind-tcp=0.0.0.0:9878

Подключение:

$ xpra attach ws://192.168.0.154:9878

Этот же адрес можно открыть в веб-браузере:

Xpra. Подключение из веб-браузера

Параметры подключения можно указать с помощью диалоговой формы подключения (http://host:port/connect.html) или указаны как параметры URL, например uri|http://192.168.0.154:9878/?username=user.

Создание TCP сеанса (начиная с версии 4.0.1-alt1 с защитой паролем (пароль записан в файл password):

$ xpra start --start=kolourpaint --bind-tcp=0.0.0.0:9878,auth=file:filename=./password

При подключении указать имя пользователя (и по запросу ввести пароль):

$ xpra attach ws:user//192.168.0.154:9878

Графический интерфейс

Графический интерфейс xpra («Меню запуска приложений» → «Интернет/Сеть» → «Xpra»):

Графический интерфейс Xpra

«Browse» — просмотреть список и подключиться к локальному дисплею.

Xpra. Список локальных дисплеев

«Connect» — подключиться к удалённому серверу :

Xpra. Подключение к удалённому серверу

«Shadow» — предоставить доступ к рабочему столу.

«Start» — запустить сервер xpra: Запуск сервера Xpra