Настройка платформы

Важно

Вначале необходимо произвести настройку окружения. Все команды выполняются только от суперпользователя.

Режим суперпользователя:

sudo -i

Важно

Установка производится на управляющий узел. Для работы модуля необходимо установить службу OpenStack Nova API.

Введение

Для поддержки протокола SPICE платформой TIONIX необходимо включить поддержку SPICE в Nova, установить в клиентскую систему TIONIX.VDIclient и обновить пакеты модулей TIONIX.VDIserver и TIONIX.Client. Также на всех вычислительных узлах необходимо наличие установленного TIONIX.Agent с типом spice_proxy.

Настройка поддержки протокола SPICE в OpenStack Nova

Примечание

Все действия выполняются на вычислительных узлах с запущенной службой Nova.

  1. Включите протокол SPICE. Для этого в /etc/nova/nova.conf укажите необходимые параметры:

    [spice]
    agent_enabled = True
    enabled = True
    keymap = en-us
    server_listen = 127.0.0.1
    html5proxy_host = 0.0.0.0
    html5proxy_port = 6082
    # For usb redirection
    usb_controller_type = XHCI
    

    Где:

    • agent_enabled - включает поддержку VDI-агента, который необходимо запустить внутри гостевой ОС. Он предоставляет улучшенные функции по работе input-устройств, типа мыши и улучшает поддержку мультимониторности (только для QXL-драйвера). В зависимости от операционной системы:

      • В Linux достаточно установить пакет spice-vdagent.
      • Для Windows нужно установить guest-tools из пакета virtio-win.
    • enabled - параметр, включающий протокол SPICE в процессе виртуальной машины;

    • keymap - необязательный параметр, включающий по умолчанию карту символов. Желательно всегда использовать значение en-us, ввод кириллицы корректно работает с этой настройкой;

    • server_listen - адрес прослушивания для порта SPICE в процессе виртуальной машины. Всегда должен быть установлен равным 127.0.0.1 для предотвращения появления SPICE-сессии в сети в беспарольном режиме;

    • html5proxy_host - адрес прокси-сервера Nova для SPICE. Нужен для подключения к сессии SPICE noVNC-сервисом;

    • html5proxy_port - порт прокси-сервера Nova для SPICE. Нужен для подключения к сессии SPICE noVNC-сервисом;

    • usb_controller_type - тип USB-интерфейса. Возможные значения:

      • XHCI интерфейс USB, который поддерживает USB 1.1, 2.0 и 3.0. Используется по умолчанию;
      • EHCI+UHCI интерфейсы USB, которые поддерживают USB 1.1, 2.0 и 1.1 соответственно.

      Важно

      Для корректного включения устройств перенаправления USB необходимо наличие TIONIX.Agent и включение драйвера TnxLibvirtDriver на вычислительном узле, а также указания следующих параметров в DEFAULT конфигурации Nova:

      [DEFAULT]
      ...
      compute_driver = tnx_libvirt.TnxLibvirtDriver
      
      Поддержка USB-интерфейсов различными операционными системами:
      Хостовая операционная система Гостевая операционная система XHCI EHCI+UHCI
      Linux Linux
       
      Linux Windows 7  
      Linux Windows 10
       
      Windows 7 Linux
       
      Windows 7 Windows 10
       
      Windows 10 Windows 10
       
      Windows 10 Linux
       

    Также рекомендуется явно выключить поддержку VNC-консоли:

    [vnc]
    enabled = False
    
  2. Выполните команду:

    systemctl restart openstack-nova-compute.service
    

При подключении к уже существующим виртуальным машинам необходимо выполнить жесткую перезагрузку машины, чтобы новые настройки были применены. Для новых виртуальных машин параметры SPICE уже будут указаны.

Включение шифрования в SPICE-сессиях

Примечание

Настройка производится в конфигурационном файле VDI-брокера, расположенном на контроллере.

Примечание

Для полноценной работы шифрования по протоколу SPICE требуется, чтобы серверный сертификат содержал SAN с указанием DNS вычислительных узлов.

  1. Для включения шифрования в /etc/tionix/vdi_server.yaml необходимо указать соответствующий параметр (по умолчанию - False):

    VDI_TLS_ENABLED: True
    
  2. После включения самой функции необходимо указать путь до серверного сертификата в вычислительных узлах:

    TLS_SERVER_CERT: '/etc/pki/tls/tionix/vdi.pem'
    
  3. Если CA-сертификат серверного сертификата будет отсутствовать в системном хранилище CA в вычислительных узлах, то его путь можно указать отдельным параметром:

    CA_CERT: '/etc/pki/tls/tionix/ca.crt'
    
  4. Дополнительно можно указать параметры поддомена для VDI-адресов и таймаут ответа от HAProxy (указанные значения - по умолчанию):

    VDI_HOST_SUBDOMAIN: 'vdi'
    HAPROXY_TCP_REQUEST_TIMEOUT: 30000
    
  5. Для принятия изменений перезапустите службы TIONIX:

    systemctl restart tionix-*
    

Настройка DNS

Примечание

Предполагается, что DNS-сервер уже имеется в инфраструктуре заказчика. Сами адреса DNS нужно указывать в контроллерах облачной платформы, вычислительных узлах и клиентских машинах. Главное правило: все они должны видеть одну и ту же DNS-зону.

Для полноценной работы шифрования все соединения должны использовать доменные имена. Поэтому во всех машинах, где задействуются функции VDI, должен быть указан адрес DNS-сервера с зоной для адресов вычислительных узлов в сети VDI.

Особой настройки не требуется, главное, чтобы в конфигурационном файле /etc/resolv.conf были настроены адреса DNS.

Для прокси-сервера в HAProxy DNS предоставляет ещё одну функцию: она позволяет открыть порт прокси для сервера VDI в соответствующем интерфейсе. Об этом будет сказано далее.

Установка и настройка HAProxy

Примечание

HAProxy и интерпретатор Lua устанавливаются на вычислительных узлах. Запуском сервиса HAProxy управляет TIONIX.Agent.

Установка

  1. Перед установкой новой версии HAProxy необходимо удалить старую. Проверить установлен ли HAProxy можно при помощи команды:

    rpm -qa | grep "haproxy"
    

    Для удаления старой версии HAProxy без удаления зависимостей используйте команду:

    rpm -e --nodeps haproxy-1.5.18-9.el7.x86_64
    
  2. Установите HAProxy:

    yum install --disablerepo=* --enablerepo=tionix-extras haproxy
    

Настройка

  1. Настройте конфигурационный файл /etc/haproxy/haproxy.cfg.template:

    global
        daemon
        maxconn     256
        user        root
        group       root
        chroot      /var/lib/haproxy
    
    defaults
        mode tcp
        option tcpka
        option tcplog
        timeout connect 5000ms
        timeout client 24h
        timeout server 24h
    

    Отдельно необходимо отметить про параметры в defaults:

    • option tcpka - необходим для нормального функционирования keep-alive-пакетов;
    • option tcplog - будет сохранять в журналах информацию от TCP-сессиях;
    • timeout client - таймаут для клиента. Значение в 24 часа необходимо для обхода проблемы разрыва соединений до SPICE-серверов из-за отсутствия учета активности в сессиях;
    • timeout server - таймаут для сервера. Значение в 24 часа необходимо для обхода проблемы разрыва соединений до SPICE-серверов из-за отсутствия учета активности в сессиях.
  2. Настройте постоянное HTTP-соединение на уровне операционной системы:

    /proc/sys/net/ipv4/tcp_keepalive_time
    /proc/sys/net/ipv4/tcp_keepalive_intvl
    /proc/sys/net/ipv4/tcp_keepalive_probes
    

Все остальные изменения конфигурации будут применены VDI-брокером.

Lua

Для полноценной работы скрипта, который должен проверять валидность токена сессии, необходимо обновить пакет Lua. Системный пакет трогать нельзя (из-за того, что система управления пакетами RPM используется системный Lua 5.1), поэтому был подготовлен пакет RPM с Lua версии 5.3, который устанавливается в локальный префикс приложений.

  1. Установите пакет Lua 5.3:

    yum install --disablerepo=* --enablerepo=tionix-extras lua
    
  2. Убедитесь, что при запуске приложения Lua в терминале загружается версия 5.3. Для этого выполните команду lua от суперпользователя. Пример вывода команды:

    [root@haproxy-2-0-test ~]# lua
    Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
    >
    

    Также внутри самого скрипта для HAProxy можно проверить версию интерпретатора: для этого просто выведите системную переменную _VERSION:

    print(_VERSION)
    

Скрипт верификации токена сессии

  1. Для того, чтобы HAProxy мог узнать, тот ли пользователь подключился к сессии, ему нужно указать специально подготовленный скрипт Lua. Установите RPM-пакет при помощи команды:

    yum install --disablerepo=* --enablerepo=tionix-extras tionix-haproxy-extensions
    
  2. В секцию global файла /etc/haproxy/haproxy.cfg.template укажите путь до этого скрипта, а также переменную окружения vdibroker-addr с указанием IP-адреса и порт брокера (доменные имена пока не поддерживаются):

    global
    ...
      lua-load /usr/local/share/lua/5.3/validate-token-action.lua
      setenv vdibroker-addr $BROKER_IP:9365
    

    Пример готовой конфигурации шаблона HAProxy - /etc/haproxy/haproxy.cfg.template:

    global
      daemon
      chroot /var/lib/haproxy
      user root
      group root
      maxconn 256
      lua-load /usr/local/share/lua/5.3/validate-token-action.lua
      setenv vdibroker-addr $BROKER_IP:9365
      log 127.0.0.1:514 local2
    
    defaults
      log global
      mode tcp
      option tcplog
      timeout connect 5000ms
      timeout client 24h
      timeout server 24h
      option tcpka
    

Конфигурация фронтенда HAProxy

Примечание

Конфигурация фронтенда и бэкенд генерируются автоматически средствами TIONIX.Agent. Настраивать ее вручную не нужно.

  1. После выполнения всех пунктов настроек фронтенд в HAProxy должен иметь следующий вид:

    frontend $instance_uuid
        mode tcp
        bind vdi.$cloud_hypervisor_hostname:$port ssl verify optional crt /etc/pki/tls/tionix/vdi.pem
        use_backend $instance_uuid
    

    Где адрес vdi.$cloud_hypervisor_hostname должен резолвить адрес интерфейса вычислительного узла, который находится в сети VDI. Это необходимо, чтобы фронтенд открыл порт в нужном интерфейсе.

    Описание синтаксиса указания адреса:

    • vdi - поддомен основного доменного пути;
    • $cloud_hypervisor_hostname - имя хоста гипервизора в облаке. Обычно он имеет вид cn-FFLLLL.customer_domain, где FF - это первые и LLLL - последние четыре символа строки product_uuid у вычислительного узла.
  2. В случае, если в конфигурацию необходимо добавить CA-сертификат, то в bind нужно добавить дополнительные параметры:

    bind vdi.$cloud_hypervisor_hostname:$port ... ca-file /etc/pki/tls/tionix/ca.crt
    
  3. Настройте конфигурационный файл бэкенда, он должен включать в себя адрес конечного сервера и скрипт валидации принятого токена:

    backend $instance_uuid
        mode tcp
        tcp-request inspect-delay 30s
        tcp-request content lua.validate_token_action
        tcp-request content accept if { var(req.allow) -m bool }
        tcp-request content reject
        server $instance_uuid 127.0.0.1:$port
    

    Адрес сервера SPICE всегда должен быть равен адресу 127.0.0.1, как и в конфигурации Nova, шифрование данных между бэкендом и самим сервером SPICE включать не требуется.

Требования к сертификатам TLS для протокола SPICE

При подключении к SPICE-серверу по протоколу TLS, клиент SPICE по умолчанию и в обязательном порядке верифицирует получаемый при соединении сертификат на инициалиацию канала шифрования. В частности:

  • клиент SPICE проверяет, что сертификат был выдан корректным центром сертификации, который имеется в ОС, откуда производится подключение;
  • сертификат должен содержать SAN или Subject Alternative Names, в котором указывается список доменных адресов подключения;
  • клиент проверяет в строгом соответствии, то есть имя домена должно быть явно указано в SAN сертификата. Wildcard-сертификаты в SAN не поддерживается.

Так же нужно учитывать то, что брокер настраивает доступ до SPICE-сессии через отдельный интерфейс и с использованием сети, отличной от управляющей или вычислительной сети. Для адресов в этой сети брокер добавляет поддомен "vdi", который требуется добавить в зону DNS. То есть если в управляющей сети у вычислительного узла будет имя compute1.tionix.loc, то брокер для подключения клиенту будет предлагать адрес vdi.compute1.tionix.loc.

Отсюда вытекают следующие требования к сертификатам:

  1. Обязательным требованием по шифрованию является наличие зоны DNS для вычислительных узлов (как часть корпоративного DNS или внутреннего сервиса) и в частности в эту зону должны быть включены имена для сети VDI. Этот DNS должен быть доступен как для вычислительных узлов, так и для клиентов.
  2. В промышленной среде всегда используйте сертификаты из аккредитованных центров сертификации. Это может быть как внутренний PKI, так и внешние службы CA типа Let's Encrypt. Иными словами, в ОС клиентов сертификат CA должен быть зарегистрирован в хранилище CA.
  3. Так как клиент строго проверяет соответствие имени домена для сети VDI и SAN, то лучше всего для каждого вычислительного узла сгенерировать свой личный сертификат с SAN с явным указанием его доменного имени в сети VDI в теле сертификата.
  4. Этот сертификат вместе с ключом в виде отдельного файла должен быть добавлен в службу прокси для возможности инициирования канала шифрования, а путь до сертификата должен быть указан в параметрах брокера.

Пример настройки SAN в теле сертификата для вычислительного узла с доменным именем compute1.tionix.loc в управляемой сети:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            fc:74:bd:31:c1:a7:74:82:28:d3:60:04:60:85:5c:c5
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=compute1
        Validity
            Not Before: Apr  8 15:09:06 2021 GMT
            Not After : Jul 12 15:09:06 2023 GMT
        Subject: CN=vdi-compute1-tionix-loc
...
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Subject Key Identifier:
                2C:7A:57:55:BA:F3:F0:EF:43:89:E7:34:6B:E5:1A:FB:44:A7:C0:07
            X509v3 Authority Key Identifier:
                keyid:8C:5B:ED:71:58:F1:56:C4:EA:DF:32:6C:59:DC:B1:7D:C0:4C:13:FB
                DirName:/CN=compute1
                serial:99:4C:F4:09:2F:53:00:33

            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:vdi.compute1.tionix.loc

Примечание

В DNS:vdi.compute1.tionix.loc - указан адрес вычислительного узла в сети VDI.